关于python:使用Opencv和pytesseract进行Captcha预处理和求解

Captcha preprocessing and solving with Opencv and pytesseract

问题

我正在尝试使用Tesseract-OCR在Python中编写用于图像预处理和识别的代码。 我的目标是可靠地解决这种形式的验证码。

原始验证码和每个预处理步骤的结果

截至现在的步骤

  • 图像的灰度和阈值

  • 使用PIL增强图像

  • 转换为TIF并缩放到> 300px

  • 将其输入到Tesseract-OCR(将所有大写字母列入白名单)

  • 但是,我仍然得到相当不正确的阅读(EPQ M Q)。 我还可以采取哪些其他预处理步骤来提高准确性? 我的代码和类似性质的其他验证码附在下面。

    我想解决的类似验证码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    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)

    主要问题来自字母的不同方向,而不是预处理阶段。您进行了一般的预处理,效果很好,但是可以将阈值替换为自适应阈值,以使程序在图像的亮度方面更加通用。

    当我与tesseract合作进行车牌识别时遇到了同样的问题。从那次经历中,我意识到,tesseract对于图像上文本的方向非常敏感。当图像上的文本为水平时,Tesseract可以很好地识别字母。水平放置的文字越多,可获得的效果越好。

    因此,您必须创建一种算法,该算法将从验证码图像中检测每个字母,检测其方向并将其旋转以使其变为水平,然后进行预处理,然后使用tesseract处理此旋转的水平图像并将其输出存储在结果字符串中。然后去检测下一个字母并执行相同的过程,然后在结果字符串中添加tesseract输出。您还需要图像转换功能来旋转字母。而且您必须考虑寻找检测到的字母的角。可能是这个项目对您有帮助,因为它们可以旋转图像上的文本以提高tesseract的质量。