Hier gehen Sie. Ich gehe davon aus, dass Sie die Bild-Toolbox haben, denn wenn Sie das nicht tun, sollten Sie wahrscheinlich nicht versuchen, so etwas zu tun. Alle diese Funktionen können jedoch mit Faltungen implementiert werden, die ich glaube. Ich habe diesen Prozess auf dem oben dargestellten Bild ausgeführt und den Punkt (139,286) erhalten, wobei 138 die Zeile und 268 die Spalte ist.
1. Konvertieren Sie das Bild in ein Binärbild:
%Vor%wobei img das Originalbild ist. Je nach Bild müssen Sie möglicherweise die zweiten Parameter (von 0 bis 1) anpassen, so dass Sie nur das Kreuz erhalten. Mach dir keine Sorgen, dass das Kreuz nicht vollständig verbunden ist, denn das werden wir im nächsten Schritt beheben.
2.Dilieren Sie das Bild, um die Teile zu verbinden. Ich musste dies zweimal tun, weil ich die Schwelle für die Binärbildkonvertierung so niedrig einstellen musste (einige Teile Ihres Bildes waren ziemlich dunkel). Dilation fügt im Wesentlichen nur Pixel um vorhandene weiße Pixel hinzu (ich invertiere auch das Binärbild, wenn ich es in bwmorph sende, da die Operationen so ausgeführt werden, dass sie auf weiße Pixel wirken, die die Werte 1 haben).
> %Vor%Der letzte Parameter gibt an, wie oft die Dilatationsoperation ausgeführt wird.
3. Verkleinern Sie das Bild zu einem Punkt.
%Vor%Auch hier gibt der letzte Parameter an, wie oft die Operation ausgeführt werden soll. In diesem Fall setze ich Inf, das schrumpft, bis nur noch ein Pixel weiß ist (also eine 1).
4. Suchen Sie das Pixel, das immer noch eine 1 ist.
%Vor%Hier ist i die Zeile und j ist die Spalte des Pixels in bw3, so dass bw3 (i, j) gleich 1 ist. Alle anderen Pixel sollten 0 in bw3 sein.
Es könnte andere Wege geben, dies mit bwmorph zu tun, aber ich denke, dass dieser Weg ziemlich gut funktioniert. Möglicherweise müssen Sie es auch abhängig vom Bild anpassen. Ich kann Bilder von jedem Schritt beifügen, wenn gewünscht.
Ich denke, dass es eine viel einfachere Möglichkeit gibt, dies zu lösen. Die Linien, die das Fadenkreuz bilden, sind gleich lang. Daher wird es in allen Orientierungen symmetrisch sein. Also, wenn wir einen einfachen Zeilenscan sowohl horizontal als auch vertikal durchführen, um die Extremitäten der Linien zu finden, die das Fadenkreuz bilden. Der Median dieser Werte ergibt die x- und y-Koordinaten des Zentrums. Einfache Geometrie.
Ich liebe diese Diskussionen darüber, wie man etwas findet, ohne zuerst zu definieren, was das ist! Aber wenn ich raten müsste, würde ich den Schwerpunkt des ursprünglichen Graustufenbildes vorschlagen .
Was ist damit?
a) konvertiert in binär, nur um den Algorithmus schneller zu machen.
b) Führen Sie eine Suche auf dem resultierenden Array durch
c) Wählen Sie das Element aus, das entweder den niedrigsten / höchsten Zeilen- / Spaltenindex besitzt (Sie hätten dann vier Punkte, aus denen Sie wählen können).
d) suche jetzt weiter nach Nachbarn
e) Wenn Sie entlang der benachbarten Punkte gehen, werden Sie an einem Punkt enden, an dem Sie drei mögliche Nachbarn haben. Das ist Ihre Kreuzung
Ich würde mit der Graustufenbildkarte beginnen. Die dunkelsten Punkte sind am Kreuz, also ist die Unterscheidung der höchsten Werte ein Ausgangspunkt. Legen Sie nach der Unterscheidung alle unteren Punkte auf Weiß und lassen Sie den Rest so, wie sie sind. Dies würde den Kontrast zwischen Punkten auf dem Kreuz und Punkten im Bild maximieren. Als nächstes kommt ein Filter zur Bestimmung der Position mit den höchsten Durchschnittswerten. Ich würde mit einem NxM-Array durch das gesamte Bild gehen und den Mittelwert im Mittelpunkt nehmen. Erstellen Sie ein neues Array dieser Mittel und Sie sollten den höchsten Mittelwert an der Kreuzung haben. Ich bin gespannt, wie jemand anderes das versuchen kann!
Tags und Links matlab image-processing computer-vision