Beschneiden kurzer Liniensegmente vom Flankendetektorausgang?

8

Ich suche nach einem Algorithmus, um kurze Liniensegmente vom Ausgang eines Kantendetektors zu entfernen. Wie in dem Bild (und der Verknüpfung) unten zu sehen ist, werden mehrere kleine Kanten erkannt, die keine "langen" Linien sind. Idealerweise möchte ich nur die 4 Seiten des Vierecks nach der Verarbeitung zeigen, aber wenn es ein paar streunende Linien gibt, wird es keine große Sache sein ... Irgendwelche Vorschläge?

Bildlink

    
user21293 22.09.2009, 19:27
quelle

7 Antworten

5

Bevor Sie die Kanten finden, bearbeiten Sie das Bild mit einer Operation öffnen oder schließen (oder beiden), dh erodieren gefolgt von erweitern oder erweitern gefolgt von erode . Dies sollte die kleineren Objekte entfernen, aber die größeren Objekte sollten gleich bleiben.

Ich habe nach Online-Beispielen gesucht und das Beste, was ich finden konnte, war auf Seite 41 von PDF.

    
tom10 22.09.2009, 19:59
quelle
4

Ich bezweifle, dass dies mit einer einfachen lokalen Operation gemacht werden kann. Sehen Sie sich das Rechteck an, das Sie behalten möchten - es gibt mehrere Lücken. Daher würde eine lokale Operation zum Entfernen von kurzen Liniensegmenten wahrscheinlich die Qualität der gewünschten Ausgabe stark reduzieren.

Als Konsequenz würde ich versuchen, das Rechteck als wichtigen Inhalt zu erkennen, indem ich die Lücken schließe, ein Polygon anpasse oder so etwas, und dann in einem zweiten Schritt den verbleibenden unwichtigen Inhalt verwerfe. Vielleicht kann die Hough-Transformation helfen.

AKTUALISIEREN

Ich habe gerade diese Beispielanwendung mit einer Kernel Hough Transformation mit Ihrem Beispielbild verwendet und vier davon erhalten schöne Linien passen zu deinem Rechteck.

    
Daniel Brückner 22.09.2009 19:55
quelle
4
___ antwort10239502 ___

Wenn jemand auf diesen Thread tritt, bringt OpenCV 2.x ein Beispiel mit dem Namen quadrats.cpp , das diese Aufgabe im Grunde genommen nagt.

Ich habe eine kleine Änderung an der Anwendung vorgenommen, um die Erkennung des Vierecks

zu verbessern

Code :

%Vor%     
___ answer1462266 ___

Bevor Sie die Kanten finden, bearbeiten Sie das Bild mit einer Operation öffnen oder schließen (oder beiden), dh erodieren gefolgt von erweitern oder erweitern gefolgt von erode . Dies sollte die kleineren Objekte entfernen, aber die größeren Objekte sollten gleich bleiben.

Ich habe nach Online-Beispielen gesucht und das Beste, was ich finden konnte, war auf Seite 41 von PDF.

    
___ answer1462246 ___

Ich bezweifle, dass dies mit einer einfachen lokalen Operation gemacht werden kann. Sehen Sie sich das Rechteck an, das Sie behalten möchten - es gibt mehrere Lücken. Daher würde eine lokale Operation zum Entfernen von kurzen Liniensegmenten wahrscheinlich die Qualität der gewünschten Ausgabe stark reduzieren.

Als Konsequenz würde ich versuchen, das Rechteck als wichtigen Inhalt zu erkennen, indem ich die Lücken schließe, ein Polygon anpasse oder so etwas, und dann in einem zweiten Schritt den verbleibenden unwichtigen Inhalt verwerfe. Vielleicht kann die Hough-Transformation helfen.

AKTUALISIEREN

Ich habe gerade diese Beispielanwendung mit einer Kernel Hough Transformation mit Ihrem Beispielbild verwendet und vier davon erhalten schöne Linien passen zu deinem Rechteck.

    
___ qstnhdr ___ Beschneiden kurzer Liniensegmente vom Flankendetektorausgang? ___ answer1462469 ___

Die Hough-Transformation kann eine sehr teure Operation sein.

Eine Alternative, die in Ihrem Fall gut funktioniert, ist die folgende:

  1. Führen Sie 2 mathematische Morphologieoperationen aus, die als Bild bezeichnet werden ( Ссылка ). mit einer horizontalen und vertikalen Linie (von einer bestimmten Länge, die aus dem Testen bestimmt wurde) strukturierendes Element. Der Zweck davon ist, alle Lücken in dem großen Rechteck zu schließen.

  2. Führen Sie die Analyse der verbundenen Komponenten aus. Wenn Sie die Morphologie effektiv gemacht haben, wird das große Rechteck als eine verbundene Komponente ausgegeben. Es bleibt dann nur durch alle verbundenen Komponenten iterierend und wählt den wahrscheinlichsten Kandidaten aus, der das große Rechteck sein sollte.

___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer1462502 ___

Vielleicht die verbundenen Komponenten finden, dann Komponenten mit weniger als X Pixeln entfernen (empirisch bestimmt), gefolgt von einer Erweiterung entlang horizontaler / vertikaler Linien, um die Lücken innerhalb des Rechtecks ​​wieder zu verbinden

    
___ tag123imageprocessing ___ Alles, was mit digitaler Bildverarbeitung zu tun hat, d. h. die Theorie und die Techniken, die verwendet werden, um Informationen aus digitalen Bildern zu extrahieren oder zu manipulieren. ___ answer1497462 ___

Es ist möglich, zwei Haupttechniken zu verfolgen:

  1. Vektorbasierter Vorgang: Ordnen Sie Ihre Pixelinseln zu Clustern zu (Blob, Voronoi-Zonen, was auch immer). Wenden Sie dann einige Heuristiken an, um die Segmente zu korrigieren, wie den Teh-Chin-Kettenapproximationsalgorithmus, und nehmen Sie die Beschneidung von Vektorelementen (Start, Endpunkt, Länge, Ausrichtung usw.) vor.

  2. Set-basierter Vorgang: Clustern Sie Ihre Daten (wie oben). Berechnen Sie für jeden Cluster Hauptkomponenten und erkennen Sie Linien aus Kreisen oder anderen Formen, indem Sie nach Clustern suchen, die nur einen signifikanten Eigenwert aufweisen (oder 2, wenn Sie nach "fetten" Segmenten suchen, die Ellipsen ähneln könnten). Überprüfen Sie Eigenvektoren, die Eigenwerten zugeordnet sind, um Informationen über die Ausrichtung der Blobs zu erhalten, und treffen Sie Ihre Auswahl.

Beide Wege könnten mit OpenCV leicht erkundet werden (der erstere fällt in die Kategorie "Contour-Analyse" von Algos).

    
___ tag123algorithm ___ Ein Algorithmus ist eine Folge wohldefinierter Schritte, die eine abstrakte Lösung für ein Problem definieren. Verwenden Sie dieses Tag, wenn sich Ihr Problem auf den Algorithmusentwurf bezieht. ___ qstntxt ___

Ich suche nach einem Algorithmus, um kurze Liniensegmente vom Ausgang eines Kantendetektors zu entfernen. Wie in dem Bild (und der Verknüpfung) unten zu sehen ist, werden mehrere kleine Kanten erkannt, die keine "langen" Linien sind. Idealerweise möchte ich nur die 4 Seiten des Vierecks nach der Verarbeitung zeigen, aber wenn es ein paar streunende Linien gibt, wird es keine große Sache sein ... Irgendwelche Vorschläge?

Bildlink

    
___ tag123computervision ___ Computer Vision ermöglicht die Verarbeitung von Bildern oder Sequenzen von Bildern mit einem Computer unter Verwendung eines Algorithmus. Das Ziel des Algorithmus ist es, Informationen aus dem Bild zu extrahieren. Manchmal erzeugt diese Information ein aktualisiertes Bild oder manchmal andere Messungen. Ein Beispiel für ein aktualisiertes Bild besteht darin, die Kanten im Bild zu erhalten - Kantenerkennung genannt. ___ answer19683541 ___

Hier ist eine einfache morphologische Filterlösung, die den Zeilen von @ Tom10 folgt:

Lösung in Matlab:

%Vor%

Die Idee besteht darin, die horizontalen Konturen im Grunde zu verbinden, um eine große Komponente zu bilden, und später durch einen Bereichsöffnungsfilter zu filtern, um das Rechteck zu erhalten.

Ergebnisse:

    
___
karlphillip 20.04.2012 02:36
quelle
2

Die Hough-Transformation kann eine sehr teure Operation sein.

Eine Alternative, die in Ihrem Fall gut funktioniert, ist die folgende:

  1. Führen Sie 2 mathematische Morphologieoperationen aus, die als Bild bezeichnet werden ( Ссылка ). mit einer horizontalen und vertikalen Linie (von einer bestimmten Länge, die aus dem Testen bestimmt wurde) strukturierendes Element. Der Zweck davon ist, alle Lücken in dem großen Rechteck zu schließen.

  2. Führen Sie die Analyse der verbundenen Komponenten aus. Wenn Sie die Morphologie effektiv gemacht haben, wird das große Rechteck als eine verbundene Komponente ausgegeben. Es bleibt dann nur durch alle verbundenen Komponenten iterierend und wählt den wahrscheinlichsten Kandidaten aus, der das große Rechteck sein sollte.

ldog 22.09.2009 20:42
quelle
2

Vielleicht die verbundenen Komponenten finden, dann Komponenten mit weniger als X Pixeln entfernen (empirisch bestimmt), gefolgt von einer Erweiterung entlang horizontaler / vertikaler Linien, um die Lücken innerhalb des Rechtecks ​​wieder zu verbinden

    
Amro 22.09.2009 20:46
quelle
1

Es ist möglich, zwei Haupttechniken zu verfolgen:

  1. Vektorbasierter Vorgang: Ordnen Sie Ihre Pixelinseln zu Clustern zu (Blob, Voronoi-Zonen, was auch immer). Wenden Sie dann einige Heuristiken an, um die Segmente zu korrigieren, wie den Teh-Chin-Kettenapproximationsalgorithmus, und nehmen Sie die Beschneidung von Vektorelementen (Start, Endpunkt, Länge, Ausrichtung usw.) vor.

  2. Set-basierter Vorgang: Clustern Sie Ihre Daten (wie oben). Berechnen Sie für jeden Cluster Hauptkomponenten und erkennen Sie Linien aus Kreisen oder anderen Formen, indem Sie nach Clustern suchen, die nur einen signifikanten Eigenwert aufweisen (oder 2, wenn Sie nach "fetten" Segmenten suchen, die Ellipsen ähneln könnten). Überprüfen Sie Eigenvektoren, die Eigenwerten zugeordnet sind, um Informationen über die Ausrichtung der Blobs zu erhalten, und treffen Sie Ihre Auswahl.

Beide Wege könnten mit OpenCV leicht erkundet werden (der erstere fällt in die Kategorie "Contour-Analyse" von Algos).

    
ZZambia 30.09.2009 11:08
quelle
0

Hier ist eine einfache morphologische Filterlösung, die den Zeilen von @ Tom10 folgt:

Lösung in Matlab:

%Vor%

Die Idee besteht darin, die horizontalen Konturen im Grunde zu verbinden, um eine große Komponente zu bilden, und später durch einen Bereichsöffnungsfilter zu filtern, um das Rechteck zu erhalten.

Ergebnisse:

    
beedot 30.10.2013 13:26
quelle