双三次插值及三次卷积算法

双三次插值算法:
在数学上,双三次插值是三次插值在二维规则网格上插值数据点的推广。所述插值曲面比用双线性插值或最近邻插值得到的相应曲面平滑.双三次插值可以用拉格朗日多项式、三次样条或三次卷积算法来完成。

在图像处理中,当速度不是问题时,在图像重采样中,双三次插值往往选择双线性或最近邻插值。与双线性插值(只考虑4个像素(2×2)相比,双三次插值考虑16个像素(4×4)。用双三次插值重放的图像更平滑,具有较少的插值伪影。

假设函数的值 f f 及其偏导 f x f_x , f y f_y f x y f_{xy} 在单位方形的四个角 ( 0 , 0 ) (0,0) , ( 1 , 0 ) (1,0) , ( 0 , 1 ) (0,1) ( 1 , 1 ) (1,1) 是已知的,所以插值表面可以被写如下:
p ( x , y ) = i = 0 i = 3 i = 0 i = 3 a i j x i y j p(x,y)=\sum_{i=0}^{i=3}\sum_{i=0}^{i=3} a_{ij}x^iy^j
插值问题由确定16个系数 a i j a_{ij} 构成,匹配 p ( x , y ) p(x,y) 和函数值产生四个公式如下:

f ( 0 , 0 ) = p ( 0 , 0 ) = a 00 , f(0,0)=p(0,0)=a_{00},
f ( 1 , 0 ) = p ( 1 , 0 ) = a 00 + a 10 + a 20 + a 30 , f(1,0)=p(1,0)=a_{00}+a_{10}+a_{20}+a_{30},
f ( 0 , 1 ) = p ( 0 , 0 ) = a 00 + a 01 + a 02 + a 03 , f(0,1)=p(0,0)=a_{00}+a_{01}+a_{02}+a_{03},
f ( 1 , 1 ) = p ( 1 , 1 ) = i = 0 3 i = 0 3 a i j . f(1,1)=p(1,1)=\sum_{i=0}^{3}\sum_{i=0}^{3} a_{ij}.

同样的在 x x y y 的8个偏导公式可以得到:

f x ( 0 , 0 ) = p x ( 0 , 0 ) = a 10 , f_x(0,0)=p_x(0,0)=a_{10},
f x ( 1 , 0 ) = p x ( 1 , 0 ) = a 10 + 2 a 20 + 3 a 30 , f_x(1,0)=p_x(1,0)=a_{10}+2a_{20}+3a_{30},
f x ( 0 , 1 ) = p x ( 0 , 1 ) = a 10 + a 11 + a 12 + a 13 , f_x(0,1)=p_x(0,1)=a_{10}+a_{11}+a_{12}+a_{13},
f x ( 1 , 1 ) = p x ( 1 , 1 ) = i = 0 3 i = 0 3 a i j i . f_x(1,1)=p_x(1,1)=\sum_{i=0}^{3}\sum_{i=0}^{3} a_{ij}i.
f y ( 0 , 0 ) = p y ( 0 , 0 ) = a 01 , f_y(0,0)=p_y(0,0)=a_{01},
f y ( 1 , 0 ) = p y ( 1 , 0 ) = a 01 + a 11 + a 21 + a 31 , f_y(1,0)=p_y(1,0)=a_{01}+a_{11}+a_{21}+a_{31},
f y ( 0 , 1 ) = p y ( 0 , 1 ) = a 01 + 2 a 02 + 3 a 03 , f_y(0,1)=p_y(0,1)=a_{01}+2a_{02}+3a_{03},
f y ( 1 , 1 ) = p y ( 1 , 1 ) = i = 0 3 i = 0 3 a i j j . f_y(1,1)=p_y(1,1)=\sum_{i=0}^{3}\sum_{i=0}^{3} a_{ij}j.

和有关 x y xy 混合偏导的四个公式:

f x y ( 0 , 0 ) = p x y ( 0 , 0 ) = a 11 , f_{xy}(0,0)=p_{xy}(0,0)=a_{11},
f x y ( 1 , 0 ) = p x y ( 1 , 0 ) = a 11 + 2 a 21 + 3 a 31 , f_{xy}(1,0)=p_{xy}(1,0)=a_{11}+2a_{21}+3a_{31},
f x y ( 0 , 1 ) = p x y ( 0 , 1 ) = a 11 + 2 a 12 + 3 a 13 , f_{xy}(0,1)=p_{xy}(0,1)=a_{11}+2a_{12}+3a_{13},
f x y ( 1 , 1 ) = p x y ( 1 , 1 ) = i = 0 3 i = 0 3 a i j i j . f_xy(1,1)=p_xy(1,1)=\sum_{i=0}^{3}\sum_{i=0}^{3} a_{ij}ij.

上面表达式可用下列公式表示:

p x ( x , y ) = i = 1 3 j = 0 3 a i j i x i 1 y j p_x(x,y)=\sum_{i=1}^3\sum_{j=0}^3a_{ij}ix^{i-1}y^j
p y ( x , y ) = i = 0 3 j = 1 3 a i j x i j y j 1 p_y(x,y)=\sum_{i=0}^3\sum_{j=1}^3a_{ij}x^{i}jy^{j-1}
p x y ( x , y ) = i = 1 3 j = 1 3 a i j i x i 1 j y j 1 p_{xy}(x,y)=\sum_{i=1}^3\sum_{j=1}^3a_{ij}ix^{i-1}jy^{j-1}

这个过程产生了一个拟合面 p ( x , y ) p(x,y) 在单位方形 [ 0 , 1 ] × [ 0 , 1 ] [0,1]\times[0,1] ,该方形连续可导,然后,在任意大小的规则网格上进行双三次插值,通过将这样的双三次曲面拼接在一起,确保导数在边界上匹配。

将未知参数 a i j a_{ij} 以向量的形式组合起来:

α = [ a 00 a 10 a 20 a 30 a 01 a 11 a 21 a 31 a 02 a 12 a 22 a 32 a 03 a 13 a 23 a 33 ] T \alpha= \begin{bmatrix} a_{00} & a_{10} & a_{20} &a_{30} &a_{01} &a_{11} &a_{21}& a_{31} &a_{02} &a_{12} &a_{22} &a_{32}& a_{03}& a_{13}& a_{23} &a_{33} \end{bmatrix}^T

并且令:

x = [ x=[      f ( 0 , 0 ) f(0,0)      f ( 1 , 0 ) f(1,0)      f ( 0 , 1 ) f(0,1)      f ( 1 , 1 ) f(1,1)      f x ( 0 , 0 ) f_x(0,0)      f x ( 1 , 0 ) f_x(1,0)      f x ( 0 , 1 ) f_x(0,1)      f x ( 1 , 1 ) f_x(1,1)      f y ( 0 , 0 ) f_y(0,0)      f y ( 1 , 0 ) f_y(1,0)      f y ( 0 , 1 ) f_y(0,1)      f y ( 1 , 1 ) ) f_y(1,1))      f x y ( 0 , 0 ) f_xy(0,0)      f x y ( 1 , 0 ) f_xy(1,0)      f x y ( 0 , 1 ) f_xy(0,1)      f x y ( 1 , 1 ) ] f_xy(1,1)]

将上述公式重构为一个矩阵的线性方程组 A α = x A\alpha=x
反转这个方程给出一个更有用的线性方程 A 1 X = α A^{-1}X=\alpha ,其中:

A 1 = [ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 0 0 2 1 0 0 0 0 0 0 0 0 0 0 2 2 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 3 3 0 0 2 1 0 0 0 0 0 0 0 0 0 0 2 2 0 0 1 1 0 0 3 0 3 0 0 0 0 0 2 0 1 0 0 0 0 0 0 0 0 0 3 0 3 0 0 0 0 0 2 0 1 0 9 9 9 9 6 3 3 3 6 6 3 3 4 2 2 1 6 6 6 6 3 3 3 3 4 4 2 2 2 2 1 1 2 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 0 0 0 0 1 0 1 0 6 6 6 6 4 2 4 2 3 3 3 3 2 1 2 1 4 4 4 4 2 2 2 2 2 2 2 2 1 1 1 1 ] A^{-1}=\begin{bmatrix} 1&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0\\ 0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0\\ -3&3&0&0&-2&-1&0&0&0&0&0&0&0&0&0&0\\ 2&-2&0&0&1&1&0&0&0&0&0&0&0&0&0&0\\ 0&0&0&0&0&0&0&0&1&0&0&0&0&0&0&0\\ 0&0&0&0&0&0&0&0&0&0&0&0&1&0&0&0\\ 0&0&0&0&0&0&0&0&-3&3&0&0&-2&-1&0&0\\ 0&0&0&0&0&0&0&0&2&-2&0&0&1&1&0&0\\ -3&0&3&0&0&0&0&0&-2&0&-1&0&0&0&0&0\\ 0&0&0&0&-3&0&3&0&0&0&0&0&-2&0&-1&0\\ 9&-9&-9&9&6&3&-3&3&6&-6&3&-3&4&2&2&1\\ -6&6&6&-6&-3&-3&3&3&-4&4&-2&2&-2&-2&-1&-1\\ 2&0&-2&0&0&0&0&0&1&0&0&0&0&0&0&0\\ 0&0&0&0&2&0&-2&0&0&0&0&0&1&0&1&0\\ -6&6&6&-6&-4&-2&4&2&-3&3&-3&3&-2&-1&-2&-1\\ 4&-4&-4&4&2&2&-2&-2&2&-2&2&-2&1&1&1&1\\ \end{bmatrix}

这样可以令 α \alpha 被快速简单的计算,这儿有另一个关于16个系数更具体的矩阵形式:

[ f ( 0 , 0 ) f ( 0 , 1 ) f y ( 0 , 0 ) f y ( 0 , 1 ) f ( 1 , 0 ) f ( 1 , 1 ) f y ( 1 , 0 ) f y ( 1 , 1 ) f x ( 0 , 0 ) f x ( 0 , 1 ) f x y ( 0 , 0 ) f x y ( 0 , 1 ) f x ( 1 , 0 ) f x ( 1 , 1 ) f x y ( 1 , 0 ) f x y ( 1 , 1 ) ] = [ 1 0 0 0 1 1 1 1 0 1 0 0 0 1 2 3 ] [ a 00 a 01 a 02 a 03 a 10 a 11 a 12 a 13 a 20 a 21 a 22 a 23 a 30 a 31 a 32 a 33 ] [ 1 1 0 0 0 1 1 1 0 1 0 2 0 1 0 3 ] \begin{bmatrix} f(0,0)&f(0,1)&f_y(0,0)&f_y(0,1)\\ f(1,0)&f(1,1)&f_y(1,0)&f_y(1,1)\\ f_x(0,0)&f_x(0,1)&f_{xy}(0,0)&f_{xy}(0,1)\\ f_x(1,0)&f_x(1,1)&f_{xy}(1,0)&f_{xy}(1,1) \end{bmatrix}=\begin{bmatrix} 1&0&0&0\\ 1&1&1&1\\ 0&1&0&0\\ 0&1&2&3 \end{bmatrix}\begin{bmatrix} a_{00}&a_{01}&a_{02}&a_{03}\\ a_{10}&a_{11}&a_{12}&a_{13}\\ a_{20}&a_{21}&a_{22}&a_{23}\\ a_{30}&a_{31}&a_{32}&a_{33} \end{bmatrix}\begin{bmatrix} 1&1&0&0\\ 0&1&1&1\\ 0&1&0&2\\ 0&1&0&3 \end{bmatrix}

或者

[ a 00 a 01 a 02 a 03 a 10 a 11 a 12 a 13 a 20 a 21 a 22 a 23 a 30 a 31 a 32 a 33 ] = [ 1 0 0 0 0 0 1 0 3 3 2 1 2 2 1 1 ] [ f ( 0 , 0 ) f ( 0 , 1 ) f y ( 0 , 0 ) f y ( 0 , 1 ) f ( 1 , 0 ) f ( 1 , 1 ) f y ( 1 , 0 ) f y ( 1 , 1 ) f x ( 0 , 0 ) f x ( 0 , 1 ) f x y ( 0 , 0 ) f x y ( 0 , 1 ) f x ( 1 , 0 ) f x ( 1 , 1 ) f x y ( 1 , 0 ) f x y ( 1 , 1 ) ] [ 1 0 3 2 0 0 3 2 0 1 2 1 0 0 1 1 ] \begin{bmatrix} a_{00}&a_{01}&a_{02}&a_{03}\\ a_{10}&a_{11}&a_{12}&a_{13}\\ a_{20}&a_{21}&a_{22}&a_{23}\\ a_{30}&a_{31}&a_{32}&a_{33} \end{bmatrix}=\begin{bmatrix} 1&0&0&0\\ 0&0&1&0\\ -3&3&-2&1\\ 2&-2&1&1 \end{bmatrix}\begin{bmatrix} f(0,0)&f(0,1)&f_y(0,0)&f_y(0,1)\\ f(1,0)&f(1,1)&f_y(1,0)&f_y(1,1)\\ f_x(0,0)&f_x(0,1)&f_{xy}(0,0)&f_{xy}(0,1)\\ f_x(1,0)&f_x(1,1)&f_{xy}(1,0)&f_{xy}(1,1) \end{bmatrix}\begin{bmatrix} 1&0&-3&2\\ 0&0&3&-2\\ 0&1&-2&1\\ 0&0&-1&1 \end{bmatrix}

其中

p ( x , y ) = [ 1 x x 2 x 3 ] [ a 00 a 01 a 02 a 03 a 10 a 11 a 12 a 13 a 20 a 21 a 22 a 23 a 30 a 31 a 32 a 33 ] [ 1 y y 2 y 3 ] p(x,y)=\begin{bmatrix} 1&x&x^{2}&x^{3} \end{bmatrix}\begin{bmatrix} a_{00}&a_{01}&a_{02}&a_{03}\\ a_{10}&a_{11}&a_{12}&a_{13}\\ a_{20}&a_{21}&a_{22}&a_{23}\\ a_{30}&a_{31}&a_{32}&a_{33} \end{bmatrix}\begin{bmatrix} 1\\y\\y^{2}\\y^{3} \end{bmatrix}

双三次卷积算法:
双三次样条插值要求对每个网格单元进行上述线性系统的求解。通过在两个维度中应用具有以下核的卷积,可以得到具有类似性质的内插器:
W ( x ) = { ( a + 2 ) x 3 ( a + 3 ) x 2 f o r x 1 , a x 3 5 a a 2 + 8 a x 4 a f o r 1 x 2 , 0 o t h e r w i s e . W(x)=\begin{cases} (a+2)|x|^3-(a+3)|x|^2 &for |x|\leq1,\\ a|x|^3-5a|a|^2+8a|x|-4a &for 1\leq|x|\leq2,\\ 0 &otherwise.\\ \end{cases}
其中 α \alpha 通常被设置在-0.5或者-0.75。注意 W ( 0 ) = 1 W(0)=1 和对于任何的非零整数 W ( n ) = 0 W(n)=0 。这种方法是由Keys提出的,其展示了当 α = 0.5 \alpha=-0.5 时,相对于原始函数的采样间隔将会有收敛于三阶。
如果我们使用矩阵形式对于常见的例子 α = 0.5 \alpha=-0.5 ,我们可以表示等式以一种更友好的方式:
p ( t ) = 1 2 [ 1 t t 2 t 3 ] [ 0 2 0 0 1 0 1 0 2 5 4 1 1 3 3 1 ] [ f 1 f 0 f 1 f 2 ] p(t)=\frac{1}{2} \begin{bmatrix} 1&t&t^2&t^3 \end{bmatrix} \begin{bmatrix} 0&2&0&0\\ -1&0&1&0\\ 2&-5&4&-1\\ -1&3&-3&1 \end{bmatrix} \begin{bmatrix} f_{-1}\\f_0\\f_1\\f_2 \end{bmatrix}
其中 t t 是在0到1之间,维度为1,。注意一维的三次卷积插值仅有4个采样点被需要。为了确保两个采样点在它的左边,两个采样点在它的右边。这些点的索引在本文中是从-1到2的。从索引为0的点到查询点的距离在这里用 t t 来申明。对于二维,首先在 x x 方向上应用一次,其次在 y y 方向应用一次。

b 1 = p ( t x , f ( 1 , 1 ) , f ( 0 , 1 ) , f ( 1 , 1 ) , f ( 2 , 1 ) ) , b_{-1}=p(t_x,f(-1,-1),f(0,-1),f(1,-1),f(2,-1)),
b 0 = p ( t x , f ( 1 , 0 ) , f ( 0 , 0 ) , f ( 1 , 0 ) , f ( 2 , 0 ) ) , b_{0}=p(t_x,f(-1,0),f(0,0),f(1,0),f(2,0)),
b 1 = p ( t x , f ( 1 , 1 ) , f ( 0 , 1 ) , f ( 1 , 1 ) , f ( 2 , 1 ) ) , b_{1}=p(t_x,f(-1,1),f(0,1),f(1,1),f(2,1)),
b 2 = p ( t x , f ( 1 , 2 ) , f ( 0 , 2 ) , f ( 1 , 2 ) , f ( 2 , 2 ) ) , b_{2}=p(t_x,f(-1,2),f(0,2),f(1,2),f(2,2)),
p ( x , y ) = p ( t y , b 1 , b 0 , b 1 , b 2 ) . p(x,y)=p(ty,b_{-1},b_0,b_1,b_2).

转载自:https://en.wikipedia.org/wiki/Bicubic_interpolation

猜你喜欢

转载自blog.csdn.net/baidu_38172402/article/details/88948702