使用pytesseract识别黑底红字失败,求有效图像处理方案
黑底红字图像的Tesseract文本提取解决方案
问题背景
需要提取黑底红字图像中的文本,现有代码将图像转为灰度图后,红色文字变为深灰色,导致Tesseract仅能识别出部分内容(如“Day 1382, 03:23:17:”),尝试的通道判断代码因逻辑错误无法生效。
有效解决方案
核心思路是针对红色通道单独处理,利用红色在RGB通道中的特征(红色通道值远高于绿、蓝通道),将红色文字转换为Tesseract更容易识别的白底黑字格式:
步骤说明
- 读取图像后,转换颜色空间并提取红色通道;
- 对红色通道做二值化处理,过滤出红色文字区域;
- 反转图像得到白底黑字的高对比度格式;
- 优化Tesseract配置参数提升识别准确率。
完整代码示例
import cv2 import pytesseract import numpy as np pytesseract.pytesseract.tesseract_cmd = "tesseract/tesseract.exe" image_path = 'img4.png' # 读取带alpha通道的原图 img = cv2.imread(image_path, cv2.IMREAD_UNCHANGED) # 转换为RGB格式,提取红色通道(OpenCV默认读取为BGR,需转换) rgb_img = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB) red_channel = rgb_img[:, :, 0] # 二值化:筛选出红色文字区域(阈值可根据实际图像微调) _, binary_img = cv2.threshold(red_channel, 200, 255, cv2.THRESH_BINARY) # 反转图像得到白底黑字,适配Tesseract识别偏好 inverted_img = cv2.bitwise_not(binary_img) # 限定识别字符范围,进一步提升准确率 text = pytesseract.image_to_string( inverted_img, config='--oem 3 --psm 6 -c tessedit_char_whitelist="0123456789Day:,"' ) print(text)
代码解释
- 红色通道提取:黑底红字图像中,红色通道的文字区域亮度远高于背景,单独提取后能获得天然高对比度;
- 二值化与反转:通过阈值过滤出红色文字,反转后得到Tesseract最优识别的白底黑字格式;
- 配置优化:添加字符白名单,减少识别干扰,提升精准度。
错误代码分析
之前尝试的代码存在逻辑错误:gray_img是单通道灰度图,不存在axis=2维度,(gray_img == 31).all(axis=2)会直接报错,无法实现颜色替换效果。
内容的提问来源于stack exchange,提问作者TosiX
相关产品推荐
相关产品推荐

