我对Matlab关于http://www.mathworks.com/help/vision/ug/interpolation-methods.html#f13689
的双立方插值的例子感到困惑我想我理解他们的双线性例子。看起来他们采取了两边相邻翻译值的平均值。因此,为了获得第一列中的0.5,第一列,取0和1的平均值。
对于他们的Bicubic插值示例,我对他们的方法感到困惑。他们说他们采取“两边翻译价值的加权平均值”。
在他们的例子中,他们有
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结果不匹配。我想知道我哪里出错了。
谢谢!
答案 0 :(得分:2)
双立方插值使用负权重(这有时会在过滤时导致过冲)。
在此示例中,使用的权重为:
-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
答案 1 :(得分:1)
我发现这个话题imresize - trying to understand the bicubic interpolation可以解决你的困惑,尤其是对7个赞成票的评论。顺便说一下,在那篇评论中,作者在Matlab中声明alpha = -0.5,这与我的经验形成鲜明对比。我写了2个函数来测试,我想出了Matlab set alpha = -0.9。
以下是我可以提供的代码:
Cubic:
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示例输出矩阵中关于上面提到的双三次插值的第一个数字。
答案 2 :(得分:0)
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