2016-06-05 15 views
20

Ich möchte die Zahl von dieser Art von Bild erfassen.Wie verschwommene Zahlen mit openCV klassifiziert werden

enter image description here

ich versuchte, auf den folgenden Link mehrskaligen Anpassung.

http://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/

Alles, was ich wissen will, ist die rote Zahl. Aber das Problem ist, die rote Zahl ist verschwommen für OpenCV Recognize/Match-Vorlage. Wäre es möglich, diese rote Zahl auf dem schwarzen Hintergrund zu erkennen?

+0

Multi-Skala wird Ihnen nicht helfen, das Bild klarer, leider zu lösen. Darüber hinaus müssen Sie entweder mehrere Schriftarten erkennen oder die zu erkennenden Schriftarten priorisieren (z. B. die oben genannte Zahl). Check out [diese Frage] (http://stackoverflow.com/questions/7765810/is-there-a-way-to-detect-if-an-image-is-blurry) – Aaron3468

+0

Hier sind einige der neuesten Forschungsansätze: 1) [Mehrstellige Zahlenerkennung von Street View-Bildern unter Verwendung von Deep Convolutional Neural Networks] (http://research.google.com/pubs/pub42241.html); 2) [Text in freier Wildbahn lesen] (http://www.robots.ox.ac.uk/~vgg/research/text/). Ein tiefes konvolutionelles neuronales Netzwerk ist der gemeinsame Baustein für diese Ansätze. – Jon

Antwort

18

Klassifizieren Digits

Sie in den Kommentaren zu klären, die Sie bereits die Nummer Teil des Bildes Vorerfassungskombinatoren isoliert habe, so werde ich unter dieser Annahme aus.

Vielleicht können Sie die perspektivische Effekte und "Verschwommenheit" der Zahl annähern, indem Sie es als handschriftliche Nummer behandeln. In diesem Fall gibt es einen berühmten Datensatz handgeschriebener Zahlen für das Klassifikationstraining namens mnist.

Yann LeCun hat hier den Stand der Technik zu diesem Datensatz mnist hand-written dataset aufgezählt.

Am Ende des Spektrums ergeben faltungsneurale Netzwerke outrageously low error rates (Bruchstellen von 1% Fehler). Für eine einfachere Lösung ergaben k-nächste Nachbarn unter Verwendung von Entzerrung, Rauschentfernung, Unschärfe und 2-Pixel-Verschiebung einen Fehler von etwa 1% und sind wesentlich schneller zu implementieren. Python opencv has an implementation. Neuronale Netzwerke und Support-Vektor-Maschinen mit Entzerrung haben auch einige ziemlich beeindruckende Leistungswerte.

Beachten Sie, dass bei Convolutional Networks keine eigenen Features ausgewählt werden müssen. Daher können die wichtigen Farbdifferenzinformationen hier nur zum Einschränken der Region of Interest verwendet werden. Andere Ansätze, bei denen Sie Ihren Merkmalsraum definieren, können den bekannten Farbunterschied genauer einbeziehen.

Python unterstützt eine Menge maschineller Lerntechniken im grandiosen Paket sklearn - here are examples of sklearn applied to mnist. Wenn Sie sich für eine tutorialized Erklärung des maschinellen Lernens in Python, sklearn's own tutorial is very verbose

Vom sklearn Link: Classifying mnist

Das sind die Arten von Elementen Sie versuchen zu klassifizieren, wenn Sie mit diesem lernen Ansatz. Um zu betonen, wie einfach es zu starten ist, einige dieser Maschine lernbasierte Klassifizierer trainiert, hier ist ein gekürzter Abschnitt aus dem Beispielcode in dem verknüpften sklearn Paket:

digits = datasets.load_digits() # built-in to sklearn! 
data = digits.images.reshape((len(digits.images), -1)) 

# Create a classifier: a support vector classifier 
classifier = svm.SVC(gamma=0.001) 

# We learn the digits on the first half of the digits 
classifier.fit(data[:n_samples/2], digits.target[:n_samples/2]) 

Wenn Sie vermählt OpenCV (möglicherweise, weil Sie wollen in Zukunft auf ein Echtzeitsystem portieren), opencv3/python has a tutorial on this exact topic too! Ihre Demo verwendet k-nearest-neighbor (aufgelistet auf der LeCun-Seite), aber sie auch have svms und die vielen anderen Tools in sklearn.Ihre ocr Seite SVM mit verwendet Deskewing, die mit der Perspektive Wirkung in Ihrem Problem nützlich sein könnte:

Deskewed digit


UPDATE: habe ich die out-of-the-Box skimage oben geschilderten Ansatz auf Ihr Bild, stark beschnitten, und es korrekt klassifiziert. Ein viel mehr Tests erforderlich wäre, um zu sehen, ob diese Praxis Rhobust in ist

enter image description here

^^ Das kleine Bild der 8x8 Ernte des Bildes ist, dass Sie in Ihrer Frage eingebettet. Mist ist 8x8 Bilder. Deshalb trainiert es in weniger als einer Sekunde mit Standardargumenten in skimage.

ich konvertiert es das richtige Format, indem sie es bis zum mnist Bereich Skalierung mit

number = scipy.misc.imread("cropped_image.png") 
datum = (number[:,:,0]*15).astype(int).reshape((64,)) 
classifier.predict(datum) # returns 8 

ich nichts anderes aus dem Beispiel geändert haben; Hier verwende ich nur den ersten Kanal für die Klassifizierung und keine Smart-Feature-Berechnung. 15 sah mich richtig an; Sie stimmen müssen sie innerhalb des Zielbereiches oder (im Idealfall) geben Sie Ihre eigene Ausbildung und Prüfung setzte


Objekterkennung

Wenn Sie die Nummer nicht in dem Bild, isoliert haben erhalten Du brauchst einen Objektdetektor. Der Literaturraum zu diesem Problem ist gigantisch und ich werde nicht mit diesem Kaninchenloch anfangen (google Viola und Jones, vielleicht?) This blog deckt die Grundlagen eines "gleitenden Fenster" -Detektors in Python ab. Adrian Rosebrock sieht aus, als hätte er sogar einen Beitrag zu SO geleistet, und auf dieser Seite gibt es einige gute Beispiele für OpenCV- und Python-basierte Objektdetektoren, die ziemlich angelernt sind (du hast in deiner Frage tatsächlich mit diesem Blog in Verbindung gestanden, was ich nicht bemerkt habe).

Kurz gesagt, klassifizieren Sie Fenster über das Bild und wählen Sie das Fenster mit der höchsten Zuverlässigkeit. Eingrenzung der Suchraum nach unten mit einer Region von Interesse wird natürlich Ausbeute enorme Verbesserungen in allen Bereichen der Leistung

+0

oh danke en_Knight. Da ich opencv sehr neu bin, würden Sie mich bitte auf einige Tutorials verweisen, wie Sie diese Klassifizierungsfunktionen von Python nutzen können? Mein erster Versuch würde das Bild zuschneiden, so dass der schwarze Hintergrund und die roten Ziffern nur erscheinen. Dann durch Klassifikator laufen, um die Ziffer zu identifizieren? Klingt es legitim? – spencerJANG

+0

Das klingt nach einem großartigen Ansatz. Wenn Sie das Bild zuschneiden können, wird das Problem 10.000 mal mehr Spaß; In meinem Beispiel, in dem wir ihr integriertes Zahlen-Dataset verwendet haben, um einen Klassifizierer zu trainieren, habe ich Ihr Bild um die Zahl gekürzt und dann auf 8x8 herunterskaliert. ist das skimage Link schwer zu folgen? Ich kann nach einigen Alternativen suchen, es gibt sicherlich eine Menge Klassifizierungs-Tutorials da draußen –

+0

Datum = (Nummer [:,:, 0] * 15) .asyphe (int) .reshape ((64,)) ---- --- Ich bin mir nicht sicher, ob ich diese Zeile verstehe. Könntest du mir das im Detail erklären? Ich nehme an, dass es das beschnittene Bild zu 8x8 ändert, aber wenn ich versuche, erhalte ich einen Wertfehler, der sagt, dass Feldgröße unverändert sein muss. – spencerJANG

2

Sie haben ein paar Dinge, die Sie zu Ihrem Vorteil nutzen können:

  • Die Zahl ist im schwarz rechteckige Lünette und eine Farbe
  • Die Nummer scheint eine segmentierte LCD-Anzeige zu sein, wenn also nur eine endliche Anzahl von Segmenten ein- oder ausgeschaltet ist.So

Ich schlage vor, Sie:

  • Kamera kalibrieren und Vorprozess der Bildlinsenverzerrung
  • Beseitigen Sie die Anzeigerechteck zu entfernen:
    • die Anzeige Rechteck erkennen entweder die Kreuzung der Verwendung hough Linien, oder Kantenerkennung gefolgt von Konturerkennung und dann wählen die größte, quadratische Konturen
    • Verwendung GetPerspectiveTransform die Transformation zwischen den Bildkoordinaten und einem idealen Rechteck zu erhalten, dann Verwendung WarpPerspective
  • Split Bild in R, G und B-Kanäle, um das Eingangsbild zu transformieren und r - avg(g, b) arbeiten, ist dies ein wenig Beleuchtung abhängig, aber sollte wie folgt geben:

    cleaned up number image

  • Dann entweder versuchen, Muster auf diese passend, oder vielleicht das Bild erneut Segment und versuchen zu finden, welche Anzeigesegmente leuchten, oder laufen durch einen O CR-Paket.
+0

"Calibrate your camera" Wie viel davon funktioniert, wenn er nicht über die Kameraparameter verfügt? –

+0

Es wird wahrscheinlich ohne es funktionieren, kann die 'GML C++ Kamera Calibration Toolbox' oder ähnliches verwenden, wenn Sie die Kamera-Parameter nicht kennen –