如何用ImageMagick/Tesseract识别验证码?求Python实现示例
验证码识别求助:ImageMagick+Tesseract失败,求Python实现方案
我尝试用ImageMagick预处理验证码图片,再用Tesseract识别,但一直没成功。当前使用的命令如下:
convert captcha.png -fuzz -50% -transparent black -fuzz 15% -fill black -opaque 'rgb(16,128,176)' -fuzz 40% -fill white +opaque blue -colorspace gray captcha_clean.png tesseract --psm 7 captcha_clean.png stdout
是否应该改用Python来处理?能不能提供可行的Python实现示例?
附验证码图片:
- 验证码1:蓝色背景,带有黑色干扰线,字符为深色
- 验证码2:白色背景,带有黑色干扰线,字符为蓝色
更新:已尝试的干扰线处理代码
我写了一段检测黑色水平线并替换为黄色的代码,但后续识别还是有问题:
import cv2 import numpy as np img = cv2.imread("JgqK4.png") (h, w) = img.shape[:2] img = cv2.resize(img, (w*2, h*2)) blackMin = np.array([0, 0, 0],np.uint8) blackMax = np.array([0, 0, 0],np.uint8) HSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) mask = cv2.inRange(HSV, blackMin, blackMax) SE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (8,9)) mask = cv2.dilate(mask, SE, iterations=1) img[mask>0] = [0,255,255] cv2.imwrite("JgqK4_2.png", img)
可行的Python实现方案
针对你提供的两种验证码,通过精准干扰去除+二值化可有效提升Tesseract识别率,以下是完整实现:
依赖安装
先确保安装所需库:
pip install opencv-python numpy pytesseract
同时需确保Tesseract OCR引擎已安装并配置好环境变量。
处理逻辑
- 蓝色背景验证码:提取深色字符,去除蓝色背景与干扰线
- 白色背景验证码:先清除黑色干扰线,再提取蓝色字符
- 统一二值化、降噪后,用Tesseract识别
完整代码
import cv2 import numpy as np import pytesseract # 若Tesseract未加入系统环境变量,需指定路径 # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' def process_blue_bg_captcha(img_path): """处理蓝色背景带黑线条的验证码""" img = cv2.imread(img_path) # 转HSV提取深色字符(接近黑色) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) lower_black = np.array([0, 0, 0]) upper_black = np.array([180, 255, 50]) mask = cv2.inRange(hsv, lower_black, upper_black) # 开运算去除细干扰线 kernel = np.ones((2, 2), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=1) # 二值化:字符为白,背景为黑 _, thresh = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY_INV) return thresh def process_white_bg_captcha(img_path): """处理白色背景带黑线条的验证码""" img = cv2.imread(img_path) # 提取黑色干扰线 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) lower_black = np.array([0, 0, 0]) upper_black = np.array([180, 255, 30]) black_mask = cv2.inRange(hsv, lower_black, upper_black) # 膨胀线条确保完全覆盖干扰区域,用白色填充 se = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 3)) black_mask = cv2.dilate(black_mask, se, iterations=1) img[black_mask > 0] = [255, 255, 255] # 提取蓝色字符 lower_blue = np.array([90, 50, 50]) upper_blue = np.array([130, 255, 255]) blue_mask = cv2.inRange(cv2.cvtColor(img, cv2.COLOR_BGR2HSV), lower_blue, upper_blue) # 二值化 _, thresh = cv2.threshold(blue_mask, 127, 255, cv2.THRESH_BINARY) return thresh def recognize_captcha(processed_img): """用Tesseract识别预处理后的图片""" # 配置:单行文本模式+字符白名单,减少识别误差 custom_config = r'--oem 3 --psm 7 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' text = pytesseract.image_to_string(processed_img, config=custom_config) return text.strip() # 示例调用 if __name__ == "__main__": # 处理蓝色背景验证码 blue_bg_processed = process_blue_bg_captcha("oWchs.png") cv2.imwrite("blue_bg_clean.png", blue_bg_processed) print("蓝色背景验证码识别结果:", recognize_captcha(blue_bg_processed)) # 处理白色背景验证码 white_bg_processed = process_white_bg_captcha("JgqK4.png") cv2.imwrite("white_bg_clean.png", white_bg_processed) print("白色背景验证码识别结果:", recognize_captcha(white_bg_processed))
关键优化
- 针对不同背景的验证码做差异化预处理,提升字符提取精度
- 用形态学操作替代单纯颜色过滤,更可靠去除干扰线
- 配置Tesseract字符白名单,缩小识别范围,降低错误率
- 指定
--psm 7单行文本模式,匹配验证码的排版特征
内容的提问来源于stack exchange,提问作者Pavel Eremin
相关产品推荐
相关产品推荐

