Extrahiert Wörter in Rechtecke aus Text

8

Ich habe Mühe, schnell und effizient Wörter zu extrahieren, die sich in einem BufferedImage in Rechtecken befinden.
Zum Beispiel habe ich folgende Seite: (edit!) Das Bild wird gescannt, also kann es Rauschen, Verzerrungen und Verzerrungen enthalten.


Wie kann ich die folgenden Bilder ohne das Rechteck extrahieren: (Bearbeiten!) Ich kann OpenCv oder jede andere Bibliothek verwenden, aber ich bin absolut neu in fortgeschrittenen Bildverarbeitungstechniken.

BEARBEITEN

Ich habe die Methode verwendet, die von karlphillip hier und es funktioniert anständig.
Hier ist der Code:

%Vor%

}


und die Rectangle-Klasse

%Vor%

Beispiel für das Ergebnis:



... obwohl es für kleinere Bilder nicht so gut funktioniert:

Vielleicht können einige Verbesserungen vorgeschlagen werden? Oder wie kann ich den Algorithmus schneller machen, wenn ich einen Batch von zu verarbeitenden Bildern habe?

    
Iulian Rosca 25.04.2014, 09:36
quelle

5 Antworten

6

Ich habe das folgende Programm in C ++ mit opencv gemacht (ich kenne java + opencv nicht). Ich habe die Ausgabe für die beiden von Ihnen bereitgestellten Beispielbilder eingefügt. Möglicherweise müssen Sie die Schwellenwerte im Konturfilterabschnitt für einige andere Bilder anpassen.

%Vor%

Ergebnis für das erste Bild:

Ergebnis für das zweite Bild:

    
dhanushka 03.05.2014, 13:33
quelle
3

Ich bin mir nicht sicher, ob "echte" Bildverarbeitungsfähigkeiten notwendig sind.

Sobald Sie anfangen, dieses Problem mit OpenCV, Sobel / Canny Filtern, Kantenerkennung und Hough Transformationen zu lösen, beginnt es ziemlich involviert zu werden. Aber vielleicht all das ist hier nicht notwendig.

Es hängt alles davon ab, wie "vorhersehbar" die Eingabe ist. Deshalb habe ich in den Kommentaren gefragt, ob das Bild als Testfall dienen kann. Wenn die Rechtecke immer achsausgerichtet sind und kein Rauschen, Verzerrungen und Unterbrechungen aufweisen, kann dies mit einigen trivialen Schleifen und Pixelvergleichen gelöst werden.

Wenn Sie also potentiell verrauschte oder verzerrte Eingabebilder haben, dann ... viel Glück, müssen Sie möglicherweise einige Bildverarbeitungsfähigkeiten erwerben. Wenn das Bild nicht verzerrt oder verrauscht ist, könnte eine Lösung wie diese ausreichen:

%Vor%     
Marco13 25.04.2014 13:19
quelle
3

Hier ist ein Algorithmus, den ich in einem ähnlichen Projekt mit OpenCV demonstriert habe:

Die meisten dieser Referenzen sind nicht in Java, aber ich nehme an, Sie haben die Fähigkeit, C / C ++ - Code in Java zu konvertieren (übrigens, cv::Mat entspricht IplImage ).

    
karlphillip 03.05.2014 02:56
quelle
2

Zunächst hoffe ich, dass Sie sich bereits einiger Bildverarbeitungsprozeduren bewusst sind, da Sie einige davon benötigen, um fortzufahren :)

Hier ist ein Link über Möglichkeiten, dies zu tun: Ссылка

Aber die am häufigsten verwendete Methode wäre, einen Canny (Kantendetektor) zu verwenden und Hough anzuwenden, um die gerade Linie zu erkennen und die Ergebnisse finden das Rechteck. Tatsächlich wird Hough normalerweise verwendet, um eine gerade Linie zu erkennen, und ein Rechteck besteht aus nur 4 geraden Linien mit einem Winkel von 90 ° zwischen jedem von ihnen. Mit all dem können Sie Ihre Forschung verbessern;)

Ich hoffe, es wird helfen;)

    
Clad Clad 25.04.2014 12:14
quelle
1

Eine mögliche Lösung besteht darin, die verbundene Komponentenanalyse nach der Binarisierung unter Verwendung der adaptiven Methode durchzuführen. Berechnen Sie anschließend die mittlere Breite der verbundenen Komponente, wenn die Breite der verbundenen Komponente fünfmal größer ist als die mittlere Breite, dann ist diese verbundene Komponente das Quadrat, nach dem wir suchen. Die folgenden Codes werden verwendet, um diese Idee zu veranschaulichen

%Vor%

Die Ausgabe Rechtecke können angezeigt werden:

    
feelfree 06.05.2014 15:14
quelle