问题
我正在尝试使用Tesseract-OCR在Python中编写用于图像预处理和识别的代码。我的目标是可靠地解决这种形式的验证码。
Original captcha and result of each preprocessing step
截至目前的步骤
图像的灰度和阈值
使用PIL增强图像
转换为TIF并缩放为> 300px
将其输入Tesseract-OCR(将所有大写字母白名单)
然而,我仍然得到一个相当不正确的阅读(EPQ M Q)。我可以采取哪些其他预处理步骤来提高准确性?我的代码和类似性质的附加验证码将在下面附上。
similar captchas I want to solve
代码
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)
答案 0 :(得分:1)
主要问题来自不同的字母方向,但不是来自预处理阶段。你做了常见的预处理,它应该运行良好,但是你可以用adaptive thresholding代替阈值,使你的程序在图像亮度方面更加通用。
当我使用tesseract进行汽车牌照识别时,我遇到了同样的问题。根据这一经验,我意识到tesseract对于图像上的文本方向非常敏感。当图像上的文字是水平的时,Tesseract可以很好地识别字母。水平定向的文本越多,您就能获得更好的结果。
因此,您必须创建算法,该算法将检测验证码图像中的每个字母,检测其方向并旋转它以使其水平,然后进行预处理,然后使用tesseract处理此旋转的水平图像并将其输出存储在结果字符串。然后去检测下一个字母并执行相同的过程并在结果字符串中添加tesseract输出。您还需要image transformation function来旋转您的字母。而且你必须考虑找到你检测到的字母的角落。可能this project会帮助您,因为他们会在图片上旋转文字以提高tesseract的质量。