4

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

谢谢!

4

3 回答 3

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
于 2014-05-26T20:56:37.280 回答
2

我发现这个主题不调整大小 - 试图理解双三次插值可以解决你的困惑,特别是对于有 7 个赞的评论。顺便说一句,在该评论中,作者指出 Matlab 中的 alpha = -0.5,这与我的经验相反。我写了 2 个函数来测试,我发现 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 示例的输出矩阵中的第一个数字。

于 2016-10-09T21:59:03.890 回答
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
于 2017-06-14T07:54:35.340 回答