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

使用Pytesseract与CV2优化数字识别:图像反转异常排查

CV2图像预处理反色问题的解决方案

你当前的代码中,preprocess_image函数使用THRESH_BINARY_INV + cv2.THRESH_OTSU进行二值化,这本身就是反二值化操作——会将黑字白底的原始图像转换为白字黑底,和你的预期完全相反。你提到调整反转参数无效,可能是OTSU自动阈值计算受图像亮度影响,或是中间文件读写引入了额外问题,以下是针对性解决方案:

方案1:直接替换反二值化为普通二值化

将反二值化参数改为THRESH_BINARY,直接生成黑字白底的二值图像:

def preprocess_image(image_path):
    image = cv2.imread(image_path)
    grey = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 替换THRESH_BINARY_INV为THRESH_BINARY
    _, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    return binary

方案2:根据图像亮度自动判断是否反转

如果原始图像的背景亮度不稳定(比如存在阴影、偏色),OTSU自动阈值可能误判,可通过计算平均亮度动态调整二值化方式:

def preprocess_image(image_path):
    image = cv2.imread(image_path)
    grey = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 计算图像平均亮度
    mean_brightness = grey.mean()
    # 背景偏亮(平均亮度>127)用普通二值化,偏暗则用反二值化
    if mean_brightness > 127:
        _, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    else:
        _, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    return binary

方案3:规避文件读写的潜在问题

你的代码多次将图像保存为文件再读取,可能因格式兼容问题导致像素值意外反转。可以直接在内存中完成截图转CV2、CV2转PIL的转换,无需存盘:

import numpy as np

def take_screenshot_and_preprocess(x1, y1, x2, y2, config=None):
    screenshot = pyautogui.screenshot(region=(x1, y1, x2 - x1, y2 - y1))
    # 直接将PIL截图转为CV2格式的BGR图像
    screenshot_cv = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
    grey = cv2.cvtColor(screenshot_cv, cv2.COLOR_BGR2GRAY)
    mean_brightness = grey.mean()
    if mean_brightness > 127:
        _, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    else:
        _, binary = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    return binary

def extract_text_from_image(preprocessed_image, config=None):
    # 直接将CV2灰度图转为PIL图像
    preprocessed_pil_image = Image.fromarray(preprocessed_image)
    text = pytesseract.image_to_string(preprocessed_pil_image, config=config)
    return text

补充说明

你提到调整反转参数无效,可能是因为原始截图的背景并非纯均匀白色,OTSU自动计算的阈值导致二值化结果不符合预期。使用平均亮度判断的方案可以适配更多场景,而内存直接转换则能避免文件读写带来的未知问题。

内容的提问来源于stack exchange,提问作者WParcival

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:25:58