2017-08-14 1 views
3

ProblemCheck Captcha Vorverarbeitung und die Lösung mit OpenCV und pytesseract

I-Code in Python für die Bildvorverarbeitung und Anerkennung mit Tesseract-OCR zu schreiben versuchen. Mein Ziel ist es, diese Form des Captchas zuverlässig zu lösen.

Original captcha and result of each preprocessing step

Schritte wie jetzt von

  1. Graustufen- und Schwellwertbildung des Bildes

  2. Bild mit PIL Verbesserung

  3. zu TIF konvertieren und Maßstab> 300px

  4. ihn an Tesseract-OCR (Whitelisting alle Groß Alphabete)

Allerdings bekomme ich immer noch eine ziemlich falsche Lesung (EPQ M Q). Welche anderen Vorverarbeitungsschritte kann ich durchführen, um die Genauigkeit zu verbessern? Mein Code und zusätzliches Captcha ähnlicher Art sind unten angehängt.

similar captchas I want to solve

-Code

import cv2 
import pytesseract 
from PIL import Image, ImageEnhance, ImageFilter 
def binarize_image_using_opencv(captcha_path, binary_image_path='input-black-n-white.jpg'): 
    im_gray = cv2.imread(captcha_path, cv2.IMREAD_GRAYSCALE) 
    (thresh, im_bw) = cv2.threshold(im_gray, 85, 255, cv2.THRESH_BINARY) 
    # although thresh is used below, gonna pick something suitable 
    im_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1] 
    cv2.imwrite(binary_image_path, im_bw) 

    return binary_image_path 

def preprocess_image_using_opencv(captcha_path): 
    bin_image_path = binarize_image_using_opencv(captcha_path) 

    im_bin = Image.open(bin_image_path) 
    basewidth = 300 # in pixels 
    wpercent = (basewidth/float(im_bin.size[0])) 
    hsize = int((float(im_bin.size[1])*float(wpercent))) 
    big = im_bin.resize((basewidth, hsize), Image.NEAREST) 

    # tesseract-ocr only works with TIF so save the bigger image in that format 
    tif_file = "input-NEAREST.tif" 
    big.save(tif_file) 

    return tif_file 

def get_captcha_text_from_captcha_image(captcha_path): 

    # Preprocess the image befor OCR 
    tif_file = preprocess_image_using_opencv(captcha_path) 



get_captcha_text_from_captcha_image("path/captcha.png") 

im = Image.open("input-NEAREST.tif") # the second one 
im = im.filter(ImageFilter.MedianFilter()) 
enhancer = ImageEnhance.Contrast(im) 
im = enhancer.enhance(2) 
im = im.convert('1') 
im.save('captchafinal.tif') 
text = pytesseract.image_to_string(Image.open('captchafinal.tif'), config="-c 
tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ -psm 6") 
print(text) 

Antwort

1

Großes Problem kommt aus verschiedenen Orientierungen von Briefen, aber nicht von der Stufe der Vorverarbeitung. Sie haben eine gemeinsame Vorverarbeitung durchgeführt, die gut funktionieren sollte, aber Sie können die Schwellenwertbildung durch adaptive thresholding ersetzen, um Ihr Programm allgemeiner im Sinne der Helligkeit Ihres Bildes zu machen.

Ich traf das gleiche Problem, als ich mit Tesseract für Auto-Lizenz-Erkennung arbeitete. Aus dieser Erfahrung wurde mir klar, dass Tesseract für die Orientierung des Textes auf dem Bild sehr sensibel ist. Tesseract kann Buchstaben gut erkennen, wenn Text auf Bild horizontal ist. Je mehr Text horizontal ausgerichtet ist, desto besser ist das Ergebnis.

Sie müssen also einen Algorithmus erstellen, der jeden Buchstaben aus Ihrem Captcha-Bild erkennt, seine Ausrichtung erkennt und ihn horizontal dreht und dann Ihre Vorverarbeitung durchführt, dann dieses gedrehte horizontale Bild mit tesseract verarbeitet und seine Ausgabe speichert in der resultierenden Zeichenfolge. Dann gehen Sie, um den nächsten Buchstaben zu erkennen, und führen Sie den gleichen Prozess aus und fügen Sie die Tesseract-Ausgabe in die resultierende Zeichenfolge ein. Sie benötigen image transformation function auch, um Ihre Buchstaben zu drehen. Und Sie müssen darüber nachdenken, Ecken Ihrer entdeckten Buchstaben zu finden. Kann this project wird Ihnen helfen, weil sie Text auf Bild rotieren, um die Qualität von Tesseract zu verbessern.

+0

Danke für die paar Ideen. Die Erstellung eines Algorithmus zur Erkennung jedes Buchstabens scheint eine ziemliche Aufgabe zu sein. Irgendwelche Vorschläge zu bestehenden Tools, um dies zu tun? Glauben Sie auch, dass in meiner Situation tiefgreifende Lerntechniken vorherrschen würden? –

+0

@SimonHolloway, um jeden Buchstaben zu finden versuchen Sie jede Bildsegmentierung verfügbar in opencv wie Watershed-Algorithmus http://docs.opencv.org/3.2.0/d3/db4/tutorial_py_watershed.html –