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!

War es hilfreich?

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: alt text
(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

wäre ein weiterer Ansatz seine farbiges Pixel auf dem Bild zu finden, dann mit

go
while(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:

  1. Umwandeln in binäre (das heißt alle Linien sind weiß, schwarz ist der Rest)
  2. 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“
  3. Wiederholen Sie Schritt 3 ein paar Mal, wenn die Lücken zwischen den Enden größer als 2 Pixel breit, aber nicht zu oft!
  4. 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.
  5. 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    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top