4

http://www.mathworks.com/help/vision/ug/interpolation-methods.html#f13689のバイキュービック補間に関するMatlabの例に混乱しています

私は彼らのバイリニアの例を理解していると思います。どちらかの側で隣接する変換された値の平均を取ったようです。したがって、最初の行、最初の列で 0.5 を取得するために、0 と 1 の平均が取られました。

バイキュービック補間の例では、私は彼らの方法にかなり混乱しています。彼らは、「両側の 2 つの翻訳値の加重平均」を取ると言っています。

彼らの例では、

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 に答える
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)との 3 次の計算は次の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 に答える