我对Matlab在http://www.mathworks.com/help/vision/ug/interpolation-methods.html#f13689上的双三次插值示例感到困惑
我想我理解他们的双线性例子。似乎他们取了两边相邻转换值的平均值。因此,为了得到第一行第一列中的0.5,取0和1的平均值。
对于他们的双三次插值例子,我对他们的方法相当困惑。他们说他们取"两边两个翻译值的加权平均值"。
在他们的例子中,他们有
1 2 3
4 5 6
7 8 9
,在双三次插值的第一步中,他们对矩阵加零并向右平移0.5像素,得到以下结果:
0 0 0 1 1 2 2 3 3 0 0 0 0
0 0 0 4 4 5 5 6 6 0 0 0 0
0 0 0 7 7 8 8 9 9 0 0 0 0
然后,使用加权平均,他们得到
0.375 1.500 3.000 1.625
1.875 4.875 6.375 3.125
3.375 8.250 9.750 4.625
然而,我不确定他们是如何得到这些数字的。不是第一行第一列的0.375,而是(1 * 3/8 + 2 * 1/8)= 5/8。这是因为格式似乎是
0 _ 0 1 1 _ 2
3d d d 3d
其中d为距离
所以要取转换值的加权平均值,我们可以注意到,我们可以先做(3d + d + d + 3d) = 1,所以d = 1/8。这意味着我们应该把3/8的权重放在每个较近的平移值上,把1/8的权重放在每个较远的平移值上。结果是(0 * 1/8 + 0 * 3/8 + 1 * 3/8 + 2 * 1/8)= 5/8,与3/8的结果不匹配。我想知道我哪里出错了。
谢谢!
双三次插值使用负权重(这有时会导致过滤时超调)。
在这个例子中,使用的权重是:
-1/8 5/8 5/8 -1/8
这些权重之和为1,但中间样本的权重较大,外部样本的权重较小(负)。
使用这些权重我们得到观察值,例如
0.375 = 5/8*1 -1/8*2
1.5 = 5/8*1+5/8*2 -1/8*3
我发现这个主题imresize -试图理解双三次插值可以解决你的困惑,特别是对于7个赞的评论。顺便说一下,在那个评论中,作者指出Matlab中的alpha = -0.5,这与我的经验相反。我写了两个函数来测试,我计算出Matlab集alpha = -0.9。
下面是我可以提供的代码:
立方:
function f = cubic(x)
a = -0.9;
absx = abs(x);
absx2 = absx.^2;
absx3 = absx.^3;
f = ((a+2)*absx3 - (a+3)*absx2 + 1) .* (absx <= 1) + ...
(a*absx3 -5*a*absx2 + 8*a*absx - 4*a) .* ((1 < absx) & (absx <= 2));
end
双三次插值:
function f = intpolcub(x1,x2,x3,x4,d)
f = x1*cubic(-d-1) + x2*cubic(-d) + x3*cubic(-d+1) + x4*cubic(-d+2);
end
可以用下面的代码行进行测试:
intpolcub(0,0,1,2,0.5)
这再现了您上面提到的关于双三次插值的Matlab示例的输出矩阵中的第一个数字。
Matlab (R2017a)与a=-1
一起工作:
function f_c = cubic(x)
a = -1;
absx = abs(x);
absx2 = absx.^2;
absx3 = absx.^3;
f_c = ((a+2)*absx3 - (a+3)*absx2 + 1) .* (absx <= 1) + ...
(a*absx3 -5*a*absx2 + 8*a*absx - 4*a) .* ((1 < absx) & (absx <= 2));
end
对于双三次插值:
function f_bc = intpolcub(x1,x2,x3,x4,d)
f_bc = x1*cubic(-d-1) + x2*cubic(-d) + x3*cubic(-d+1) + x4*cubic(-d+2);
end
测试:intpolcub(0,0,1,2,0.5)
显式地:
f_bc = 0*cubic(-0.5-1)+0*cubic(-0.5)+1*cubic(-0.5+1)+2*cubic(-0.5+2) = 1*cubic(0.5)+2*(cubic(1.5);
现在0.5 (f_c<1)
和1.5 (1<f_c<=2)
的立方计算为:
cubic(0.5) = (-1+2)*0.5^3-(-1+3)*0.5^2+1 = 5/8
cubic(1.5) = (-1)*1.5^3-5*(-1)*1.5^2+8*(-1)*1.5-4*(-1) = -1/8
则f_bc
为:
f_bc = 5/8+2*(-1/8) = 0.375