2016-03-31 12 views
0

Ich habe eine Matrix der Größe . Die erste Zeile, die letzten zwei Zeilen, die erste Spalte und die letzten zwei Spalten (in rot und grün markiert) sind leer. Diese Spalten und Zeilen sollen durch bikubische Interpolation gefüllt werden.Füllen Sie die Grenzen einer Matrix mit Bicubic-Interpolation

Ich habe mehrere Beiträge zu SO und Internet über bikubische Interpolation gelesen, aber leider kann ich das nicht verstehen. Außerdem habe ich gelesen, dass die bikubische Interpolation die Kenntnis eines 4x4 Gitters um das Pixel benötigt, das interpoliert werden muss. Da die Zeilen und Spalten jedoch an der Grenze liegen, habe ich kein 4 x 4 Raster um sie herum.

image

+0

Sie Extrapolation suchen müssen statt Interpolation (btw schöne Lena Icon Avatar) – Spektre

+0

@Spektre: Dank – skm

Antwort

1

Prolog

müssen Sie die unbekannten Gebiete zu extrapolieren. Sie müssen entscheiden, aus welchen Informationen Sie die Daten extrapolieren möchten. Zum Beispiel möchten Sie Punkte in der Nähe des unbekannten Bereichs verwenden oder Punkte verwenden, die entlang des gesamten bekannten Bereichs verteilt sind. Beide Ansätze sind gültig, haben jedoch unterschiedliche Ergebnisse, die unterschiedlichen Anforderungen entsprechen.

Ich werde die nahen Punkte auf den unbekannten Bereich verwenden. Lassen Sie mich mit einfachen Fall starten:

  1. 1D lineare Extrapolation

    lineare Extrapolation verwendet Linie gebildet durch zwei bekannte Punkte. so beispielsweise davon ausgehen, diesen Vektor:

    1D linear extrapolation

    Die x-Achse ist der Vektor/Array-Index und y-Achse Wert der Zelle. Also habe ich 2 letzte bekannte Punkte (blau) genommen und daraus eine Linie gebildet (grün). Wo es die nächsten Array-Positionen schneidet, gibt es Ihre extrapolierten Werte (rot). So in C++ sieht es wie folgt aus:

    float a[8]={ 1.0,2.0,4.0,8.0,10.0,7.0,0.0,0.0 }; // your vector (last two numbers are unknown) 
    a[6]=a[4]+((a[5]-a[4])*2.0); // =4.0 
    a[7]=a[4]+((a[5]-a[4])*3.0); // =1.0 
    
  2. 1D kubische Extrapolation

    Es ist ähnlich wie # 1 aber anstatt Linie verwenden Sie 4 Kontrollpunkt kubische Kurve in parametrischer Polynom Form. Die meisten kubischen Kurven sind so konstruiert, dass Sie, wenn Sie den Parameter t=0 erhalten, den zweiten Kontrollpunkt erhalten und wenn Sie t=1 erhalten, erhalten Sie den dritten Kontrollpunkt. Wenn Sie t=<0,1> verwenden, werden Sie zwischen ihnen reibungslos durchlaufen. Hove jemals müssen wir den Bereich nach dem letzten Kontrollpunkt so erweitern t>=3 mit Schritt 1 für die nächste Punktposition. Also:

    1D cubic extrapolation

    float a[8]={ 1.0,2.0,4.0,8.0,10.0,7.0,0.0,0.0 }; // your vector (last two numbers are unknown) 
    float a0,a1,a2,a3; // your cubic curve polynomial coefficients (computed from 4 control points a[2],a[3],a[4],a[5]) 
    float t; // curve parameter 
    // here compute the a0,a1,a2,a3 
    t=3.0; a[6]=a0+a1*t+a2*t*t+a3*t*t*t*t; 
    t=4.0; a[7]=a0+a1*t+a2*t*t+a3*t*t*t*t; 
    

    Nun, wie die a0,a1,a2,a3 Koeffizienten erhalten? Sie können ein beliebiges Interpolationspolynom verwenden.Mein Favorit ist die (Kugel # 3):

    Also hier ist es (ich hoffe nicht etwas albern Index Fehler tat, während pi ersetzt mit einem [2 + i]):

    float d1,d2; 
    d1=0.5*(a[4]-a[2]); 
    d2=0.5*(a[5]-a[3]); 
    a0=a[3]; 
    a1=d1; 
    a2=(3.0*(a[4]-a[3]))-(2.0*d1)-d2; 
    a3=d1+d2+(2.0*(-a[4]+a[3])); 
    
  3. 2D-Bi-kubische Extrapolation

    Dies trennt nur das Problem in 1D kubische Extrapolationen. Wenn man sich die Graphen sehen aus # 2 von oben sehen Sie, für bi-kubische dies:

    2D bi-cubic extrapolation

    Also zuerst berechnen Sie unbekannte Spalten (die Sie) und daraus dann die fehlenden Zeilen berechnen (oder umgekehrt).

+0

thanks..I upvoted. – skm

Verwandte Themen