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.)
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:
- Suchen Sie in einem 3x3-Fenster nach Nachbarn.
- Überqueren Sie das gesamte verbundene Objekt.
- Versuchen Sie, eine Linie (oder vielleicht ein quadratisches Polynom) anzupassen.
- Ü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.
quelle
Antworten:
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.
quelle
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).
quelle