Leicht lesbarer Text, der von Tesseract nicht erkannt wird
Ich habe die folgende PyTorch-Implementierung von EAST (Efficient and Accurate Scene Text Detector) verwendet, um Begrenzungsrahmen um Text in einer Reihe von Bildern zu identifizieren und zu zeichnen, und es funktioniert sehr gut!
Der nächste Schritt von OCR, mit dem ich versuche pytesseract
, den Text aus diesen Bildern zu extrahieren und in Zeichenfolgen umzuwandeln, schlägt jedoch schrecklich fehl. Wenn ich alle möglichen Konfigurationen von --oem
und verwende --psm
, kann ich nicht pytesseract
erkennen, was sehr klarer Text zu sein scheint, zum Beispiel:

Der erkannte Text befindet sich unter den Bildern. Obwohl ich Kontrastverstärkung angewendet und auch versucht habe, zu dilatieren und zu erodieren, kann ich Tesseract nicht dazu bringen, den Text zu erkennen. Dies ist nur ein Beispiel von vielen Bildern, bei denen der Text noch größer und klarer ist. Alle Vorschläge zu Transformationen, Konfigurationen oder anderen Bibliotheken wären hilfreich!
UPDATE: Nachdem ich Gaußsche Unschärfe + Otso-Schwellenwerte ausprobiert habe, kann ich schwarzen Text auf weißem Hintergrund erhalten (was anscheinend ideal für Pytesseract ist) und auch spanische Sprache hinzufügen, aber es kann immer noch keinen sehr einfachen Text lesen - zum Beispiel:

liest sich wie Kauderwelsch.
Die verarbeiteten Textbilder sind


img_path = './images/fesa.jpg'
img = Image.open(img_path)
boxes = detect(img, model, device)
origbw = cv2.imread(img_path, 0)
for box in boxes:
box = box[:-1]
poly = [(box[0], box[1]),(box[2], box[3]),(box[4], box[5]),(box[6], box[7])]
x = []
y = []
for coord in poly:
x.append(coord[0])
y.append(coord[1])
startX = int(min(x))
startY = int(min(y))
endX = int(max(x))
endY = int(max(y))
#use pre-defined bounding boxes produced by EAST to crop the original image
cropped_image = origbw[startY:endY, startX:endX]
#contrast enhancement
clahe = cv2.createCLAHE(clipLimit=4.0, tileGridSize=(8,8))
res = clahe.apply(cropped_image)
text = pytesseract.image_to_string(res, config = "-psm 12")
plt.imshow(res)
plt.show()
print(text)
Antworten
Verwenden Sie diese aktualisierten Datendateien.
Dieser Leitfaden kritisiert die Out-of-the-Box-Leistung (und möglicherweise könnte auch die Genauigkeit beeinträchtigt werden):
Trainierte Daten. Zum Zeitpunkt des Schreibens hat das APT-Paket tesseract-ocr-eng für Ubuntu 18.10 eine schreckliche Out-of-the-Box-Leistung, wahrscheinlich aufgrund beschädigter Trainingsdaten.
Gemäß dem folgenden Test, den ich durchgeführt habe, scheint die Verwendung der aktualisierten Datendateien bessere Ergebnisse zu liefern. Dies ist der Code, den ich verwendet habe:
import pytesseract
from PIL import Image
print(pytesseract.image_to_string(Image.open('farmacias.jpg'), lang='spa', config='--tessdata-dir ./tessdata --psm 7'))
Ich habe spa.traineddata (Ihre Beispielbilder haben spanische Wörter, richtig?) auf heruntergeladen ./tessdata/spa.traineddata
. Und das Ergebnis war:
ARMACIAS
Und für das zweite Bild:
PECIALIZADA:
Ich habe verwendet, --psm 7
weil es hier heißt, dass es "das Bild als einzelne Textzeile behandeln" bedeutet, und ich dachte, das sollte für Ihre Testbilder sinnvoll sein.
In diesem Google Colab können Sie den Test sehen, den ich durchgeführt habe.