Erkennung der Textausrichtung
Zu erkennen, wie Ausrichtung von text in ein Bild?
Dabei spielt es keine Rolle, ob die Ausrichtung ist auf den Kopf gestellt (180 Grad).. Aber wenn der text vertikal (90 oder 270 Grad) muss ich drehen Sie es um 90 Grad.
Ich hoffe, möglichst ohne OCR, weil es zu viel Ressourcen für die Verarbeitung von OCR 4 verschiedenen Ausrichtungen das gleiche Bild
Der Grund ist, dass ich mit scantailor auf Bilder von einer digitalen Kamera oder Smartphone, wenn Sie die text-Ausrichtung ist um 90 oder 270 Grad manchmal das Bild ist beschnitten und der text ist verloren
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die vorgeschlagene Lösung (Hough-Transformation) gut ist (und ich von Ihnen positiv bewertet werden), aber es könnte sein, CPU-intensiv.
Hier ist eine schnelle schmutzige Lösung:
Hinweis: Die beschriebene Lösung ist etwas weniger genau als die Hough-Transformation, aber es ist sehr einfach zu implementieren, extrem schnell (die Gesamte Verarbeitung ist schneller als nur die Berechnung der Ableitungen des Bildes) + erhalten Sie kostenlos die Ausrichtung der Textzeilen + - partition des Dokuments in Zeilen & Spalten.
Glück
Addition & Klarstellung zu Schritt 1: Erläuterung von Schritt eins. Angenommen, Sie haben ein Bild der Breite W' und Höhe H ' und einem schwarzen text auf weißem hintergrund. Durch eine horizontale Projektion der Summe der Werte der Pixel in jeder Zeile. Das Ergebnis ist ein Vektor der Länge "H".
Pixel-Zeilen, die nicht enthalten alle Teile des Textes (sich also zwischen der text-Zeile) wird der Ertrag einer hohen Projektion Werte (da-hintergrund ist weiß - 255). Pixel-Zeilen, die sind Teile von Buchstaben wird der Ertrag einer niedrigeren Projektion Werte.
So, jetzt haben Sie den Vektor, der die Länge H und Sie möchten, um zu sehen, ob es gibt eine klare Teilung der Werte, die innerhalb es. Eine Gruppe von hohem Werte, als eine Gruppe von low-Werte, etc (wie zebra-Streifen). Beispiel: wenn Sie 20 Pixel Abstand zwischen text und jeder Buchstabe hat eine Höhe von 16 Pixel, die Sie erwarten, dass die Projektion eines Vektors haben 20 große Werte, gefolgt von 16 niedrige zahlen, gefolgt von 20 hohe Werte, 16 tief, usw. Natürlich, das Dokument ist nicht ideal, jeder Buchstabe hat eine verschiedene Höhe, einige haben Löcher: (wie 't' und 'f', 'i'), aber die Allgemeine Regel der partition enthält.
Im Gegenteil, wenn Sie drehen Sie das Dokument um 90 Grad und jetzt ist Ihre Summe nicht ausrichten Zeilen text - das Ergebnis-Vektor wird nur grob random 'H' - Werte ohne klare Teilung in Gruppen.
Alles was Sie jetzt tun müssen, ist zu entscheiden, ob Ihr Ergebnis-Vektor hat eine gute partition oder nicht.
Eine schnelle Möglichkeit, dies zu tun ist die Berechnung der Standardabweichung der Werte. Wenn es eine partition - die std hoch sein wird, sonst wird es niedriger sein.
Ein anderer Weg ist, um beispielsweise binarisieren Ihre Projektion Vektor, behandeln Sie es als ein neues Bild der Größe 1xH, Mittag-connected components Analyse und extrahieren Sie die blobs. Dies ist sehr schnell, da die blobs sind ein-dimensional. Also die hellen kleckse markieren grob die Bereiche zwischen Zeilen und die dunklen Löcher markieren Sie die Textzeilen. Wenn Ihre Summe war gut (Vektor hatte eine klare Teilung) - Sie haben einige große blobs (die Höhe der blobs ~ etwa als Menge von Linien, und die mittlere Länge eines blob - ~ rund, wie der Abstand zwischen Textzeilen). Aber wenn Ihre Summe falsch war (Dokument um 90 Grad gedreht) - Sie erhalten viele random blobs. Die connected component-Analyse erfordert ein bisschen mehr code (im Vergleich zu std), aber es kann Ihnen die Standorte der Linien von Texten. Zeile 'i' wird zwischen blob 'ich' und blob 'i+1'
Können Sie die Hough-Transformation zu erkennen, die längsten Linien im Bild und dann finden Sie die vorherrschende Neigung dieser Linien. Wenn die Steigung null ist, wird Ihr text horizontal; wenn es in der Nähe infinity, dein text ist vertikal.
Du gar nicht erwähnen, wenn Sie eine Bibliothek benutzen, um dies zu tun, aber in OpenCV, die Sie nutzen könnten HoughLinesP. Ich habe dieses tutorial auf ein Bild, gefunden auf wikimedia:
erhalten dieses Bild:
Dann habe ich gedreht, das original Bild:
um dies zu erhalten:
Da Sie nur daran interessiert sind, in der horizontalen oder vertikalen, können Sie einfach testen, ob die Differenz zwischen den x-Koordinaten der Linie Endpunkte ist nahe null (vertikal) oder die Differenz in y-Koordinaten ist nahe null (horizontal).
Unter Python möchten, führen Sie die folgende, mit pytesseract :
Hoffe, das noch hilft !