如何优化OpenCV与Pytesseract验证码识别代码?解决像素缺失识别问题
优化验证码OCR识别的图像预处理方案
问题背景
尝试通过图像预处理提升验证码OCR可读性,但因图像存在像素缺失问题,Pytesseract无法正确识别,当前识别结果为le eth g。
原始图像

阈值处理后图像

闭运算处理后图像

原始代码
import cv2 as cv import pytesseract import numpy as np img = cv.imread("image1.jpeg") img = cv.cvtColor(img, cv.COLOR_RGB2GRAY) threshold = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 57, 13) x = 255 - threshold kernel = np.ones((3, 3),np.uint8) closing = cv.morphologyEx(x, cv.MORPH_CLOSE, kernel) captcha = pytesseract.image_to_string(closing, config="--psm 3") print(captcha) cv.imshow('close', closing) cv.imshow('thresh', threshold) cv.waitKey(0) cv.destroyAllWindows()
优化方案
1. 调整自适应阈值参数
当前自适应阈值的块尺寸(57)过大,会丢失字符细节。缩小块尺寸并微调常数项,让阈值更贴合字符边缘:
# 修改阈值处理代码 threshold = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2)
2. 优化形态学操作
原3x3方形闭运算核不足以填补字符像素缺失,改用椭圆形核更贴合字符轮廓,同时增加迭代次数强化填补效果:
# 替换核定义与闭运算逻辑 kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (2, 2)) closing = cv.morphologyEx(x, cv.MORPH_CLOSE, kernel, iterations=2)
3. 增加降噪预处理
原始图像存在细微噪点,在阈值处理前添加高斯模糊,减少噪点对阈值计算的干扰:
# 灰度化后新增高斯降噪 img = cv.GaussianBlur(img, (3, 3), 0)
4. 适配验证码场景调整Tesseract配置
使用--psm 8(将图像视为单个词)更适配验证码结构,同时指定字符白名单限制识别范围,避免无关字符干扰:
captcha = pytesseract.image_to_string(closing, config="--psm 8 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
完整优化代码
import cv2 as cv import pytesseract import numpy as np img = cv.imread("image1.jpeg") img = cv.cvtColor(img, cv.COLOR_RGB2GRAY) # 新增高斯降噪 img = cv.GaussianBlur(img, (3, 3), 0) # 调整阈值参数 threshold = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2) x = 255 - threshold # 使用椭圆形核并增加迭代次数 kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (2, 2)) closing = cv.morphologyEx(x, cv.MORPH_CLOSE, kernel, iterations=2) # 调整Tesseract配置 captcha = pytesseract.image_to_string(closing, config="--psm 8 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") print(captcha) cv.imshow('close', closing) cv.imshow('thresh', threshold) cv.waitKey(0) cv.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Code.vc
相关产品推荐
相关产品推荐

