Wie zum interpolieren zwischen Daten-Punkten?
Ich bin derzeit an der Entwicklung einer software mit opencv und qt, die plots der Daten Punkte. Ich muss in der Lage sein, füllen Sie ein Bild aus unvollständigen Daten. Ich möchte zum interpolieren zwischen den Punkten, die ich habe. Kann jemand empfehlen, eine Bibliothek oder eine Funktion, die mir helfen könnten. Ich dachte, vielleicht die opencv-reMap-Methode, aber ich kann nicht scheinen, um zu arbeiten.
Den Daten ist eine 2-d matrix-Intensität. Ich will ein Bild von einer Art sein. Seine ein Schulprojekt.
- Zusätzliche Informationen benötigt: Welche Art von Daten es ? Können Sie etwas über die Natur der Kurven (d.h. wie Sie Aussehen?)
- Die Daten einer 2-d-matrix-Intensität. Ich will ein Bild von einer Art sein. Seine Schule-Projekt.
- Also im Grunde nicht von den Antworten, die unten beantwortet die Frage, was eine Bibliothek oder Funktion.... denn ich habe das exakt gleiche Problem wie der op.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Puh! Großes Thema.
Die "richtige" Antwort hängt viel auf Ihre problem-Domäne und verschiedene details von dem, was du tust.
Interpolation in mehr als 1 dimension erfordert einige Entscheidungen. Ich gehe davon aus, dass Sie zeichnen auf einem regelmäßigen raster, sondern, dass einige der grid-Punkte haben keine Daten. Große Frage: sind die fehlenden Punkte spärlich, oder machen Sie große blobs?
Du nicht Informationen hinzufügen, so dass Sie nur versuchen, etwas, das Aussehen OK.
Konzeptionell einfacher Vorschlag (aber die Umsetzung könnte noch einige arbeiten):
Für jede region wird auf fehlende Daten, die Identifizierung der Rand-Punkte. Das x ist in dieser Abbildung
wo die .'s sind die Punkte, fehlende Daten, und die x' s und o ' s haben Daten (für einen einzigen fehlenden Punkt, diese werden die vier nächsten Nachbarn). Füllen Sie die fehlenden Daten zeigen mit einem Mittelwert über die edge-Punkte, um dieses blob. Machen Sie glatt, das Gewicht jedes Punktes durch
1/d
wobei d der taxidriver Abstand (delta x + delta y) zwischen den beiden Punkten..Aus, bevor wir hatten Sie alle details:
In der Abwesenheit von dieser Art von Informationen haben Sie versucht, geradeaus lineare interpolation? Wenn Ihre Daten ist relativ dicht, könnte dies für Sie tun, und es ist einfach genug, um die code-Zeile, wenn Sie es brauchen.
Nächste Schritt ist normalerweise ein kubischer spline, aber für Sie, dass Sie wahrscheinlich wollen, schnappen Sie sich eine vorhandene Implementierung.
Wenn ich etwas brauche mächtiger als eine schnelle lineare interpolation, die ich normalerweise benutze ROOT (und wählen Sie einen der TSpline Klassen), dies kann aber auch viel mehr Aufwand sein, als Sie benötigen.
Wie bereits angemerkt in den Kommentaren, ROOT ist großen, und während es ist schnell, es versuchen zu zwingen, Dinge zu tun, die WURZEL Weg, so kann es einen großen Einfluss auf Ihr Programm.
Einer linearen interpolation zwischen (oder in der Tat extrapolation aus) zwei Punkte (x1, y1) und (x2, y2) gibt Ihnen
Interpolation ist ein Komplexes Thema. Es gibt unendlich viele Möglichkeiten, Sie zu interpolieren, um eine Reihe von Punkten, und dies unter der Annahme, dass Sie wirklich tun wollen, tun interpolation, und nicht glätten jeglicher Art an. (Ein interpolant reproduziert die ursprünglichen Datenpunkte genau.) Und natürlich die 2-d-der Natur auf dieses problem macht die Dinge schwieriger.
Gibt es mehrere gemeinsame Regelungen für die interpolation von verstreuten Daten in 2-d.... Tatsächlich, für diejenigen, die Zugriff darauf haben, ein sehr schönes Papier ist verfügbar (Richard Franke, "Scattered data interpolation: Tests von einigen Methoden", Mathematics of Computation, 1982.)
Vielleicht die am häufigsten verwendete Methode basiert auf einer triangulation der Daten. Nur bauen eine triangulation der Domäne, aus der Sie Ihre Daten Punkte. Dann ist jeder Punkt innerhalb der konvexen Hülle der Daten müssen sich innerhalb genau eines der Dreiecke, oder es wird auf eine gemeinsame Kante. Dies ermöglicht Ihnen, zu interpolieren Linear innerhalb des Dreiecks. Wenn Sie mit Hilfe von MATLAB, dann ist die Funktion griddata für diesen Zweck.)
Das problem, wenn Sie versuchen, füllen eine komplette rechteckige Bild from scattered points ist, dass sehr wahrscheinlich der Daten erstreckt sich nicht auf die 4 Ecken des Arrays. In diesem Fall wird eine triangulation based Systems wird fehlschlagen, da die Ecken des Arrays liegen nicht innerhalb der konvexen Hülle der Punkte verstreut. Eine alternative ist dann zu verwenden, "radial basis functions" (oft abgekürzt RBF). Es gibt viele solcher Systeme gefunden werden, einschließlich Kriging, wenn verwendet, durch die Geostatistik Gemeinschaft.
http://en.wikipedia.org/wiki/Kriging
Schließlich inpainting ist der name für ein Schema der interpolation, wobei die Elemente werden in einem array, aber wo gibt es fehlende Elemente. Der name bezieht sich offensichtlich auf, dass durch eine Kunst-Restauratorin, die zu einer Reparatur ein Riss oder Riss in einem wertvollen Kunstwerk.
http://en.wikipedia.org/wiki/Inpainting
Die Idee hinter inpainting ist in der Regel zu formulieren, die eine boundary value problem. Damit legen Sie eine partielle Differentialgleichung, die auf die region an, wo es ein Loch ist. Mit Hilfe der bekannten Grenzwerte, füllen Sie das Loch durch die Lösung der PDE für die unbekannten Elemente. Dies kann sehr rechenintensiv, wenn es gibt eine riesige Anzahl von unbekannten Elementen, da es erfordert in der Regel die Lösung von zumindest einer massiven spärlich system von linearen Gleichungen. Wenn die PDE ist eine nicht-lineare, dann wird es eine intensivere problem noch. Eine einfache, halbwegs gute Wahl für die PDE ist die Laplace, die Ergebnisse in einem linearen system, das leitet gut. Auch hier kann ich eine Lösung anbieten für MATLAB-Nutzer.
http://www.mathworks.com/matlabcentral/fileexchange/4551
Bessere Entscheidungen für die PDE kann von nichtlinearen PDEs. Mal als Beispiel ist die Navier/Stokes-Gleichung. Es ist gut geeignet, um die Modellierung der Arten von Oberflächen in der Regel gesehen, aber es ist auch schwieriger zu behandeln. Wie in vielen Facetten des Lebens, Sie bekommen, was Sie bezahlen.
Bedenkt, dies ist eine einfache Schule-Projekt, wohl die einfachste interpolation-Technik zu implementieren, ist die "Nächsten Nachbarn"
Für jede fehlende Daten Stelle finden Sie die nächsten "gefüllt" Daten zeigen und verwenden Sie, dass als Wert.
Wenn Sie möchten, zu verbessern die retults ein bisschen mehr, dann können Sie sagen, finden, K-nächste-Daten-Punkte, und verwenden Sie Ihre gewichteten Durchschnitt der Wert Ihrer fehlenden Datenpunkt.
konnten das Gewicht proportional zum Abstand des Punktes von der fehlenden Daten zeigen.
Es gibt Myriaden von anderen Techniken, aber nächste Nachbar ist wahrscheinlich am einfachsten zu implementieren.
wenn ich verstehe, dass Ihr Bedarf wie folgt.
Ich denke, dass Sie eine Teilmenge von x,y,Intensität für eine dimension von L durch W und wollen Sie füllen, für alle X von 0 bis L, und Y im Bereich von 0 bis W.
Wenn dies Ihre Frage, dann die Lösung ist, sich zu anderen Intensitäten durch die Verwendung von Filtern.
Ich denke, Bayer-filter oder der Gauß-filter würde die Arbeit für Sie erledigen.
Können Sie google diese Filter und erhalten Sie Antworten zu implementieren.
Viel Glück.