Python中pytesseract+tesseract-ocr识别验证码效果不佳,如何优化?

这几个都没法识别

2Fg4AJ.png

只能纯数据,而且不加干扰的,才能识别

2FgrJ1.png

2Fg51d.png

2Fg8ba.png


Python中pytesseract+tesseract-ocr识别验证码效果不佳,如何优化?

8 回复

识别验证码效果不佳,通常是因为图片预处理没做好。tesseract本身对干净、清晰的文字图片识别率才高,直接扔给它一张验证码原图,效果肯定差。

核心思路是:先把图片处理成接近黑底白字的清晰二值化图像,再交给tesseract识别。下面这个代码示例演示了常用的预处理流程,你可以根据自己验证码的特点(比如干扰线、噪点、颜色)调整参数:

import pytesseract
from PIL import Image, ImageFilter, ImageEnhance
import cv2
import numpy as np

def preprocess_image(image_path):
    # 1. 用PIL打开图片
    img = Image.open(image_path)
    
    # 2. 转换为灰度图
    img = img.convert('L')
    
    # 3. 增强对比度(很多验证码对比度低)
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(2.0)  # 2.0是增强因子,根据实际情况调整
    
    # 4. 二值化(阈值可以调整)
    # 方法一:简单阈值
    # img = img.point(lambda x: 0 if x < 180 else 255, '1')
    
    # 方法二:用OpenCV自适应阈值(对光照不均的图片更好)
    img_np = np.array(img)
    img_np = cv2.medianBlur(img_np, 3)  # 中值滤波去噪
    thresh = cv2.adaptiveThreshold(img_np, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                  cv2.THRESH_BINARY, 11, 2)
    img = Image.fromarray(thresh)
    
    # 5. 去噪(可选)
    img = img.filter(ImageFilter.MedianFilter(size=3))
    
    # 6. 放大图片(小字识别差)
    img = img.resize((img.width*2, img.height*2), Image.Resampling.LANCZOS)
    
    return img

def recognize_captcha(image_path):
    # 预处理图片
    processed_img = preprocess_image(image_path)
    
    # 配置tesseract参数
    custom_config = r'--oem 3 --psm 8 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    # 参数说明:
    # --psm 8: 将图片视为单个单词
    # --oem 3: 默认OCR引擎
    # -c tessedit_char_whitelist: 设置可能出现的字符(根据你的验证码字符集调整)
    
    # 识别
    text = pytesseract.image_to_string(processed_img, config=custom_config)
    return text.strip()

# 使用示例
result = recognize_captcha('captcha.png')
print(f"识别结果: {result}")

关键点:

  1. 预处理比调参更重要:上面代码中的灰度化、对比度增强、二值化、去噪、放大这五步,对大多数简单验证码都有效。
  2. 字符白名单:如果你的验证码只包含数字或特定字母,一定要在tessedit_char_whitelist参数里限制字符集,能大幅提升准确率。
  3. PSM模式--psm 8是把整个图片当作一个单词来识别,适合没有空格分隔的验证码。如果验证码字符间有间隔,可以试试--psm 7(单行文本)。

如果验证码有彩色背景或干扰线,可能需要先提取主要颜色或进行颜色过滤。复杂的验证码(比如扭曲严重、重叠字符)可能还需要更专业的图像处理甚至机器学习方法。

总结:重点搞好图片预处理。

这个本来就是要根据具体场景去训练模型的

这种验证码可能需要训练吧

训练模型

说实话 我刚研究了这玩意一段时间,优化主要就在两方面,你先对图片进行一下预处理,作用很大,比如说二值化一下,这样干扰因素会少一些,然后你再对这种图片进行训练生成字体文件,放到 tessdata 中,tesseract 训练方法网上很多,你可以找一下,反正我是失败了,我在生成四个文件的时候会出错 也没招到原因,你可以试一试

再补一发,文字倾斜也会有影响,你爬的数据量不大,还是去调云打码这些平台的接口吧


还不知道怎么通过打码平台调用,回去看看😁

回到顶部