Bilineare Interpolation mit nicht ausgerichteten Eingabepunkten

8

Ich habe einen nicht-gitterausgerichteten Satz von Eingabewerten, die mit gitterausgerichteten Ausgabewerten verknüpft sind. Bei einem neuen Eingabewert möchte ich die Ausgabe finden:

(Dies sind X, Y-Koordinaten, die ein ungenaues nicht-eckiges Eye-Tracking-Eingabegerät an die genauen Positionen auf dem Bildschirm kalibrieren.)

Dies sieht wie Bilineare Interpolation aus, aber meine Eingabewerte sind nicht rasterorientiert. Wie kann ich bei einer Eingabe einen vernünftigen Ausgabewert ermitteln?

Antwort : In diesem Fall, wo ich Sätze von Eingabe- und Ausgabepunkten habe, ist es notwendig, inverse bilineare Interpolation , um die U, V-Koordinaten des Eingabepunkts innerhalb des Quads zu finden und dann eine normale bilineare Interpolation (wie in Nico's Antwort unten beschrieben) auf dem Ausgabeviereck unter Verwendung dieser U durchzuführen, V-Koordinaten.

    
Phrogz 28.05.2014, 20:12
quelle

2 Antworten

9

Sie können in jedem konvexen Viereck bilinear interpolieren. Ein kartesisches Gitter ist etwas einfacher, weil die Berechnung von Interpolationsparametern trivial ist. Im allgemeinen Fall interpolieren Sie wie folgt:

%Vor%

Um die Parameter zu berechnen, müssen Sie ein Gleichungssystem lösen. Setzen Sie Ihre Eingabewerte an den Stellen von p1 bis p4 und lösen Sie für alpha und beta .

Dann setzen Sie Ihre Ausgabewerte an den Stellen von p1 bis p4 und verwenden Sie die berechneten Parameter, um den endgültigen interpolierten Ausgabewert zu berechnen.

Bei einem regelmäßigen Gitter ergibt sich folgende Parameterberechnung:

%Vor%

was automatisch die Gleichungen löst.

Hier ist eine Beispielinterpolation für alpha=0.3 und beta=0.6

Tatsächlich können die Gleichungen analytisch gelöst werden. Die Formeln sind jedoch ziemlich hässlich. Daher sind iterative Methoden wahrscheinlich besser. Es gibt zwei Lösungen für das Gleichungssystem. Sie müssen die Lösung auswählen, bei der beide Parameter in [0, 1] sind.

Erste Lösung:

%Vor%

wo

%Vor%

Zweite Lösung:

%Vor%     
Nico Schertler 28.05.2014, 20:39
quelle
2

Hier ist meine eigene Technik, zusammen mit Code zum Ableiten des resultierenden Wertes. Es erfordert drei lerps der Ausgabewerte (und drei Prozentberechnungen, um die Prozentwerte für die Lerps zu ermitteln):

Beachten Sie, dass dies keine bilineare Interpolation ist. Das Quad der Eingabepunkte wird nicht dem Quad der Ausgabewerte zugeordnet, da einige Eingabepunkte Ausgabewerte außerhalb des Ausgabe-Quads ergeben können .

Hier zeige ich die nicht ausgerichteten Eingabewerte auf einer kartesischen Ebene (unter Verwendung der Beispieleingabewerte aus der obigen Frage, multipliziert mit 10 zur Vereinfachung).

Um den 'nördlichen' Punkt (oberer grüner Punkt) zu berechnen, berechnen wir den Prozentsatz über die X-Achse als

%Vor%

Wir verwenden diesen Prozentsatz, um den Schnittpunkt auf der Y-Achse zu berechnen, indem zwischen den oberen Y-Werten gelernt wird:

%Vor%

Wir machen das gleiche am Südrand:

%Vor%

Schließlich verwenden wir diese beiden Werte, um den endgültigen Prozentsatz zwischen den Nord- und Südrändern zu berechnen:

%Vor%

Mit diesen drei Prozentsätzen können wir unsere endgültigen Ausgabewerte durch Lernen zwischen den Punkten berechnen:

%Vor%

Schließlich, hier ist etwas (Lua) Code, der das oben genannte durchführt. Es verwendet ein veränderbares Vector-Objekt, das die Fähigkeit unterstützt, Werte von einem anderen Vektor zu kopieren und seine Werte zu einem anderen Vektor zu übertragen.

%Vor%     
Phrogz 29.05.2014 16:24
quelle

Tags und Links