以下に示す8 * 8行列(画像)でバイキュービック補間を実行しようとしています。
A = 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 10 20 30 40 50 60 70 80 90 100 110 120 130 140
次のmatlabコードを使用して、出力を取得しました
interp2(A,"bicubic")
しかし、グーグルした後でも取得できません手動で行う方法。誰かがこの例を使用してアイデアを得るのを手伝ってくれますか(数ピクセルのみ)?
回答
ここはかなり良い説明です。
まず、3次補間の1Dの場合(説明が簡単なため)を検討してから、2Dの場合に進みます。
3次補間の基本的な考え方は、任意の2点間の値を3次関数$ f(x)$として、一次導関数$ f “(x)$で推定することです。
$$ f(x)= ax ^ 3 + bx ^ 2 + cx + d $$ $$ f “(x)= 3ax ^ 2 + 2bx + c $$
したがって、左側と右側の隣接する3次スプラインに接続すると、補間された関数(「ゼロ次導関数」)とその1次導関数は連続します。つまり、あるスプラインの左側の境界では、0次導関数と1次導関数はすぐ左に隣接するスプラインの右境界の境界と同じです。
一般性を失うことなく、$ x = 0 $と$ x = 1 $の間を補間していると想定できます。 。左右の境界で、
$$ f(0)= d $$ $$ f(1)= a + b + c + d $$ $$ f “(0)であることがわかります。 = c $$ $$ f “(1)= 3a + 2b + c $$
多項式係数の解法
$$ a = 2f(0)-2f(1 )+ f “(0)+ f”(1)$$ $$ b = -3f(0)+ 3f(1)-2f “(0)-f”(1)$$ $$ c = f “( 0)$$ $$ d = f(0)$$
ここで、推定される領域の周りの4つの点、つまり$(-1、y _ {-1})$、$(0 、y_0)$、$(1、y_1)$、$(2、y_2)$、および
$$ f(0)= y_0 $$ $$ f(1)=という境界条件を課します。 y_1 $$
2つの境界導関数を次のように定義します
$$ f “(0)= \ frac {y_1-y _ {-1}} {2} $$ $$ f “(1)= \ frac {y_2-y_0} {2} $$
これは、隣接するスプラインに対してどのように定義されるかと一致しています。
次に
$$ a =-\ frac {y _ {-1}} {2} + \ frac {3y_0} {2}-\ frac {3y_1} {2} + \ frac {y_2} {2} $$ $$ b = y _ {-1}-\ frac {5y_0} {2} + 2y_1- \ frac {y_2} {2} $$ $$ c =-\ frac {y _ {-1}} {2} + \ frac {y_1} {2} $$ $$ d = y_0 $$
係数がわかったら、中央の2点間の任意の点$(0)について$ f(x)$を補間できます。 、y_0)$と$(1、y_1)$。
バイキュービック補間の原理はほとんど同じですが、曲線だけでなく16ポイント(4x4グリッド)を使用してサーフェスを推定します。これを行う簡単な方法の1つは、最初に列を補間してから、結果の行を補間することです。
コメント
- これらは、ところで、エルミートとも呼ばれます。多項式。
- この回答を読む前に、立方体のエルミートスプラインをめぐる騒ぎが何であるかを理解したことはありません。とても素晴らしいです、どうもありがとうございました!
- 双一次補間を行うときは、一方の変数に対して線形補間を行い、次にもう一方の変数に対して線形補間を行います。したがって、バイキュービック補間は同じです。一方の変数に対してキュービック補間を実行し、次にもう一方の変数に対してキュービック補間を実行しますか?