Ich habe ein Bild wie in Abb.1 gezeigt. Ich versuche dieses binäre Bild mit einem gekappten Rechteck zu versehen (Abb. 1) .2) um herauszufinden:
Meine sehr naive Idee ist die Verwendung von Least-Square-Fit, um diese Informationen herauszufinden, aber ich fand heraus, dass es keine Gleichung für ein bedecktes Rechteck gibt. In Matlab gibt es eine Funktion namens Rechteck, mit der man perfekt das bedeckte Rechteck erzeugen kann, aber es scheint nur für den Plot Zweck.
Ich habe diese zwei verschiedenen Wege gelöst und habe zu jedem der folgenden Ansätze Hinweise. Jede Methode variiert in der Komplexität, so dass Sie den besten Trade für Ihre Anwendung entscheiden müssen.
Erster Ansatz: Least-Squares-Optimierung: Hier habe ich die uneingeschränkte Optimierung durch Matlabs Funktion fminunc () verwendet. Werfen Sie einen Blick auf die Hilfe von Matlab, um die Optionen zu sehen, die Sie vor der Optimierung festlegen können. Ich habe einige ziemlich einfache Entscheidungen getroffen, nur um diesen Ansatz für Sie arbeiten zu lassen.
Zusammenfassend habe ich ein Modell für das überdeckende Rechteck als Funktion der Parameter L, W und Theta erstellt. Sie können R hinzufügen, wenn Sie es wünschen, aber persönlich denke ich nicht, dass Sie das brauchen; Indem ich die Kontinuität mit den Halbhalbkreisen an jeder Kante untersuche, denke ich, kann es ausreichen, R = W zu lassen, indem man die Modellgeometrie untersucht. Dies reduziert auch die Anzahl der Optimierungsparameter um eins.
Ich habe ein Modell Ihres überdeckenden Rechtecks mit booleschen Ebenen erstellt. Sehen Sie sich die Funktion cappedRectangle () unten an. Als Ergebnis benötigte ich eine Funktion, um finite Differenzgradienten des Modells in Bezug auf L, W und Theta zu berechnen. Wenn Sie diese Gradienten nicht an fminunc () übergeben, wird es versuchen, diese zu schätzen, aber ich fand, dass die Matlab-Schätzungen für diese Anwendung nicht gut waren, also stellte ich meine eigene als Teil der Fehlerfunktion bereit, die von fminunc aufgerufen wird () (siehe unten).
Ich hatte Ihre Daten zunächst nicht, also habe ich einfach mit der rechten Maustaste auf Ihr Bild oben geklickt und heruntergeladen: 'aRIhm.png'
Um Ihre Daten zu lesen, habe ich das getan (erzeugt die Variable cdata
):
Dann konvertierte ich zum Doppeltyp und "bereinigte" die Daten durch Normalisieren. Hinweis: Diese Vorverarbeitung war wichtig, damit die Optimierung ordnungsgemäß funktioniert, und wurde möglicherweise benötigt, da ich Ihre Rohdaten nicht hatte (wie erwähnt habe ich Ihr Bild von der Webseite für diese Frage heruntergeladen):
%Vor%Bekommen Sie jetzt die Bildgrößen:
%Vor%Hinweis # 1: Sie könnten in Erwägung ziehen, die Mitte des begrenzten Rechtecks (xc, yc) als Optimierungsparameter hinzuzufügen. Diese zusätzlichen Freiheitsgrade beeinflussen die gesamten Anpassungsergebnisse (siehe untenstehende Kommentare zu den endgültigen Fehlerfunktionswerten). Ich habe das hier nicht festgelegt, aber Sie können dem Ansatz folgen, den ich für L, W und Theta verwendet habe, um diese Funktionalität mit den finiten Differenzgradienten hinzuzufügen. Sie müssen das überlagerte Rechteckmodell auch als Funktion von (xc, yc) einrichten.
BEARBEITEN: Aus Neugierde habe ich die Optimierung über das zentrierte Rechteck hinzugefügt, siehe unten.
Hinweis # 2: Für "Kontinuität" an den Enden des begrenzten Rechtecks, sei R = W. Wenn Sie möchten, können Sie später R als explizite Optimierung verwenden Parameter folgt den Beispielen für L, W, Theta. Vielleicht möchten Sie an jedem Endpunkt als Variablen R1 und R2 sagen?
Im Folgenden sind willkürliche Startwerte, die ich verwendet habe, um einfach eine Beispieloptimierung zu veranschaulichen. Ich weiß nicht, wie viele Informationen Sie in Ihrer Bewerbung haben, aber im Allgemeinen sollten Sie versuchen, die besten ersten Schätzungen zu liefern, die Sie machen können.
%Vor%Beachten Sie, dass Sie basierend auf Ihren ursprünglichen Schätzungen andere Ergebnisse erhalten werden.
Als nächstes wird der Anfangsschätzer angezeigt (die Funktion cappedRectangle () wird später definiert):
%Vor%Definieren Sie eine anonyme Funktion für die Fehlermetrik (errorFunc () ist unten aufgeführt):
%Vor%Unten ist die Ausgabe von fminunc (für mehr Details zu jeder Spalte siehe Hilfe von Matlab):
%Vor%Sie können sehen, dass die endgültigen Fehlermetrikwerte im Vergleich zum Startwert nicht so stark abgenommen haben. Dies weist darauf hin, dass die Modellfunktion wahrscheinlich nicht genügend Freiheitsgrade hat, um die Daten wirklich gut zu "passen". Überlegen Sie sich, ob Sie zusätzliche Optimierungsparameter hinzufügen möchten, zB Image Center, wie bereits erwähnt.
BEARBEITEN: Es wurde eine Optimierung über der Mitte des überdeckten Rechtecks hinzugefügt, siehe Ergebnisse unten.
Drucken Sie jetzt die Ergebnisse (mit einem 2011 Macbook Pro):
%Vor%Und zeige die Ergebnisse an:
EDIT: Die übertriebene "Dicke" der obigen Anpassungsergebnisse ist darauf zurückzuführen, dass das Modell versucht, die Daten anzupassen, während das Zentrum fixiert bleibt, was zu größeren Werten für W führt. Siehe aktualisierte Ergebnisse unten.
Sie können sehen, indem Sie die Daten mit der endgültigen Schätzung vergleichen, dass sogar ein relativ einfaches Modell anfängt, den Daten ziemlich ähnlich zu sein.
Sie können weiter gehen und Fehlerbalken für die Schätzungen berechnen, indem Sie eigene Monte-Carlo-Simulationen zur Überprüfung der Genauigkeit als Funktion von Rauschen und anderen verschlechternden Faktoren einrichten (mit bekannten Eingaben, die Sie generieren können, um simulierte Daten zu erzeugen).
Unten ist die Modellfunktion, die ich für das begrenzte Rechteck verwendet habe (Anmerkung: die Art und Weise, wie ich die Bildrotation gemacht habe, ist irgendwie skizzenhaft numerisch und nicht sehr robust für finite Differenzen, aber es ist schnell und dreckig und bringt dich zum Laufen):
%Vor%Und dann brauchst du auch die Fehlerfunktion, die von fminunc aufgerufen wird:
%Vor%Neben der Funktion zur Berechnung der endlichen Differenzgradienten:
%Vor%Zweiter Ansatz: Verwenden Sie regionprops ()
Wie andere bereits erwähnt haben, können Sie auch den regionprops () von Matlab verwenden. Insgesamt denke ich, dass dies am besten funktionieren könnte mit etwas Tuning und Überprüfung, um sicherzustellen, dass es das tut, was Sie erwarten. Der Ansatz wäre also so zu nennen (es ist sicherlich viel einfacher als der erste Ansatz!):
%Vor%Und dann das Strukturergebnis s:
%Vor%Dies gibt genügend Informationen, um in ein Modell eines begrenzten Rechtecks einzufügen. Auf den ersten Blick scheint dies der richtige Weg zu sein, aber es scheint, als ob Sie einen anderen Ansatz gewählt haben (vielleicht den ersten Ansatz oben).
Wie auch immer, unten ist ein Bild der Ergebnisse (in rot) überlagert auf Ihrer Daten, die Sie sieht sieht ziemlich gut aus:
BEARBEITEN: Ich konnte mir nicht helfen, ich vermutete, dass durch die Einbeziehung des Bildzentrums als Optimierungsparameter viel bessere Ergebnisse erzielt werden konnten, also ging ich voran und habe es nur zum Überprüfen gemacht. Sicher genug, mit den gleichen Anfangsschätzungen, die früher bei der Berechnung der kleinsten Quadrate verwendet wurden, sind hier die Ergebnisse:
%Vor%Im Vergleich zu den früheren Werten können wir sehen, dass die neuen Fehlerquadratwerte bei Aufnahme des Bildzentrums etwas kleiner sind, was bestätigt, was wir früher vermutet haben (also keine große Überraschung).
Die aktualisierten Schätzungen für die Parameter mit Begrenzungsrechteck sind also:
%Vor%Und relativ zum Bild-Array-Zentrum erhalten wir:
%Vor%Die Optimierung dauert länger, aber die Ergebnisse werden durch visuelle Inspektion verbessert:
Wenn die Leistung ein Problem darstellt, sollten Sie vielleicht in Betracht ziehen, ein eigenes Optimierungsprogramm zu schreiben oder zuerst die Matlab-Optimierungsparameter zu optimieren, möglicherweise auch mit anderen Algorithmusoptionen. Siehe oben die Optimierungsoptionen.
Hier ist der Code für das aktualisierte Modell:
%Vor%und dann vor dem Aufruf von fminunc () habe ich die Parameterliste angepasst:
%Vor%Viel Spaß.
Zuerst muss ich sagen, dass ich nicht die Antwort auf alle Ihre Fragen habe, aber ich kann Ihnen bei der Orientierung helfen.
Ich schlage vor, die Hauptkomponentenanalyse für das Binärbild zu verwenden. Ein gutes Tutorial über PCA gibt Jon Shlens . In Abbildung 2 seines Tutorials gibt es ein Beispiel, wofür es verwendet werden kann. In Abschnitt 5 seiner Arbeit können Sie eine Anleitung zur Berechnung der Hauptkomponenten sehen. Mit der singulären Wertzerlegung ist es viel einfacher, wie in Abschnitt 6.1 gezeigt.
Um PCA zu verwenden, müssen Sie Messungen erhalten, für die Sie die Hauptkomponenten berechnen möchten. In Ihrem Fall ist jedes weiße Pixel eine Messung, die durch den Pixelort (x, y)'
dargestellt wird. Sie werden N
zweidimensionale Vektoren haben, die Ihre Messungen ergeben. Daher wird Ihre Messung 2xN
matrix X
durch die verketteten Vektoren dargestellt.
Wenn Sie diese Matrix erstellt haben, verfahren Sie wie in Abschnitt 6.1 beschrieben. Die singulären Werte repräsentieren die "Stärke" der verschiedenen Komponenten. Der größte singuläre Wert repräsentiert also die lange Achse Ihrer Ellipse. Der zweitgrößte singuläre Wert (und er sollte nur zwei sein) ist die andere (senkrechte) Achse.
Denken Sie daran, wenn die Ellipse ein Kreis ist, sollten Ihre singulären Werte gleich sein, aber mit Ihrer diskreten Bilddarstellung erhalten Sie keinen perfekten Kreis.
Tags und Links matlab image-processing