Wie Rechtecken in diesem Bild zu erkennen?
-
08-07-2019 - |
Frage
Ich habe ein Bild mit horizontalen und vertikalen Linien. In der Tat ist dieses Bild die horizontale und vertikale Linien umgewandelt BBC-Website. Mein Problem ist, dass ich in der Lage sein wollen, dass alle Rechtecke in dem Bild zu finden. Ich möchte ein Computerprogramm schreiben, um alle Rechtecke zu finden. Wer weiß, wie dies zu tun, oder schlagen Ideen, wie, um loszulegen? Diese Aufgabe ist einfach für mich als Person, die visuellen Rechtecken zu finden, aber ich bin nicht sicher, wie es als Programm zu beschreiben.
Das Bild ist die BBC-Website hier http://www.bbc.co.uk/
Update dazu schrieb ich den Code, den die BBC-Website Bild auf die horizontale und vertikale Linie umwandelt, das Problem in diesen Linien ist an den Ecken nicht vollständig erfüllen und manchmal völlig sie nicht ein Rechteck bilden. Dank!
Lösung
OpenCV (Bildverarbeitung und Computer Vision Bibliothek in c geschrieben) hat Implementierung für Hough-Transformation ( die einfache hough Fund Linien in einem Bild umwandeln, während die verallgemeinerte eine komplexere Objekte findet), so dass ein guter Anfang sein könnte. Für die Rechtecke, die Ecken geschlossen Sie haben es auch Ecke Detektoren wie cornerHarris, die helfen können.
lief ich die HoughLines mit opencv versehen Demo und hier ist das Ergebnis auf dem Bild, das Sie (erfassten Linien rot markiert) gab:
(Quelle: splintec.com )
Andere Tipps
Ich glaube, Sie suchen den Hough verwandeln.
In der Computer Vision gibt es einen Algorithmus namens Generalized Hough Transformation, die vielleicht Ihr Problem lösen kann . Es sollte diesen Algorithmus sein Open-Source-Code implementiert haben. Suchen Sie einfach für sie.
Unter der Annahme, es ein einigermaßen rauschfreie Bild ist (kein Video eines Bildschirms), dann einer der einfachen Floodfill Algorithmen funktionieren soll. Möglicherweise müssen Sie eine dilate / erodieren auf dem Bild ausführen, um die Lücken zu schließen.
Der normale Weg Linien zu finden, ist ein Hough-Transformation (dann Linien im rechten Winkel finden) Opencv ist der einfachste Weg.
Werfen Sie einen Blick auf diese Frage OpenCV Objekterkennung - Center Point
Es gibt verschiedene Ansätze, um Ihr Problem. Ich habe gerne einen morphologische Bildverarbeitung Tools wie dieses . Sie haben die Flexibilität, auf „Rechteck“ sogar etwas zu definieren, die nicht „genau geschlossen“ (wobei die Füllung Algorithmus fehlschlagen).
Eine andere Möglichkeit könnte zu verwenden, eine Maschine Ansatz Lernen, die im Grunde mehr Daten- ist wie die vorherigen angetrieben als Definition gesteuert. Sie werden Ihrem Algorithmus mehr „Beispiele“ geben, was ein Rechteck ist, und es wird schließlich lernen (mit
iterate von links nach rechts, bis Sie ein Farbpixel treffen dann modifizierte Flußfüllen Algorithmus verwenden. Weitere Informationen über die algo Flußfüllen @ wiki
wäre ein weiterer Ansatz seine farbiges Pixel auf dem Bild zu finden, dann mit
gowhile(pixel under current is colored)
{
lowest pixel coordinate = pixel under current
current = pixel under
}
Dann das gleiche nach oben. nun u haben eine einzelne Linie definiert. dann verwenden Enden der Linien auf ca. Linien in Rechtecke entsprechen. wenn sie nicht perfekt sind Pixel könnten Sie irgendeine Art von tresholding tun.
Die Flußfüllen funktionieren würde, oder man könnte eine Modifikation eines Kantenverfolgungsalgorithmus verwendet werden.
, was Sie tun, ist: Erstellen einen 2D-Arrays (oder jedes anderen Daten struct d2) - Jede Zeile stellt eine horizontale Pixelzeile auf dem Bildschirm, und jede Spalte eine vertikale Linie
durchläuft alle Pixel von links nach rechts, und wann immer finden Sie ein farbig man seine Koordinaten zu dem Array hinzufügen
iterieren durch das Array und findying Linien und Speichern des Anfangs- und Endpixel für jede eine (andere Datenstruktur)
zu wissen, dass der Beginn jeder Zeile wird der linke / oberer Pixel, können Sie leicht überprüfen, ob alle vier Linien ein Rechteck umfassen
Um aus dem Bild erhalten Sie mit den fast rührend horizontalen und vertikalen Linien müssen nur die Rechtecken:
- Umwandeln in binäre (das heißt alle Linien sind weiß, schwarz ist der Rest)
- Führen Sie eine Binary Dilatation rel="nofollow (hier machen Sie jedes Pixel, das ein berührt oder weißes Pixel in dem Quellenbild ein weißes Pixel in dem Quellenbild weiß. touch ist gerade nur (so dass jedes Pixel „berührt“ die Pixel links, rechts, oben und unten, damit er) dies wird als „4-connected“
- Wiederholen Sie Schritt 3 ein paar Mal, wenn die Lücken zwischen den Enden größer als 2 Pixel breit, aber nicht zu oft!
- Führen Sie eine Skelett-Operation (hier gibt es für jedes Pixel in dem Ausgangsbild schwarz zu machen, wenn es sich um ein weißes Pixel im Quellbild ist, dass es (im Quellbild berührt zumindest ein schwarzes Pixel und die weißen Pixel berührt) alle einander berühren . Wieder mit 4-Verbundenheit definiert berühren. Siehe Beispiel unten.
- Wiederholen Sie Schritt 4, bis das Bild ändert sich nicht nach einer Wiederholung (alle weißen Pixel sind Leitungsende oder Anschlüsse)
Dies wird mit etwas Glück zeigt zuerst die Boxen mit dicken fetten Linien, dicken Fett Artefakte überall auf dem Bild verlassen (nach Schritt 3) und dann anschließend nach Schritt 5 all dicken Fette Artefakte entfernt worden sein, während alle Boxen bleiben. Sie müssen die Anzahl der Wiederholungen in Schritt 3 für die besten Ergebnisse tweek. Wenn Sie in Bild Morphologie interessiert sind, dies ist das Buch ein wirklich guter Einführungskurs habe ich.
Beispiel: (0 = schwarz, 1 = wissen, Pixel in der Mitte eines jeden 3x3-Blockes betrachtet werden, Eingang links Ausgang rechts)
011 => 011
011 => 001 all other white pixels touch, so eliminate
011 => 011
010 => 010
010 => 010 top pixel would become disconnected, so leave
010 => 010
010 => 010
010 => 000 touches only one white pixel, so remove
000 => 000
010 => 010
111 => 111 does not touch black pixels, leave
010 => 010
010 => 010
011 => 011 other pixels do not touch. so leave
000 => 000