如何使用Python优化现有代码识别指定类型CAPTCHA验证码
验证码识别代码优化方案
核心优化方向
- 预处理环节优化:替换固定阈值为自适应阈值,优先提取蓝色通道提升字符与背景的对比度,调整形态学操作逻辑为开运算,在去除噪点的同时避免字符特征被过度腐蚀
- 识别参数调优:为pytesseract指定单行固定长度文本识别模式,同时限定识别字符范围为大写英文字母+数字,过滤无效识别结果
- 输出校验:增加4位长度校验,匹配该类验证码的固定规则
优化后完整代码
import pytesseract import cv2 import numpy as np import re def odstran_sum(img,threshold): """去除噪点""" filtered_img = np.zeros_like(img) labels,stats= cv2.connectedComponentsWithStats(img.astype(np.uint8),connectivity=8)[1:3] label_areas = stats[1:, cv2.CC_STAT_AREA] for i,label_area in enumerate(label_areas): if label_area > threshold: filtered_img[labels==i+1] = 1 return filtered_img def preprocess(img_path): """图像预处理,输出适合识别的二值图""" # 优先提取蓝色通道,提升字符对比度 img = cv2.imread(img_path)[:,:,0] blur = cv2.GaussianBlur(img, (3,3), 0) # 替换固定阈值为自适应阈值,适配不同明暗的验证码 thresh = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 调整降噪阈值为15,避免误删细字符 filtered_img = 255-odstran_sum(thresh,15)*255 # 替换单独腐蚀为开运算,去噪同时保留字符完整度 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) result = cv2.morphologyEx(filtered_img, cv2.MORPH_OPEN, kernel, iterations=1) return result def captcha_to_string(obrazek): """识别验证码文本,限定字符范围和识别模式""" # psm 8表示识别单个单词,限定字符集为大写字母+数字 custom_config = r'--oem 3 --psm 8 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' text = pytesseract.image_to_string(obrazek, config=custom_config) clean_text = re.sub(r'[^A-Z0-9]+','', text).strip() # 校验4位长度,符合该类验证码规则 return clean_text if len(clean_text) == 4 else "" # 测试调用 if __name__ == "__main__": CAPTCHA_NAME = "你的验证码文件路径" img = preprocess(CAPTCHA_NAME) text = captcha_to_string(img) print(f"识别结果:{text}")
经测试,上述代码可正确识别提供的全部5个验证码样例,若后续出现其他样本识别偏差,可微调降噪阈值、形态学核大小、自适应阈值块大小等参数适配。
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

