Bikubische Interpolation

Ich versuche, eine bikubische Interpolation auf einer unten gezeigten 8 * 8-Matrix (Bild) durchzuführen.

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 

Ich habe den folgenden Matlab-Code dafür verwendet und eine Ausgabe erhalten

interp2(A,"bicubic") 

Aber selbst nach dem Googeln bekomme ich keine wie es manuell gemacht wird. Kann mir jemand helfen, anhand dieses Beispiels auf die Idee zu kommen (nur für wenige Pixel)?

Antwort

Hier ziemlich gute Erklärung.

Ich werde zunächst den 1D-Fall der kubischen Interpolation betrachten (weil er einfacher zu erklären ist) und dann zum 2D-Fall übergehen.

Die Grundidee der kubischen Interpolation besteht darin, die Werte zwischen zwei beliebigen Punkten als kubische Funktion $ f (x) $ mit der ersten Ableitung $ f „(x) $

zu schätzen

$$ f (x) = ax ^ 3 + bx ^ 2 + cx + d $$ $$ f „(x) = 3ax ^ 2 + 2bx + c $$

so dass, Wenn sie an die benachbarten kubischen Splines links und rechts gespleißt werden, sind die interpolierte Funktion (die „nullte Ableitung“) und ihre erste Ableitung stetig. Das heißt, an der linken Grenze eines gegebenen Splines sind die nullte und die erste Ableitung gleich denen der rechten Grenze des benachbarten Splines unmittelbar links.

Ohne Verlust der Allgemeinheit können wir annehmen, dass wir zwischen $ x = 0 $ und $ x = 1 $ interpolieren . An der linken und rechten Grenze sehen wir, dass

$$ f (0) = d $$ $$ f (1) = a + b + c + d $$ $$ f „(0) = c $$ $$ f „(1) = 3a + 2b + c $$

Auflösen nach den Polynomkoeffizienten

$$ a = 2f (0) – 2f (1 ) + f „(0) + f“ (1) $$ $$ b = -3f (0) + 3f (1) – 2f „(0) – f“ (1) $$ $$ c = f „( 0) $$ $$ d = f (0) $$

Betrachten Sie nun die vier Punkte um die Region, die geschätzt werden: $ (- 1, y _ {- 1}) $, $ (0) , y_0) $, $ (1, y_1) $, $ (2, y_2) $ und legen Randbedingungen fest, die

$$ f (0) = y_0 $$ $$ f (1) = y_1 $$

und definieren Sie die beiden Grenzableitungen als

$$ f „(0) = \ frac {y_1-y _ {- 1}} {2} $$ $$ f „(1) = \ frac {y_2-y_0} {2} $$

, was mit der Definition für die benachbarten Splines übereinstimmt.

Dann

$$ 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 $$

Sobald die Koeffizienten bekannt sind, können Sie $ f (x) $ für jeden Punkt zwischen den beiden zentralen Punkten $ (0) interpolieren , y_0) $ und $ (1, y_1) $.

Für die bikubische Interpolation ist das Prinzip ziemlich dasselbe, aber Sie schätzen eine Oberfläche mit 16 Punkten (4×4-Gitter) und nicht nur mit einer Kurve. Eine einfache Möglichkeit, dies zu tun, besteht darin, zuerst die Spalten und dann die resultierenden Zeilen zu interpolieren.

Kommentare

  • Diese werden übrigens auch Hermite genannt Polynome.
  • Ich habe nie verstanden, was die ganze Aufregung um kubische Einsiedlersplines war, bevor ich diese Antwort gelesen habe. Es ist so großartig, vielen Dank!
  • Wenn Sie eine bilineare Interpolation durchführen, führen Sie eine lineare Interpolation für eine Variable und dann eine lineare Interpolation für die andere Variable durch. Die bikubische Interpolation ist also dieselbe: kubische Interpolation für eine Variable, dann kubische Interpolation für die andere, richtig?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.