验证码图像预处理后pytesseract仍无法识别问题求助
解决验证码识别为空的问题
从你的预处理流程和转换后的图像特征(白字黑底)来看,核心问题出在预处理过度导致字符细节丢失,以及图像颜色模式与Tesseract默认识别逻辑不匹配,下面给出针对性优化方案:
1. 简化并优化预处理流程
你当前的多次锐化、最大值滤波会造成字符边缘过度膨胀、细节糊化,反而干扰识别。建议聚焦于去噪、强化对比度:
from PIL import Image, ImageOps, ImageFilter from io import BytesIO # 读取图像 img = Image.open(BytesIO(response.content)) # 转灰度图 img = ImageOps.grayscale(img) # 中值滤波去除噪点(适度即可,避免后续过度处理) img = img.filter(ImageFilter.MedianFilter(size=3)) # 反转颜色:Tesseract默认更擅长识别黑字白底,修正颜色模式 img = ImageOps.invert(img) # 固定阈值二值化(降低阈值,避免过滤掉浅色字符) img = img.point(lambda x: 255 if x > 127 else 0, '1')
2. 调整Tesseract识别参数
--psm 6假设图像是均匀文本块,不适合验证码这类零散字符场景,换用更适配的模式并补充字符识别规则:
import pytesseract result = pytesseract.image_to_string( img, config='--psm 7 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -c textord_min_xheight=8' ) print(result.strip())
--psm 7:将图像视为单一文本行,适配验证码的字符排列textord_min_xheight=8:强制识别最小字符高度,避免过滤掉细小的验证码字符- 保留字符白名单,确保只识别目标范围内的字符
3. 额外验证与修复建议
- 保存处理后的图像到本地,确认字符清晰无糊化:
img.save('processed_captcha.png') - 如果字符仍有粘连,可添加轻度形态学腐蚀修复边缘:
from PIL import ImageMath # 轻度腐蚀优化字符边缘 img = ImageMath.eval('convert(a & b & c, "1")', a=img, b=img.crop((1,0,img.width,img.height)), c=img.crop((0,1,img.width,img.height)))
内容的提问来源于stack exchange,提问作者Jxtin
相关产品推荐
相关产品推荐

