在Matlab中对双立方插值的解释?

时间:2014-05-25 21:30:39

标签: algorithm matlab interpolation bicubic

我对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结果不匹配。我想知道我哪里出错了。

谢谢!

3 个答案:

答案 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