Ich habe dieses Bild, das Text (Zahlen und Alphabete) enthält. Ich möchte die Position aller Texte und Zahlen in diesem Bild ermitteln. Außerdem möchte ich auch den gesamten Text extrahieren.
Wie erhalte ich die Koordinaten sowie den gesamten Text (Zahlen und Alphabete) in meinem Bild? Zum Beispiel 10B, 44, 16, 38, 22B usw.
python
opencv
machine-learning
image-processing
deep-learning
Pulkit Bhatnagar
quelle
quelle
Antworten:
Hier ist ein möglicher Ansatz, bei dem morphologische Operationen verwendet werden, um Nicht-Text-Konturen herauszufiltern. Die Idee ist:
Erhalten Sie ein Binärbild. Laden Sie das Bild, Graustufen und dann Otsus Schwelle
Entfernen Sie horizontale und vertikale Linien. Erstellen Sie horizontale und vertikale Kernel, indem Sie
cv2.getStructuringElement
Linien mit entfernencv2.drawContours
Entfernen Sie diagonale Linien, Kreisobjekte und gekrümmte Konturen. Filtern Sie mithilfe des Konturbereichs
cv2.contourArea
und der Konturnäherungcv2.approxPolyDP
, um Nicht-Text-Konturen zu isolierenText-ROIs und OCR extrahieren. Finden Sie Konturen und filtern Sie mit Pytesseract nach ROIs und dann nach OCR .
Horizontale Linien entfernt, die grün hervorgehoben sind
Vertikale Linien entfernt
Verschiedene Nicht-Text-Konturen (diagonale Linien, kreisförmige Objekte und Kurven) wurden entfernt.
Erkannte Textbereiche
quelle
Okay, hier ist eine andere mögliche Lösung. Ich weiß, dass Sie mit Python arbeiten - ich arbeite mit C ++. Ich gebe Ihnen einige Ideen und hoffe, dass Sie diese Antwort umsetzen können, wenn Sie dies wünschen.
Die Hauptidee ist, überhaupt keine Vorverarbeitung zu verwenden (zumindest nicht in der Anfangsphase) und sich stattdessen auf jedes Zielzeichen zu konzentrieren, einige Eigenschaften zu erhalten und jeden Blob nach diesen Eigenschaften zu filtern .
Ich versuche, die Vorverarbeitung nicht zu verwenden, weil: 1) Filter und morphologische Stadien die Qualität der Blobs beeinträchtigen können und 2) Ihre Ziel-Blobs einige Eigenschaften aufweisen, die wir ausnutzen könnten, hauptsächlich: Seitenverhältnis und Fläche .
Probieren Sie es aus, die Zahlen und Buchstaben scheinen alle größer als breiter zu sein. Außerdem scheinen sie innerhalb eines bestimmten Bereichswerts zu variieren. Sie möchten beispielsweise Objekte "zu breit" oder "zu groß" verwerfen .
Die Idee ist, dass ich alles filtern werde, was nicht in vorberechnete Werte fällt. Ich habe die Zeichen (Zahlen und Buchstaben) untersucht und dabei minimale, maximale Flächenwerte und ein minimales Seitenverhältnis (hier das Verhältnis zwischen Höhe und Breite) angegeben.
Lassen Sie uns am Algorithmus arbeiten. Lesen Sie zunächst das Bild und ändern Sie die Größe auf die Hälfte der Abmessungen. Ihr Bild ist viel zu groß. In Graustufen konvertieren und über otsu ein Binärbild erhalten, hier im Pseudocode:
Cool. Wir werden mit diesem Bild arbeiten. Sie müssen jeden weißen Fleck untersuchen und einen "Eigenschaftenfilter" anwenden . Ich verwende verbundene Komponenten mit Statistiken, um durch jeden Blob zu schleifen und dessen Fläche und Seitenverhältnis zu ermitteln. In C ++ geschieht dies wie folgt:
Jetzt wenden wir den Eigenschaftenfilter an. Dies ist nur ein Vergleich mit den vorberechneten Schwellenwerten. Ich habe folgende Werte verwendet:
for
Vergleichen Sie in Ihrer Schleife die aktuellen Blob-Eigenschaften mit diesen Werten. Wenn die Tests positiv sind, "malen" Sie den Klecks schwarz. Fortsetzung innerhalb derfor
Schleife:Erstellen Sie nach der Schleife das gefilterte Bild:
Und ... das war's auch schon. Sie haben alle Elemente gefiltert, die nicht dem entsprechen, wonach Sie suchen. Wenn Sie den Algorithmus ausführen, erhalten Sie folgendes Ergebnis:
Ich habe zusätzlich die Begrenzungsrahmen der Blobs gefunden, um die Ergebnisse besser zu visualisieren:
Wie Sie sehen, werden einige Elemente falsch erkannt. Sie können den "Eigenschaftenfilter" verfeinern, um die gesuchten Zeichen besser zu identifizieren. Eine tiefere Lösung, die ein wenig maschinelles Lernen erfordert, erfordert die Konstruktion eines "idealen Merkmalsvektors", das Extrahieren von Merkmalen aus den Blobs und das Vergleichen beider Vektoren über ein Ähnlichkeitsmaß. Sie können auch eine Nachbearbeitung anwenden , um die Ergebnisse zu verbessern ...
Was auch immer, Mann, Ihr Problem ist weder trivial noch einfach skalierbar, und ich gebe Ihnen nur Ideen. Hoffentlich können Sie Ihre Lösung implementieren.
quelle
Eine Methode ist die Verwendung eines Schiebefensters (es ist teuer).
Bestimmen Sie die Größe der Zeichen im Bild (alle Zeichen haben dieselbe Größe wie im Bild) und legen Sie die Größe des Fensters fest. Versuchen Sie es mit tesseract zur Erkennung (Das Eingabebild muss vorverarbeitet werden). Wenn ein Fenster Zeichen nacheinander erkennt, speichern Sie die Koordinaten des Fensters. Füge die Koordinaten zusammen und erhalte die Region auf den Zeichen.
quelle