Finden Sie die Ecken in einem polygon, dargestellt durch eine region, die Maske
BW = poly2mask(x, y, m, n)
berechnet einen
binäre region of interest (ROI) Maske,
BW von einer ROI-polygon, dargestellt
die durch die Vektoren x und y. Die Größe der BW
ist m-von-n.
poly2mask
setzt Pixel in BW
in der polygon (X,Y) 1
und setzt Pixel außerhalb des Polygons zu
0.
Problem:
Gegeben eine solche binäre Maske BW
eines konvexen Vierecks, was wäre der effizienteste Weg, um zu bestimmen, die vier Ecken?
E. g.,
Beste Lösung bisher:
Verwenden edge
zu finden, die begrenzenden Linien, die Hough-Transformation zum finden der 4 Linien in der edge-Bild und dann finden Sie die Schnittpunkte von diesen 4 Zeilen, oder verwenden Sie eine Ecke Detektor auf der Kante Bild. Scheint kompliziert, und ich kann nicht helfen Gefühl, es gibt eine einfachere Lösung gibt.
Btw convhull
nicht immer wieder 4 Punkte (vielleicht kann jemand empfehlen qhull
Optionen, um zu verhindern, dass) : es gibt ein paar Punkte entlang der Kanten als auch.
EDIT:
Amro Antwort scheint ziemlich elegant und effizient. Aber es könnten mehrere "Ecken" zu jeder echten Ecke, da die peaks nicht eindeutig. Ich konnte cluster basierend auf θ und Durchschnitt die "Ecken" um eine wirkliche Ecke, aber das Hauptproblem ist der Einsatz von order(1:10)
.
Ist 10
genug, um Konto für alle Ecken und wird dadurch ausschließen eine "Ecke" in einem echten Ecke?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist etwas ähnlich zu dem, was @AndyL vorgeschlagen. Allerdings bin ich über die Grenze-Signatur in Polarkoordinaten anstelle der Tangente.
Beachten Sie, dass ich beginne, indem ich das extrahieren der Kanten ist, immer die Grenze, dann konvertieren Sie es für die Signatur. Schließlich finden wir die Punkte auf der Grenze sind, die am weitesten vom centroid, diese Punkte bilden die Ecken gefunden. (Alternativ können wir auch erkennen, Gipfeln in der Signatur für die Ecken).
Folgende ist eine vollständige Implementierung:
EDIT:
In Reaktion auf Jacob ' s Kommentar, sollte ich erklären, dass ich das erste mal versucht zu finden, die Gipfel in der Signatur unter Verwendung der ersten/zweiten Ableitungen, aber landete dabei die am weitesten N-Punkte. 10 war nur eine ad-hoc Wert, und wäre nur schwer zu verallgemeinern (ich habe versucht, 4 gleiche, wie Anzahl der Ecken, aber es trifft nicht auf alle von Ihnen). Ich denke, die Idee der Clusterbildung Sie Duplikate entfernen ist, lohnt ein Blick in.
Soweit ich es sehe, ist das problem mit der 1. Ansatz war, dass, wenn Sie zeichnen
rho
ohneθ
berücksichtigt, Sie erhalten eine andere Form (nicht die gleichen peaks), da die Geschwindigkeit, durch die wir Ablaufverfolgung die Grenze ist unterschiedlich und hängt von der Krümmung. Wenn wir herausfinden könnten, wie normalisieren, die Wirkung, die wir bekommen können, desto genauer die Ergebnisse sein, auch Derivate einzusetzen.bwboundaries
im Fall von Polygonen.. ich denke, dass die Linie der Vereinfachung der Technik erwähnt wurde:)Wenn Sie die Image Processing Toolbox, es gibt eine Funktion namens
cornermetric
die Implementierung eines Harris-corner-Detektor oder Shi und Tomasi, dass der minimale Eigenwert-Methode. Diese Funktion schon seit der version 6.2 von der Image Processing Toolbox (MATLAB version R2008b).Diese Funktion zu verwenden, kam ich mit einem etwas anderen Ansatz aus den anderen Antworten. Die folgende Lösung basiert auf der Idee, dass eine kreisförmige Fläche zentriert an jedem "wahr" - Ecke Punkt überschneiden sich das polygon, indem Sie eine kleinere Menge als eine kreisförmige Fläche mittig auf eine falsche Ecke Punkt, der eigentlich am Rande. Diese Lösung kann auch mit Fällen, in denen mehrere Punkte erkannt werden an der gleichen Ecke...
Der erste Schritt ist, um die Daten zu laden:
Als Nächstes berechnen die Ecke Metrik mit
cornermetric
. Beachten Sie, dass ich bin Maskierung der Ecke Metrik, die von der ursprünglichen polygon, so dass wir suchen für Eck-Punkte, die innen das polygon (D. H. dem Versuch, die Eck-Pixel des Polygons).imregionalmax
wird dann verwendet, um das finden der lokalen maxima. Da kann man Cluster haben, der größer als 1 pixel mit der gleichen Ecke Metrik, die ich dann Rauschen hinzufügen, um die maxima und neu berechnen, so dass ich nur 1 pixel in jede maximale region. Jedes maximale region ist dann beschriftet mitbwlabel
:Gekennzeichnete Regionen werden dann aufgedehnt (mit
imdilate
) mit einem scheibenförmigen Strukturelement (erstellt mitstrel '
):Nun, dass die gekennzeichnete Ecke Regionen wurden erweitert, Sie überschneiden sich teilweise die ursprüngliche polygon. Regionen auf einer Kante des Polygons wird rund 50% überlappung, während die Regionen, die an einer Ecke etwa 25% überlappen. Die Funktion
regionprops
kann verwendet werden, um die Bereiche der überlappung jeder beschriftet region, und die 4 Regionen, die am wenigsten überlappen, können also als die wahren Ecken:Und wir können jetzt auch die pixel-Koordinaten der Ecken mit
finden
undismember
:Und hier ist ein test mit einer Diamant-förmige region:
Ich wie zu lösen dieses problem durch die Zusammenarbeit mit einer Grenze, denn es reduziert das aus einem 2D-problem auf ein 1D-problem.
Verwenden
bwtraceboundary()
aus der Bildverarbeitung toolkit extrahieren Sie eine Liste von Punkten auf der Grenze. Dann konvertieren Sie die Grenze in einer Reihe von tangentialen Vektoren (es gibt eine Reihe von Möglichkeiten, dies zu tun, eine Möglichkeit wäre, die subrtacti
TEN Punkt entlang der Grenze von deri+delta
TEN Punkt.) Sobald Sie eine Liste von Vektoren, die nehmen das Skalarprodukt der benachbarten Vektoren. Die vier Punkte mit den kleinsten Punkt Produkte sind die Ecken!Wenn Sie möchten, dass Ihre algorithmen arbeiten auf Polygone mit einer abritrary Anzahl der Eckpunkte, dann Suche einfach nach dot-Produkte, die eine bestimmte Anzahl von Standardabweichungen unter dem median Skalarprodukt.
Entschied ich mich für eine Harris corner detector (hier ein formale Beschreibung) um die Ecken. Dies kann wie folgt implementiert werden:
Hier, das problem mit mehreren Ecken Dank Gauß-windowing-Funktion glättet die Intensität ändern. Unten ist eine vergrößerte version einer Ecke mit der
hot
colormap.#
nach%
in MATLAB Kommentare, so dass es bekommt die richtige Farbe SO'
?x = [16 282 276 30 16]; y = [14 29 200 225 14]; BW = poly2mask(x,y, 246,300);
erhalten Sie einige doppelte Ecken (auch beim tuning versucht die anderen Parameter), und wird sich steigern müssen, umnCorners
auch..Hier ist ein Beispiel für die Verwendung von Ruby-und HornetsEye. Im Grunde das Programm erstellt ein Histogramm der quantisierten Sobel-Gradienten-Orientierung zu finden dominante Orientierungen. Wenn vier dominanten Orientierungen gefunden werden, Linien angebracht sind, und die Kreuzungen zwischen benachbarten Linien sind davon ausgegangen, dass die Ecken des projizierten Rechtecks.