Tesseract OCR无法识别红色背景上的两行文本问题求助
针对红色背景多行黑字OCR识别的优化方案
一、预处理强化方案
- 反转色彩+阈值化:红色背景黑字反转后变为黑背景白字,更适配Tesseract的识别逻辑。先定位红色区域,对该区域做色彩反转,再用自适应阈值二值化处理,抵消光照不均的影响:
import cv2 import numpy as np def preprocess_red_region(red_region): # 反转色彩 inverted = cv2.bitwise_not(red_region) # 转灰度后做自适应阈值二值化 gray = cv2.cvtColor(inverted, cv2.COLOR_BGR2GRAY) thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) return thresh - 形态学降噪:用开运算清理红色区域的杂色噪点,再用闭运算填补文字内部的细小空隙,避免噪点干扰识别:
kernel = np.ones((2,2), np.uint8) cleaned = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) cleaned = cv2.morphologyEx(cleaned, cv2.MORPH_OPEN, kernel)
二、Tesseract参数精细化调整
- 锁定psm模式+混合引擎:针对已定位的多行文本区域,用
--psm 6(假设区域为单一文本块)或--psm 3(自动分页)比11/12更稳定,配合--oem 3(LSTM+传统引擎混合模式)提升兼容性:import pytesseract # 限定字符白名单(如果仅识别数字和小数点) custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789.' text = pytesseract.image_to_string(processed_img, config=custom_config) - 字符白名单过滤:如果目标文本只有数字、小数点这类固定字符,添加白名单可以直接过滤无关干扰,大幅提升识别准确率。
三、多行区域分割识别
- 投影法拆分单行:既然单行红色文本能正常识别,可通过水平投影法将多行区域切割为单个行图像,逐行识别后拼接结果:
def split_lines_by_projection(gray_img): # 计算每行的黑色像素总和(水平投影) row_sum = np.sum(gray_img == 0, axis=1) # 找到空白行位置作为分割点 split_indices = np.where(row_sum < 10)[0] # 阈值根据实际图像调整 lines = [] start = 0 for idx in split_indices: if idx - start > 5: # 过滤过小的无效区域 lines.append(gray_img[start:idx, :]) start = idx + 1 # 处理最后一行 if len(gray_img) - start > 5: lines.append(gray_img[start:, :]) return lines # 分割后逐行识别并拼接 line_texts = [pytesseract.image_to_string(line, config=custom_config).strip() for line in lines] full_text = '\n'.join(line_texts)
四、其他辅助技巧
- 放大区域分辨率:将红色区域图像resize到原尺寸的2倍,模拟高DPI扫描效果,让文字边缘更清晰,Tesseract对高分辨率文本的识别精度更高。
- 校验区域定位精度:检查
extract_gravnumbers_from_red函数的红色区域提取逻辑,确保没有包含多余边缘或遗漏文本,定位误差会直接影响后续识别效果。
内容的提问来源于stack exchange,提问作者Daniel Sjöberg
相关产品推荐
相关产品推荐

