使用OpenCV预处理后Tesseract OCR无法提取图像文本求助
OCR识别失效问题修复方案
核心问题定位
你现有预处理步骤未覆盖两个关键适配要求:
- 目标图像为浅色文字+深色背景,与Tesseract默认的「深色文字+浅色背景」识别要求不匹配
- 预处理参数(缩放比例、核大小、分页模式)适配错误,导致文字特征丢失
可直接使用的优化后代码
import pytesseract import cv2 import numpy as np # 配置项 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' image_path = "C:/Users//opencv_test/images/" ocr_path = "C:/Users//opencv_test/ocr/" doc_file_name = "Image.jpeg" ocr_file_name = doc_file_name[:-4] + ".txt" def preprocess_image(img): # 放大图像提升文字像素占比 img = cv2.resize(img, None, fx=1.5, fy=1.5, interpolation=cv2.INTER_CUBIC) # 转灰度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 反色处理:将浅色文字转深色、深色背景转浅色 gray = cv2.bitwise_not(gray) # OTSU二值化,自动过滤背景纹理 _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 2x2核做开运算,消去背景噪点 kernel = np.ones((2, 2), np.uint8) processed = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=1) # 可注释掉以下两行关闭预览 cv2.imshow("Processed Image", processed) cv2.waitKey(0) cv2.destroyAllWindows() return processed # 读取图像 img = cv2.imread(image_path + doc_file_name, 1) processed_img = preprocess_image(img) # 调用Tesseract识别,psm 6表示假设图像是单个统一文本块 text = pytesseract.image_to_string(processed_img, config='--psm 6 -l eng') text = text.replace('-\n', '') # 保存结果 with open(ocr_path + ocr_file_name, 'w', encoding='utf-8') as f: f.write(text)
优化点说明
- 新增反色处理,匹配Tesseract的识别场景要求
- 放大图像1.5倍,提升低分辨率文字的特征辨识度
- 用OTSU二值化替代自适应阈值,避免背景不均匀带来的噪点
- 调整形态学核为2x2,有效消除背景杂点同时不损失文字轮廓
- Tesseract分页模式改为
--psm 6,比默认的自动分页更适配单文本块场景,指定英文语言包进一步降低识别误差
内容的提问来源于stack exchange,提问作者gunjit bedi
相关产品推荐
相关产品推荐

