You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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引擎已安装并配置好环境变量。

处理逻辑

  1. 蓝色背景验证码:提取深色字符,去除蓝色背景与干扰线
  2. 白色背景验证码:先清除黑色干扰线,再提取蓝色字符
  3. 统一二值化、降噪后,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:07:04