Schnelle Bildschwellenbildung
Was ist eine schnelle und zuverlässige Möglichkeit zur Schwellenwert-Bilder mit möglichen Unschärfen und nicht-gleichmäßige Helligkeit?
Beispiel (Unschärfe, aber gleichmäßige Helligkeit):
Weil das Bild ist nicht garantiert gleichmäßige Helligkeit, es ist nicht möglich, mit einer festen Schwelle. Einer adaptiven Schwelle arbeitet, in Ordnung, aber wegen der Unschärfe schafft es Brüche und Verzerrungen der Funktionen (hier werden die wichtigsten Funktionen sind die Sudoku-stellig):
Ich habe auch versucht mit Hilfe des Histogramm-Entzerrung (Verwendung von OpenCV ist equalizeHist
- Funktion). Es erhöht den Kontrast, ohne die Verringerung der Unterschiede in der Helligkeit.
Die beste Lösung, die ich gefunden habe, ist die Teilung des Bildes durch seine morphologische Schließung (Kredit dieser Beitrag), um die Helligkeit uniform, dann renormalize, dann verwenden Sie eine Feste Schwelle (mit Otsu ' s Algorithmus zur Auswahl des optimalen threshold-level):
Hier ist der code für diese in OpenCV für Android:
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(19,19));
Mat closed = new Mat(); //closed will have type CV_32F
Imgproc.morphologyEx(image, closed, Imgproc.MORPH_CLOSE, kernel);
Core.divide(image, closed, closed, 1, CvType.CV_32F);
Core.normalize(closed, image, 0, 255, Core.NORM_MINMAX, CvType.CV_8U);
Imgproc.threshold(image, image, -1, 255, Imgproc.THRESH_BINARY_INV
+Imgproc.THRESH_OTSU);
Dies funktioniert gut, aber die schließen-operation ist sehr langsam. Die Reduzierung der Größe des strukturierenden Elements erhöht die Geschwindigkeit, verringert aber die Genauigkeit.
Edit: basierend auf den DCS-Vorschlag, versuchte ich mit einem high-pass-filter. Ich entschied mich für den Laplace-filter, aber ich würde erwarten, dass ähnliche Ergebnisse mit Sobel-und Scharr-Filter. Der filter nimmt Hochfrequenz-Störungen in den Bereichen, die nicht die Merkmale enthalten, und Sie leidet unter ähnlichen Verzerrung der adaptiven Schwelle wegen der Unschärfe. es dauert auch etwa so lange als der Schließvorgang. Hier ist ein Beispiel mit einem 15x15-filter:
Edit 2: Basierend auf AruniRC die Antwort, die ich verwendet, Canny Kantendetektion auf dem Bild mit den vorgeschlagenen Parametern:
double mean = Core.mean(image).val[0];
Imgproc.Canny(image, image, 0.66*mean, 1.33*mean);
Ich bin nicht sicher, wie zuverlässig automatisch fine-Tuning der Parameter zu gelangen stellen.
InformationsquelleAutor der Frage 1'' | 2013-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit Vaughn Cato und Theraot Anregungen, die ich verkleinert das Bild, bevor Sie es schließen, dann skaliert das geschlossene Bild bis zur normalen Größe. Ich auch reduziert die kernel-Größe proportional.
Bild unten zeigt die Ergebnisse side-by-side für 3 verschiedene Methoden:
Links - reguläre Größe zu schließen (432 Pixel), Größe 19 kernel -
Mitte - halbe Größe zu schließen (216 Pixel), Größe 9 kernel
Rechts - Viertel-Größe zu schließen (108 Pixel), Größe 5 kernel
Sich die Bildqualität verschlechtert, da die Größe des Bildes, das für das schließen kleiner wird, aber die Verschlechterung ist nicht signifikant genug, um Einfluss auf die feature-Erkennung algorithmen. Die Geschwindigkeit erhöht sich von etwas mehr als 16-Fach für die Viertel-Größe schließen, auch mit dem ändern der Größe, was darauf hindeutet, dass Feierabend ist in etwa proportional zur Anzahl der Pixel im Bild.
Irgendwelche Vorschläge, wie weiter zu verbessern, auf diese Idee (entweder durch eine weitere Verringerung der Geschwindigkeit oder Reduzierung von der Verschlechterung der Bildqualität) sind sehr willkommen.
InformationsquelleAutor der Antwort 1''
Alternativer Ansatz:
Vorausgesetzt Ihre Absicht ist es, die Ziffern sind deutlich binarized ... verlagern Sie Ihr Fokus auf Komponenten anstatt das gesamte Bild.
Hier ist ein ziemlich einfaches Konzept:
Prüfung der Canny edge als eine zusammenhangskomponente (also das cvFindContours() oder der C++ - Pendant, je nachdem) kann man abschätzen, Vordergrund und hintergrund greylevels und einen Schwellenwert erreichen.
Für das Letzte Stück nehmen Sie einen Blick auf Abschnitt 2. und 3. der dieses Papier. Überspringen die meisten der nicht-essentiellen theoretischen Teile es sollte nicht allzu schwer haben es umgesetzt in OpenCV.
Hoffe, dass dies geholfen!
Edit 1:
Basiert auf der Canny-edge-Schwellenwerte hier ist eine sehr grobe Idee, gerade ausreichend, um die Feinabstimmung der Werte. Die
high_threshold
steuert, wie stark eine Kante sein muss, bevor es erkannt wird. Im Grunde, eine Kante muss gradient magnitude größer alshigh_threshold
erkannt werden, in den ersten Platz. Das spielt also die Initiale Erkennung von Kanten.Nun, die
low_threshold
befasst sich mit der Verbindung in der Nähe der Kanten. Es steuert, wie viel in der Nähe getrennt Kanten werden kombiniert zusammen in einer einzigen Kante. Für eine bessere Vorstellung, Lesen "Schritt 6" von diese Webseite. Versuchen Sie es mit einer sehr kleinen low_threshold und sehen, wie die Dinge zustande kommen. Sie könnte verwerfen, dass 0.66*[Mittelwert] Sache, wenn es funktioniert nicht auf diese Bilder - es ist nur eine Faustregel sowieso.InformationsquelleAutor der Antwort AruniRC
Verwenden wir Bradleys Algorithmus bei sehr ähnlichen problem (segment-Buchstaben hintergrund, mit unebenen Licht und ungleichmäßige hintergrund-Farbe), beschrieben hier: http://people.scs.carleton.ca:8008/~roth/iit-Veröffentlichungen-iti/docs/gerh-50002.pdfC# - code hier: http://code.google.com/p/aforge/source/browse/trunk/Sources/Imaging/Filters/Adaptive+Binarization/BradleyLocalThresholding.cs?r=1360. Es funktioniert auf integral image berechnet werden kann mithilfe
integral
- Funktion von OpenCV. Es ist sehr zuverlässig und schnell, aber selbst nicht umgesetzt, OpenCV, aber ist einfach zu port.Weitere option ist adaptiveThreshold Methode in openCV, aber wir haben nicht, es zu versuchen: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#adaptivethreshold. Die MITTLERE version ist die gleiche wie bradleys, außer, dass es verwendet eine Konstante zu ändern, der mittlere Wert statt einer Prozentzahl, die ich denke, ist besser.
Ebenfalls guter Artikel ist hier: https://dsp.stackexchange.com/a/2504
InformationsquelleAutor der Antwort Oliv
Könnten Sie versuchen, die Arbeit auf einer pro-Kachel-basis wenn Sie wissen, Sie haben eine gute Ernte des Feldes. Arbeiten am 9 Einzelbilder, anstatt die gesamte pic wird wahrscheinlich führen zu einer gleichmäßigeren Helligkeit auf jedem Einzelbild. Wenn Ihr das Kupieren ist perfekt, Sie könnte sogar versuchen Sie, für jede Ziffer, Zelle einzeln, aber es hängt alles davon ab, wie zuverlässig ist Ihre Ernte.
InformationsquelleAutor der Antwort amadillu
Ellipse Form ist Komplex zu berechnen, wenn im Vergleich zu einer flachen Form.
Versuchen zu ändern:
:
beschleunigen kann genug Lösung mit geringen Auswirkungen auf die Genauigkeit.
InformationsquelleAutor der Antwort Duloren