2010-02-11 4 views

Antwort

6

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.Convert das Bild in ein binäres Bild:

bw = bw2im(img, .25); 

wo 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). Bei der Dilation werden im Wesentlichen nur Pixel um existierende weiße Pixel hinzugefügt (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 mit einem Wert von 1 arbeiten).

bw2 = bwmorph(~bw, 'dilate', 2); 

Der letzte Parameter gibt an, wie oft die Dilatationsoperation ausgeführt wird.

3. Verkleinern Sie das Bild zu einem Punkt.

bw3 = bwmorph(bw2, 'shrink',Inf); 

Wiederum 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.Find das Pixel, das noch ein 1.

[i,j] = find(bw3); 

Hier ist i die Zeile und j 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 hinzufügen, wenn gewünscht.

+0

Wenn Sie an Sub-Pixel-Genauigkeit für die Bestimmung der Mitte interessiert sind, wäre dies nur der erste Schritt. Mit dem ermittelten Mittelpunkt können Sie für die beiden Linien x und y sammeln. Jetzt können Sie mit polyfit die Steigung und den Schnittpunkt jeder Linie berechnen. Daraus können Sie die Schnittmenge berechnen. – sjchoi

+0

Manchmal bekomme ich mehr als ein Pixel. Gibt es eine Möglichkeit, die Anzahl zu reduzieren, bis ich 1 Ergebnis bekomme? Vielen Dank. – Veronica

+0

@Veronica erhalten Sie noch zwei Pixel oder mehr als zwei Pixel übrig? –

0

Ich würde mit der Graustufen-Imagemap 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 am 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!

+0

Der NxM-Array Schritt Kreuzung ... sind Sie auf Faltung durch ein strukturelles Element? –

+0

Technisch ja. Es ist nur eine schnelle Code-Methode für die Merkmalsextraktion in dem Fall, wo es einen Extremwert-Orientierungspunkt gibt, in diesem Fall das Schwarz des X. Ich hatte vor ein paar Jahren ein Problem damit. Bei der Überprüfung der Positionierung von CT-Scans wird an bestimmten Stellen eine Metallkugel platziert, die im rekonstruierten Bild Streifen verursacht. Die Position dieser zu finden ist einfach genug, um den Extremwert zu finden. Anstelle eines Rechtecks ​​kann ein Kreis verwendet werden, um sowohl die Positionierung als auch die Skalierung des Bildes zu bestimmen. – Jeff

1

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.

+0

Ich denke, dass dies eine gute Idee ist, aber Sie würden es zuerst in eine binäre Karte konvertieren wollen. Nach der Konvertierung können Sie dies mit einem einzigen Durchlauf durch das gesamte Bild Zeile für Zeile tun. Behalte einfach die am weitesten oben, unten, links und rechts Punkte, die eine 1 haben. Dann am Ende den Durchschnitt der vier Punkte finden. Gute Idee. –

1

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 das center of mass des ursprünglichen Graustufenbildes vorschlagen.

+0

Ich denke, das OP bedeutet den Punkt, wo die zwei Linien des Kreuzes treffen. –

1

Was ist damit?

a) Konvertieren in Binär, nur um den Algorithmus schneller zu machen. Führen

b) eine Auf der resultierende Array

c) wählen, um das Element, das entweder niedrigsten/höchsten Zeilen/Spalten-Index (Sie würden vier Punkte zur Auswahl dann

d) nun halten Suche Nachbarn

  • haben eine globale Kriterien für die Suche, wenn Suche nicht als ein paar Iterationen in mehr führt, ausgewählt der Punkt falsch ist und wählen Sie einen anderen Extrempunkt
entlang der benachbarten Punkte

e) geht, werden Sie an einem Punkt enden, wo Sie drei mögliche neighbours.That haben werden Sie

Verwandte Themen