Frage

Ich entwickle derzeit eine Software mit opencv und qt die Datenpunkte Plots. Ich muß von unvollständigen Daten in einem Bild der Lage Füllung sein. Ich möchte zwischen den Punkten zu interpolieren, die ich habe. Kann mir jemand eine Bibliothek oder eine Funktion empfehlen, die mir helfen könnten. Ich dachte, vielleicht die opencv REMAP Methode, aber das kann ich nicht scheinen, um zu arbeiten.

Die Daten sind eine 2-D-Matrix von Intensitätswerten. Ich möchte ein Bild von einer Art erstellen. Es ist ein Schulprojekt.

War es hilfreich?

Lösung

Puh! Großes Thema.

Die „richtige“ Antwort hängt viel auf Ihrem Problembereich und verschiedene Details von dem, was Sie tun.

Die Interpolation in mehr als 1 Dimension erfordert einige Entscheidungen zu treffen. Ich gehe davon aus, dass Sie auf einem regelmäßigen Gitter grafisch darstellen, sondern dass einige Ihrer Gitterpunkte haben keine Daten. Große Frage: sind die fehlenden Punkte spärlich, oder haben sie große Blobs machen

?

Sie nicht Informationen hinzufügen, so dass Sie nur etwas zu etablieren versuchen, das wird aussehen OK.

Konzeptionell einfacher Vorschlag (aber die Umsetzung kann einige Arbeit sein):

Für jede Region auf fehlende Daten, identifizieren, die alle Randpunkte. Das ist die x in dieser Figur finden

oooxxooo
oox..xoo 
oox...xo
ox..xxoo
oox.xooo
oooxoooo

, wo die. 'S sind die Punkte, Daten fehlen, und die x und O Daten (für einen einzelnen fehlenden Punkt, wird dies die vier nächsten Nachbarn sein). Füllen Sie jeden fehlenden Datenpunkt mit einem Durchschnitt über die Randpunkte, um dieses Blob. Um es glatt, Gewicht jeden Punkt durch 1/d wobei d der Taxifahrer Abstand (delta x + delta y) zwischen den beiden Punkten ..


Aus, bevor wir hatten keine Details:

In Ermangelung dieser Art von Informationen, haben Sie versucht, geradeaus lineare Interpolation? Wenn Ihre Daten angemessen dicht ist dies tun könnte es für Sie, und es ist einfach genug, um Code in-line, wenn Sie es brauchen.

Der nächste Schritt ist in der Regel ein kubischer Spline, aber dafür werden Sie wahrscheinlich wollen eine bestehende Implementierung greifen.


Wenn ich etwas mächtiger als eine schnelle lineare Interpolation benötigen, ich in der Regel verwenden ROOT (und wählen Sie eine der die TSpline Klassen), aber dies kann mehr Aufwand, als Sie benötigen.

Wie in den Kommentaren erwähnt, ROOT ist groß , und während es schnell ist, es fordert Sie zu zwingen, Dinge, die ROOT Weise zu tun, so kann es einen großen Einfluss auf das Programm haben.


Eine lineare Interpolation zwischen den (oder tatsächlich Extrapolation aus) zwei Punkte (x1, y1) und (x2, y2) gibt Ihnen

 y_i = (x_i-x1)*(y2-y1)/(x2-x1)

Andere Tipps

Die Interpolation ist ein komplexes Thema. Es gibt unendlich viele Möglichkeiten, um eine Reihe von Punkten zu interpolieren, und dies unter der Annahme, dass Sie wirklich Interpolation tun wollen, und nicht von irgendeiner Art zu glätten. (Ein Interpolant reproduziert die ursprünglichen Datenpunkte genau.) Und natürlich die 2-d Natur dieses Problems macht die Dinge schwieriger.

Es gibt verschiedene Systeme zur Interpolation von verstreuten Daten in 2-D. Eigentlich für diejenigen, die darauf Zugriff haben, ein sehr schönes Papier zur Verfügung steht (Richard Franke, "Verstreute Daten Interpolation: Tests einiger Methoden"., Mathematics of Computation, 1982)

Vielleicht ist die am häufigsten verwendete Methode verwendet wird, auf einer Triangulation Ihrer Daten. Lediglich baut eine Triangulation der Domäne von Ihren Datenpunkten. Dann ein beliebiger Punkt innerhalb der konvexen Hülle der Daten muss innerhalb genau einer der Dreiecke liegen, oder es wird auf einem gemeinsamen Kante sein. Auf diese Weise können Sie sich linear innerhalb des Dreiecks zu interpolieren. Wenn Sie MATLAB verwenden, dann wird die Funktion Griddata ist für diesen ausdrücklichen Zweck zur Verfügung.)

Das Problem, wenn ein rechteckiges Bild von vollständigem gestreute Punkten aufzufüllen versucht ist, dass sehr wahrscheinlich die Daten nicht an die 4 Ecken des Arrays erstreckt. In diesem Fall wird eine Triangulation basierendes Schema scheitern, da die Ecken des Feldes innerhalb der konvexen Hülle der gestreuten Punkte liegen nicht. Eine Alternative ist dann "Radial Basis Functions" (oft abgekürzt RBF) zu verwenden. Es gibt viele solche Systeme gefunden werden, einschließlich Kriging, wenn sie von der Geostatistik Gemeinschaft verwendet wird.

http://en.wikipedia.org/wiki/Kriging

Schließlich Inpainting ist der Name für ein Schema der Interpolation, wo die Elemente in einem Array gegeben sind, aber wo es fehlen Elemente. Der Name bezieht sich auf offensichtlich, dass durch eine Kunstkonservator getan, die einen Riss reparieren muss oder reißen in einem wertvollen Stück Grafik.

http://en.wikipedia.org/wiki/Inpainting

Die Idee hinter Inpainting ist in der Regel ein Randwertproblem zu formulieren. Das heißt, definiert eine partielle Differentialgleichung auf dem Bereich, in dem es ein Loch ist. Mit den bekannten Randwerten, füllt das Loch durch die PDE für die unbekannten Elemente zu lösen. Dies kann rechenintensiv sein, wenn es eine große Anzahl von unbekannten Elementen ist, da es in der Regel die Lösung von mindestens ein massiven spärlichen linearem Gleichungssystem erfordert. Wenn die PDE ein nicht-lineares ist, dann wird es ein intensiveres Problem noch. Eine einfache, recht gute Wahl für die PDE ist die Laplace, die in einem linearen System führt, die gut extrapoliert. Noch einmal, ich eine Lösung für einen MATLAB Benutzer anbieten kann.

http://www.mathworks.com/matlabcentral/fileexchange/4551

Bessere Entscheidungen für die PDE können aus einem nichtlinearen partiellen Differentialgleichungen kommen. Sobald eine solche ist die Navier / Stokes-Gleichung. Es ist gut geeignet für die Modellierung der Arten von Oberflächen, die üblicherweise gesehen, aber es ist auch schwieriger zu behandeln. Wie in vielen Facetten des Lebens, man bekommt, was man bezahlt.

In Anbetracht dieser ist ein einfaches Schulprojekt, das wahrscheinlich die einfachste Interpolationstechnik zu implementieren, sind die „nächsten Nachbarn“

Für jede fehlenden Daten zeigen Sie den nächsten „gefüllt“ Datenpunkt finden und verwenden, die als Wert.

Wenn Sie die retults ein wenig mehr verbessern möchten, dann können Sie können sagen, K nächsten Datenpunkte finden, und nutzen ihre gewichtete Mittelwert als Wert Ihrer fehlenden Datenpunkt.

das Gewicht auf den Abstand des Punktes von dem fehlenden Datenpunkt proportional sein könnte.

Es gibt zig andere Techniken, aber nächster Nachbar ist wahrscheinlich die am einfachsten zu implementieren.

wenn ich verstehe, dass Sie brauchen, ist wie folgt.

Ich glaube, Sie haben eine Teilmenge von x, y, Intensität für eine Dimension von L von W und Sie wollen für alles X von 0 bis L und Y von 0 bis W im Bereich bis hin zu füllen.

Wenn Ihre Frage ist, dann Lösung andere Intensitäten zu erhalten, indem Filter verwendet wird.

ich denke, Bayer-Filter oder Gauß-Filter würde die Arbeit für Sie tun.

Sie können diese Filter Google und Sie werden Antworten erhalten zu implementieren.

Viel Glück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top