Von einem Kantendetektor erkannte Verbindungskanten


14

Ich habe ein binäres Bild, das von einem scharfen Kantendetektor erhalten wurde. Die Kanten werden in der Mitte nicht gut erkannt und ich muss sie verbinden. Die Verbindung der Kanten ist orientierungs- und nachbarschaftsabhängig. Ich muss die Scheitelpunkte verbinden, wenn sie unter einem Schwellenwert liegen (z. B. weniger als 5 Pixel Abstand). Wenn meine fast linearen Merkmale gut ausgerichtet sind, sollte diese Schwelle gelockert werden. (Dies ist der beste Fall.) Bild

Ich habe die Hough-Transformation versucht, aber sie hat bei mir nicht funktioniert, weil ich keine geraden Linien habe. Dilatation und Erosion sind auch nicht gut; Sie machen die Bilder unordentlicher.

Der Ansatz, den ich versuche, besteht darin, zuerst Scheitelpunkte und Knoten (in MATLAB mit bwmorph) zu erkennen und dann Blätter als separates Feature zu erstellen. Dies geschieht wie folgt:

  1. Suchen Sie in einem 3x3-Fenster nach Nachbarn.
  2. Überqueren Sie das gesamte verbundene Objekt.
  3. Versuchen Sie, eine Linie (oder vielleicht ein quadratisches Polynom) anzupassen.
  4. Überprüfen Sie Feature-by-Feature, ob es eine Verbindung wert ist oder nicht.

Die Implementierung ist nicht einfach, da der Entscheidungsteil, bei dem Eckpunkte verbunden werden müssen, schwierig ist.


Ich habe eine interessante Lösung gefunden, um die Filialen zu finden. MATLAB kann dem Ort leicht die Knoten geben. MATLAB kann auch verbundene Funktionen kennzeichnen. Sie können also eine verbundene Funktion auswählen. Finden Sie Knoten. Setzen Sie diese Knoten auf 0. Trennen Sie die Verbindung und beschriften Sie sie erneut. Du wirst Zweige in den Bäumen haben. Dies erforderte weniger manuelle Programmierung und die Ergebnisse scheinen in Ordnung zu sein. Ein bisschen Input?
Naresh

Für den Verbindungsteil denke ich jetzt darüber nach, große Features zu finden und für zuverlässiger zu halten. Wenn es sich dann um gerade Linien handelt (überprüfen Sie die Fitnessqualität), konvertieren Sie diese in Polarkoordinaten und suchen Sie nach Nachbarschaften wie bei einer Hough-Transformation. Bei großen Features ist der Suchradius groß (proportional zur Größe). Ich implementiere diesen Code. Ergebnisse auf dem Weg. Anmerkungen pls.
Naresh

Antworten:


4

Dies ist möglicherweise keine vollständige Lösung, gibt Ihnen jedoch eine gute Richtung.

Was sind die Hauptkriterien für die Übereinstimmung von Kanten? Dass "lokal" die Steigung der Kante übereinstimmt und die Abstände zum Teil angemessen sind, um wie lange die Kante durchgehend ist.

Wenn Sie geometrische Kanten wie lange gerade Linien haben, erledigt Hough sofort sehr nahtlose Arbeiten. Dies funktioniert jedoch nicht, wenn Kanten beliebige Kurven sind. In diesem Fall können Sie sich die Kurve immer noch als ungefähr stückweise konstante Segmente vorstellen (in Ihrem Fall gut genug). Daher sollten Sie Hough lokal einnehmen. Das heißt, Sie können einen kleinen Teil des Bildes (beispielsweise einen Block) aus dem Hough berechnen und einige Peaks identifizieren. Anhand dessen können Sie erkennen, dass ein Absaugen eine bedeutende Lücke schafft. Wenn dies der Fall ist, behalten Sie es bei oder fahren Sie fort.

Sobald kleinere Lücken gefüllt sind, können Sie diese erweitern, um eine größere Größe zu erhalten. Die Peaks sind mehr, aber Sie können weniger davon auswählen.


danke Dipan, auch daran habe ich gedacht. Es wird eine kostspielige Operation sein, aber ich kann einige Informationen extrahieren. Aber manchmal gibt mir die Hoguh-Transfomation auch keine verbundenen Leitungen. Hough kümmert sich nur um perfekte gerade Linien. Und kümmert sich nicht um die Konnektivität der Pixel. Es passt nur eine Linie an 3 oder mehr zufällige Pixel auf einer geraden Linie an. Ich kodiere meine Hypothese. Ich werde die Ergebnisse hier zur weiteren Diskussion veröffentlichen. Naresh
Naresh

θ

4

Das wird in der Tat nicht einfach sein ... Sie könnten versuchen, ganz mit einer Graph-Struktur zu arbeiten. Extrahieren Sie zunächst alle verbundenen Pixel aus dem Bild und fügen Sie sie in ein Diagramm ein, in dem benachbarte Knoten mit einer Kante verbunden sind. Sie können Diagramme verwerfen, die kleiner als eine Anzahl von M Knoten sind (um kleine Punkte auszuschließen, die für das Bild nicht relevant sind).

Am Ende dieses Vorgangs wird eine Reihe nicht verbundener Grafiken angezeigt. (Nach deinem Bild sind das nicht gerade Bäume, weil es dort Zyklen gibt)

Sie können die äußersten Punkte jedes Graphen (die äußersten Pixel in der Peripherie jedes Graphen) finden, indem Sie von einem zufälligen Knoten ausgehen und eine DFS ausführen .

Am Ende dieses Vorgangs haben Sie eine Reihe von Pixelkoordinaten für jedes Diagramm, die den Extrempunkten entsprechen, an denen sich mit größerer Wahrscheinlichkeit Verbindungen bilden.

Sie können nun versuchen, die nächsten Extrempunktnachbarn (mit einem Abstand <= 5) einfach mit einer geraden Linie zu verbinden.

Wenn Sie jedoch die Steigung des Liniensegments berücksichtigen möchten, das zu diesem extremen Pixel führt, können Sie vor Erreichen dieses extremen Pixels versuchen, eine Linie an N Pixel anzupassen. Wenn also N = 5 ist, werden die letzten 5 Pixel eines Zweigs zum Schätzen einer Linie verwendet.

Daher müssen Sie für jedes nächste Nachbarpaar jetzt auch ein anderes Kriterium verwenden, um zu beurteilen, ob zwei Segmente verbunden werden sollen (dh Extremal Point Distance <= 5 Pixel UND ungefähr gleiche Liniensteigung).

Um die Auswirkung von Rauschen zu minimieren, die dazu führen kann, dass Ihre Linien in der Nähe der Verzweigungsspitzen gezackt erscheinen (und daher Ihre Neigungsschätzung verzerren), können Sie einen Vereinfachungsschritt auf Ihr Diagramm anwenden (dies ist ein weiterer Punkt (neben der obigen DFS), an dem es sich auszahlt mit einer Graph-Struktur arbeiten). Sie können beispielsweise nachfolgende Knoten des Graphen entfernen, durch die die Linie in Winkeln "gebogen" wird, die größer als ein Grenzwert sind (komplexere Informationen finden Sie hier ). Auf diese Weise passen Sie "einfachere" Linien ungefähr in Richtung eines größeren Teils des Segments an, das von den Bildpixeln gebildet wird.

Das wird wahrscheinlich in den meisten Fällen zu anständigen Verbindungen führen (nach dem von Ihnen geposteten Bild zu urteilen), aber Sie werden trotzdem einige herausfordernde haben. Wie würde zum Beispiel ein "Y" -förmiges unterbrochenes Muster verbunden, bei dem einer der Zweige in der Nähe des Verbindungspunkts unterbrochen ist? (dh Sie haben eine "durchgehende" Biegung, die mit einem Liniensegment verbunden werden muss, das mit ihr "verschmilzt"). Vielleicht können Sie überprüfen, wie häufig solche Fälle vorkommen, und Ihre Verbindungskriterien später überarbeiten.

Vielleicht lohnt es sich auch zu prüfen, wie Sie Ihre Bilderfassung verbessern können (zum Beispiel die Auflösung erhöhen).


Vielen Dank für eine gute Antwort. Ja, Ihre Beobachtung ist richtig. Es ist kein Baum, also ist es besser, ein Diagramm zu erstellen. Dies wird mir auch beim Auffinden von Zyklen helfen. Tatsache ist, dass MATLAB ein Diagramm in die bioinfo Toolbox implementiert hat, von dem ich nicht annehmen kann, dass es die meisten Leute haben werden. Das meiste, was ich tun kann, ist eine Toolbox für die Bildverarbeitung. Douglas-Peucker ist auch etwas, über das ich nachgedacht habe. Aber nachdem ich einen GIS-Experten konsultiert hatte, wurde mir klar, dass es die Dinge komplexer machen und sich überschneidende Linien entstehen können. Außerdem muss ich mir auch verschiedene Liniensegmente in einem Diagramm ansehen, da ich 10 Pixel benötige, um eine Linie zu erstellen, und möglicherweise bereits eine Gabelung habe.
Naresh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.