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的质量。