Bildverarbeitung: Wie erkennt man ein viereckiges Schild im Bild?


14

Wie kann ich ein viereckiges Schild aus einem Bild erkennen, das mit einem Mobiltelefon aufgenommen wurde? Wie kann ich Formen wie Rechtecke erkennen? abgerundetes Rechteck (abgerundete Ecken statt Formecken)?

Ich benutze opencv.wrapper, aber ich bin neu darin.

Vielen Dank.

Hier ist das Beispiel: alt text http://www.freeimagehosting.net/uploads/b03442fd36.png

Alternativtext http://www.freeimagehosting.net/uploads/e6b36040e8.png

Aufgrund des Rauschens und der vielen Linien kann ich die Grenzlinie des Schilds nicht bestimmen. Manchmal kann ich die Grenze der Linien nach einer Hough-Transformation finden. Ich bin gefangen ... in dieser Art von Szenario ...

Dies sind die 2 Rohbilder, die von der Handykamera aufgenommen wurden

Alternativtext http://www.freeimagehosting.net/uploads/6dbd613edf.jpg Alternativtext http://www.freeimagehosting.net/uploads/720da20080.jpg

Ich brauche einen Rat, um zu sehen, wie ich das Bild verarbeiten kann, um das Schild herauszubekommen.

Vielen Dank


2
Stichwörter: opencv, hough transform Duplikate: stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

Ja, aber verwandle FTW!

aber es gibt Rauschen im Bild, wie kann ich herausfinden, welche Grenze des Schildes ist

@ Xabi123: Hough Transformation, Schwelle, ausgelesene Grenze

1
Könnten Sie ein Beispielbild teilen?

Antworten:


7

Beide Bilder enthalten viele Linien, die nichts mit dem gesuchten Zeichen zu tun haben. Und einige dieser Linien sind länger / kontrastreicher als die von Ihnen gewünschten, sodass ich denke, dass das Erkennen der Kantenlinien (z. B. mithilfe einer Hough-Transformation oder durch horizontales / vertikales Aufsummieren von Kontrasten) nicht funktioniert.

Aber: Das Zeichen, nach dem Sie suchen, hat andere Eigenschaften, die leichter zu erkennen sein sollten:

  • Dort hat Zeichenhintergrund (fast) konstante Helligkeit
  • Es nimmt einen relativ großen Bereich des Bildes ein
  • Es ist in der Nähe der Bildmitte

Sie suchen also einen großen zusammenhängenden Bereich mit geringem Kontrast. Ich habe in Mathematica einen Proof-of-Concept-Algorithmus gehackt. (Ich bin kein OpenCV-Experte, aber ich werde die jeweilige OpenCV-Funktion erwähnen, wenn ich sie kenne.)

Zuerst benutze ich Gauß'sche Ableitungsfilter, um die Gradientengröße bei jedem Pixel zu erfassen. Das Filter mit Gauß-Ableitung hat eine große Apertur (in diesem Fall 11 x 11 Pixel) und ist daher sehr rauschunempfindlich. Ich normalisiere dann das Gradientenbild auf mean = 1, damit ich für beide Samples die gleichen Schwellenwerte verwenden kann.

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

OpenCV-Implementierung: Sie können sepFilter2Dfür die eigentliche Filterung verwenden, aber anscheinend müssen Sie die Filterkernwerte selbst berechnen .

Das Ergebnis sieht so aus:

Gradientengröße

In diesem Bild ist der Zeichenhintergrund dunkel und die Zeichenränder sind hell. So kann ich dieses Bild digitalisieren und nach dunkel verbundenen Komponenten suchen.

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

OpenCV-Implementierung: Thresholding sollte unkompliziert sein, aber ich denke, OpenCV enthält keine Analyse verbundener Komponenten - Sie können entweder Flood Fill oder verwenden cvBlobsLib verwenden .

Suchen Sie nun einfach den größten Fleck in der Nähe der Bildmitte und die konvexe Hülle (ich habe einfach den größten Fleck verwendet, der nicht mit dem Hintergrund verbunden ist, der jedoch möglicherweise nicht für jedes Bild ausreicht).

Ergebnisse: Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben


0

Ein anderer Ansatz, der für Rauschen in dieser Situation robuster ist, besteht darin, eine Kurve des mittleren Graupegels des Bildes entlang der x-Achse und entlang der y-Achse zu erstellen. Das heißt, berechnen Sie den mittleren Graupegel für jede Zeile / Spalte im Bild.

Wenn zum Beispiel das Schild (oder seine Ränder) heller als seine Umgebung ist (was für alle in der Frage gezeigten Beispiele der Fall ist), haben Sie zwei Peaks in Ihrer x-Achsen-Kurve (für die linke und die rechte und die Ränder) ) und zwei Peaks in Ihrer y-Achsen-Kurve (für den oberen und unteren Rand). Unter Verwendung einer Randerkennungstechnik für ein eindimensionales Signal (möglicherweise ein Hochpassfilter) können Sie die Eckenkoordinaten des Schilds ableiten.

Ich habe gesehen, dass dieser Ansatz zur Erkennung von Kennzeichen und zur Gesichtserkennung verwendet wird (die Nase ist in der Regel der hellere Teil des Gesichts, sodass eine Spitze in den Kurven der x- und y-Achse erzeugt wird).


hmm .. was ist wenn das schild gedreht oder die kamera gerollt wird?
Mustafa

0

Dies könnte eine verkehrte Idee sein, aber es könnte sich lohnen, sie auszuprobieren. Anstatt zu versuchen, den korrekten Bereich zu erkennen und den Text wie Rauschen zu betrachten , können Sie den Text möglicherweise wie Informationen behandeln und ihn verwenden, um den richtigen Bereich leichter zu erkennen.

Hier ist der Umriss der Idee:

  • Erkennen Sie den Text im Bild . Es muss keine robuste Implementierung sein (Sie sollten in der Lage sein, eine kleine Bibliothek zu googeln, die das tut, oder OpenCV hat es vielleicht), nur eine grobe Schätzung des Textes im Bild
  • Finden Sie den Zener aller Texterkennungen . Auch bei verrauschten Bildern sollte es sich um den realen Ort handeln
  • Harte Rechteckentfernung im Bereich um die Texterkennung . Verwenden Sie möglicherweise den mittleren Abstand von der Mitte der Texterkennung oder ähnliches. Mache verschiedene Durchmesser und nimm den stärksten Rückruf .

Die Erklärungen und Vorteile:

  • Der Bereich um den Text ist normalerweise homogen - das echte Rechteck sollte der erste starke Rückruf sein
  • Auf diese Weise müssen Sie nicht das gesamte Bild stark transformieren, damit Sie es mehrmals auf derselben Fläche, aber mit unterschiedlichen Schaufelgrößen ausführen können.
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.