双三次插值算法:
在数学上,双三次插值是三次插值在二维规则网格上插值数据点的推广。所述插值曲面比用双线性插值或最近邻插值得到的相应曲面平滑.双三次插值可以用拉格朗日多项式、三次样条或三次卷积算法来完成。
在图像处理中,当速度不是问题时,在图像重采样中,双三次插值往往选择双线性或最近邻插值。与双线性插值(只考虑4个像素(2×2)相比,双三次插值考虑16个像素(4×4)。用双三次插值重放的图像更平滑,具有较少的插值伪影。
假设函数的值
f及其偏导
fx,
fy 和
fxy在单位方形的四个角
(0,0) ,
(1,0),
(0,1)和
(1,1)是已知的,所以插值表面可以被写如下:
p(x,y)=i=0∑i=3i=0∑i=3aijxiyj插值问题由确定16个系数
aij构成,匹配
p(x,y)和函数值产生四个公式如下:
f(0,0)=p(0,0)=a00,
f(1,0)=p(1,0)=a00+a10+a20+a30,
f(0,1)=p(0,0)=a00+a01+a02+a03,
f(1,1)=p(1,1)=∑i=03∑i=03aij.
同样的在
x和
y的8个偏导公式可以得到:
fx(0,0)=px(0,0)=a10,
fx(1,0)=px(1,0)=a10+2a20+3a30,
fx(0,1)=px(0,1)=a10+a11+a12+a13,
fx(1,1)=px(1,1)=∑i=03∑i=03aiji.
fy(0,0)=py(0,0)=a01,
fy(1,0)=py(1,0)=a01+a11+a21+a31,
fy(0,1)=py(0,1)=a01+2a02+3a03,
fy(1,1)=py(1,1)=∑i=03∑i=03aijj.
和有关
xy混合偏导的四个公式:
fxy(0,0)=pxy(0,0)=a11,
fxy(1,0)=pxy(1,0)=a11+2a21+3a31,
fxy(0,1)=pxy(0,1)=a11+2a12+3a13,
fxy(1,1)=pxy(1,1)=∑i=03∑i=03aijij.
上面表达式可用下列公式表示:
px(x,y)=∑i=13∑j=03aijixi−1yj
py(x,y)=∑i=03∑j=13aijxijyj−1
pxy(x,y)=∑i=13∑j=13aijixi−1jyj−1
这个过程产生了一个拟合面
p(x,y)在单位方形
[0,1]×[0,1],该方形连续可导,然后,在任意大小的规则网格上进行双三次插值,通过将这样的双三次曲面拼接在一起,确保导数在边界上匹配。
将未知参数
aij以向量的形式组合起来:
α=[a00a10a20a30a01a11a21a31a02a12a22a32a03a13a23a33]T
并且令:
x=[
f(0,0)
f(1,0)
f(0,1)
f(1,1)
fx(0,0)
fx(1,0)
fx(0,1)
fx(1,1)
fy(0,0)
fy(1,0)
fy(0,1)
fy(1,1))
fxy(0,0)
fxy(1,0)
fxy(0,1)
fxy(1,1)]
将上述公式重构为一个矩阵的线性方程组
Aα=x。
反转这个方程给出一个更有用的线性方程
A−1X=α,其中:
A−1=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡10−320000−309−620−64003−2000000−96006−40000000030−96−206−400000000009−600−6400−2100000−36−302−4200−110000003−300−220000000003−330−24−2000000000033002−2000010−32−206−410−320000003−200−64003−200000000−103−200−320000000000−32003−2000001−210−24−201−21000000−11002−200−11000000000−12−101−2100000000001−100−11⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
这样可以令
α被快速简单的计算,这儿有另一个关于16个系数更具体的矩阵形式:
⎣⎢⎢⎡f(0,0)f(1,0)fx(0,0)fx(1,0)f(0,1)f(1,1)fx(0,1)fx(1,1)fy(0,0)fy(1,0)fxy(0,0)fxy(1,0)fy(0,1)fy(1,1)fxy(0,1)fxy(1,1)⎦⎥⎥⎤=⎣⎢⎢⎡1100011101020103⎦⎥⎥⎤⎣⎢⎢⎡a00a10a20a30a01a11a21a31a02a12a22a32a03a13a23a33⎦⎥⎥⎤⎣⎢⎢⎡1000111101000123⎦⎥⎥⎤
或者
⎣⎢⎢⎡a00a10a20a30a01a11a21a31a02a12a22a32a03a13a23a33⎦⎥⎥⎤=⎣⎢⎢⎡10−32003−201−210011⎦⎥⎥⎤⎣⎢⎢⎡f(0,0)f(1,0)fx(0,0)fx(1,0)f(0,1)f(1,1)fx(0,1)fx(1,1)fy(0,0)fy(1,0)fxy(0,0)fxy(1,0)fy(0,1)fy(1,1)fxy(0,1)fxy(1,1)⎦⎥⎥⎤⎣⎢⎢⎡10000010−33−2−12−211⎦⎥⎥⎤
其中
p(x,y)=[1xx2x3]⎣⎢⎢⎡a00a10a20a30a01a11a21a31a02a12a22a32a03a13a23a33⎦⎥⎥⎤⎣⎢⎢⎡1yy2y3⎦⎥⎥⎤
双三次卷积算法:
双三次样条插值要求对每个网格单元进行上述线性系统的求解。通过在两个维度中应用具有以下核的卷积,可以得到具有类似性质的内插器:
W(x)=⎩⎪⎨⎪⎧(a+2)∣x∣3−(a+3)∣x∣2a∣x∣3−5a∣a∣2+8a∣x∣−4a0for∣x∣≤1,for1≤∣x∣≤2,otherwise.
其中
α通常被设置在-0.5或者-0.75。注意
W(0)=1和对于任何的非零整数
W(n)=0。这种方法是由Keys提出的,其展示了当
α=−0.5时,相对于原始函数的采样间隔将会有收敛于三阶。
如果我们使用矩阵形式对于常见的例子
α=−0.5,我们可以表示等式以一种更友好的方式:
p(t)=21[1tt2t3]⎣⎢⎢⎡0−12−120−53014−300−11⎦⎥⎥⎤⎣⎢⎢⎡f−1f0f1f2⎦⎥⎥⎤
其中
t是在0到1之间,维度为1,。注意一维的三次卷积插值仅有4个采样点被需要。为了确保两个采样点在它的左边,两个采样点在它的右边。这些点的索引在本文中是从-1到2的。从索引为0的点到查询点的距离在这里用
t来申明。对于二维,首先在
x方向上应用一次,其次在
y方向应用一次。
b−1=p(tx,f(−1,−1),f(0,−1),f(1,−1),f(2,−1)),
b0=p(tx,f(−1,0),f(0,0),f(1,0),f(2,0)),
b1=p(tx,f(−1,1),f(0,1),f(1,1),f(2,1)),
b2=p(tx,f(−1,2),f(0,2),f(1,2),f(2,2)),
p(x,y)=p(ty,b−1,b0,b1,b2).
转载自:https://en.wikipedia.org/wiki/Bicubic_interpolation