Entfernen Hintergrundgeräusche aus dem Bild, um text klarer OCR
Ich habe eine Anwendung geschrieben, die Segmente eines Bildes auf der Grundlage der text-Regionen innerhalb es, und extrahiert den Regionen, so wie ich das sehe passen. Was ich versuche zu tun ist, reinigen Sie das Bild so, dass OCR (Tesseract) gibt ein genaues Ergebnis. Ich habe Folgendes Bild als Beispiel:
Läuft das durch tesseract gibt ein weit ungenauen Ergebnis. Jedoch die Reinigung der Bild (mit photoshop), um das Bild wie folgt:
Gibt genau das Ergebnis, das ich erwarten würde. Das erste Bild ist bereits ausgeführt wird, durch die folgende Methode, um es sauber zu diesem Punkt:
public Mat cleanImage (Mat srcImage) {
Core.normalize(srcImage, srcImage, 0, 255, Core.NORM_MINMAX);
Imgproc.threshold(srcImage, srcImage, 0, 255, Imgproc.THRESH_OTSU);
Imgproc.erode(srcImage, srcImage, new Mat());
Imgproc.dilate(srcImage, srcImage, new Mat(), new Point(0, 0), 9);
return srcImage;
}
Was kann ich tun, um sauber das erste Bild so ähnelt es dem zweiten Bild?
Edit: das ist das original Bild, bevor es durch die cleanImage
Funktion.
- Hi, wird sich so schnell wie möglich. Cheers.
- Ich habe das original-image, bevor es verarbeitet.
- Wenn man weiß, der text ist immer in etwa in der Mitte des Bildes, den Sie entfernen konnte angeschlossenen Segmente der dunklen Pixel, wo keine pixel in dem segment ist außerhalb einiger Entfernung von den Kanten. Wenn Sie weiß, daß der text immer die gleiche Größe, die Sie entfernen konnte angeschlossenen Segmente dunkler text, der weniger als einige Grenze für die Anzahl der Pixel in Ihnen. Wenn Sie Einklang das Bild irgendwie, und die zahlen sind alle die gleiche Höhe, die Sie könnten versuchen, und berechnen Sie eine Obere Zeile und eine untere Zeile und werfen Ausreißer. Wenn es immer 4 Ziffern, die Sie verwenden konnten zum entfernen von Segmenten größer als 4 auf einige Regel.
- Sie können filter Rauschen Segmente (angeschlossene Komponenten) in der Nähe von Bildrändern (ich. e. verbunden mit image borders): in Ihnen Probe erforderlich text sind nicht an der Grenze.
- Ist runitme wichtig, tatsächlich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Antwort basiert auf folgenden Annahmen. Es ist möglich, dass keiner von Ihnen hat in Ihrem Fall.
Dies ist meine Vorgehensweise für die Extraktion der Ziffern:
Schwelle der Abstand transformierte Bild mit dem Schlaganfall-Breite ( = 8) Einschränkung
Anwenden morphologische operation zu trennen
Filter bounding box Höhen und stellen Sie eine Vermutung auf, wo die Ziffern sind
stroke-width = 8
stroke-width = 10
BEARBEITEN
Bereiten Sie eine Maske mithilfe der convexhull der gefunden Ziffer Konturen
Kopieren Ziffern region, um ein sauberes Bild mit der Maske
stroke-width = 8
stroke-width = 10
Meine Tesseract wissen ist ein wenig eingerostet. Soweit ich mich erinnere kann man eine confidence level für die Charaktere. Sie können in der Lage sein, heraus zu filtern, Lärm mit Hilfe dieser Informationen, wenn Sie immer noch passieren um zu erkennen, lauten Regionen als Charakter bounding-Boxen.
C++ - Code
BEARBEITEN
Java-Code
convexHull
bieten nicht die gleichen Ergebnisse erzielen, wie Sie oben dargestellt ist. Ich habe den code hier: pastebin.com/KfYFu1vkopencv
wird vollständig unterstützt, auf iOS.Ich denke, Sie müssen mehr arbeiten auf dem pre-processing Teil vorzubereiten, das Bild klar zu sein, so viel wie Sie können, bevor der Aufruf von tesseract.
Was von meinen Ideen zu tun, sind die folgenden:
1 - Extrahieren Sie die Konturen aus dem Bild und finden Sie die Konturen im Bild (check diese) und diese
2 - die Einzelnen Konturen haben Breite, Höhe und Fläche, so filtern Sie die Konturen nach, um der Breite, der Höhe und seine Umgebung (check diese und diese), plus benutzen, können Sie einen Teil der Kontur-Analyse code hier zu filtern, die Konturen und vieles mehr können Sie löschen die Konturen sind nicht vergleichbar mit einem "Buchstabe oder Zahl" Kontur mit einer Schablone die Kontur-matching.
3 - Nach dem filtern der Kontur können Sie überprüfen, wo sind die Buchstaben und die zahlen in diesem Bild, so müssen Sie möglicherweise verwenden Sie einigen text-detection-Methoden wie hier
4 - Alle was Sie brauchen, jetzt, wenn zum entfernen der nicht-text-Bereich, und die Konturen sind nicht gut aus das Bild
5 - Jetzt können Sie Ihre binirization Methode oder Sie können die tesseract one zu tun, die binirization auf das Bild, dann rufen Sie die OCR auf dem Bild.
Sicher, dass diese sind die besten Schritte, um dies zu tun, können Sie einige von Ihnen und kann es genug für Sie.
Andere Ideen:
Benutzen, können Sie verschiedene Möglichkeiten, dies zu tun ist die beste Idee ist, einen Weg zu finden, zu erkennen, die Zahl und der Standort der Figur, die mit anderen Methoden wie template-matching oder feature-basiert wie SCHWEIN.
Können Sie zunächst zu tun Binarisierung auf Ihr Bild und bekommen das binäre Bild, dann bewerben Sie sich öffnen mit line-Strukturfonds für die horizontale und die vertikale und dies wird Ihnen helfen, zu erkennen, die Kanten nach, und das tun die Segmentierung auf das Bild, dann die OCR-Funktion.
Nach erkennen der Konturen im Bild, Sie können auch
Hough transformation
zu erkennen, jede Art von Linie und Kurve definiert, wie dies ein, und auf diese Weise können Sie erkennen, dass die Zeichen, die sind gefüttert, so können Sie segmentieren das Bild und führen Sie die OCR danach.Viel einfacheren Weg:
1 - binirization
2 - Einige Morphologie Betrieb zu trennen, die Konturen:
3 - Inverse die Farbe im Bild ist (kann vor Schritt 2)
4 - Finden Sie alle Konturen im Bild
5 - Löschen Sie alle Konturen, die Breite ist mehr als hoch ist, löschen Sie die sehr kleine Konturen, die sehr hoch sind, und die kein Rechteck Konturen
Hinweis : Sie dürfen den text detection-Methoden (oder mit SCHWEIN-oder edge-detection) anstelle von Schritt 4 und 5
6 - Finden Sie die große Rechteck, das enthält alle übrigen Konturen im Bild
7 - Sie können tun, einige zusätzliche pre-processing zu verbessern, die den input für die tesseract dann können Sie rufen Sie die OCR-jetzt. (Ich rate Ihnen, das Bild zuzuschneiden und es als ein input für die OCR - [ich meine-Ernte des gelben Rechtecks, und machen Sie nicht das gesamte Bild als input gerade das gelbe Rechteck und verbessern die Ergebnisse auch])
Wäre das Bild Ihnen helfen?
Der Algorithmus produziert, dass Bild wäre einfach zu implementieren. Ich bin sicher, wenn Sie zwicken einige der Parameter, können Sie sehr gute Ergebnisse für diese Art von Bildern.
Getestet habe ich alle Bilder mit tesseract:
tesseract -psm 7 yourimage.png digits
wird die Kraft von tesseract erkennt nur Ziffern. Könntest du bitte posten Sie Ihre Methode zur Reduzierung der Bild oben?Nur ein wenig zu denken, out of the box:
Kann ich sehen, von Ihrem ursprünglichen Bild, dass es ein ziemlich rigoros vorformatierte Dokument, sieht aus wie eine KFZ-Steuer-Ausweis oder sowas, richtig?
Wenn die Annahme oben richtig ist, dann könnte man implementieren, die eine weniger generische Lösung: Der Lärm, den Sie versuchen, um loszuwerden, ist durch Merkmale der spezifischen Dokument-Vorlage, es tritt in bestimmten, bekannten Regionen des Bildes. In der Tat, nicht so der text.
In diesem Fall eine der Möglichkeiten, darüber zu gehen ist, definieren die Grenzen der Regionen, in denen Sie wissen, dass es so "Rauschen" und nur weiß Sie Sie heraus.
Dann Folgen Sie den rest der Schritte, die Sie bereits Folgendes: die noise reduction", um die feinsten Details (z.B. die hintergrund-Muster, das aussieht wie die Sicherheit, Wasserzeichen oder Hologramm in den Abzeichen). Das Ergebnis sollte klar sein, genug für Tesseract zu verarbeiten, ohne Probleme.
Nur ein Gedanke sowieso. Nicht eine generische Lösung, ich erkennen an, dass, also es hängt davon ab, was Ihre tatsächlichen Bedürfnisse sind.
Die Schriftgröße sollte nicht so groß sein oder klein, etwa im Bereich von 10-12 pt(der ich.e -, Zeichen-Höhe etwa über 20 und weniger als 80). Sie können sich eine Probe von der Bild und versuchen Sie es mit tesseract. Und einige Schriftarten sind nicht geschult im tesserakt, das Problem kann entstehen, wenn es nicht in diesem ausgebildet Schriften.