如何用OpenCV与Pytesseract预处理多色表格图像优化OCR识别
适配多颜色表格的OCR图像预处理优化方案
原代码直接将彩色图像转灰度后二值化,无法有效保留蓝、绿、棕等彩色表格线条或标识,导致这些元素在二值化后丢失或模糊,干扰OCR识别。以下是针对性的优化方案:
核心思路
利用HSV颜色空间对颜色的良好区分度,分别提取目标颜色(蓝、绿、棕)的表格元素,合并成统一的掩码后,生成无颜色干扰的黑白表格图像,再进行OCR识别。
优化后的完整代码
import pytesseract as tess import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图像 img = cv2.imread("table_img.png") # 转换到HSV颜色空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义各目标颜色的HSV阈值范围(可根据实际图像微调) # 蓝色范围 lower_blue = np.array([90, 50, 50]) upper_blue = np.array([130, 255, 255]) # 绿色范围 lower_green = np.array([40, 50, 50]) upper_green = np.array([80, 255, 255]) # 棕色范围 lower_brown = np.array([10, 50, 50]) upper_brown = np.array([30, 255, 180]) # 提取各颜色的掩码 mask_blue = cv2.inRange(hsv, lower_blue, upper_blue) mask_green = cv2.inRange(hsv, lower_green, upper_green) mask_brown = cv2.inRange(hsv, lower_brown, upper_brown) # 合并所有颜色掩码 combined_mask = cv2.bitwise_or(mask_blue, mask_green) combined_mask = cv2.bitwise_or(combined_mask, mask_brown) # 将原图像转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 用掩码增强表格元素:将掩码区域的灰度值调整为0(黑色),其余保留原灰度 enhanced_gray = cv2.bitwise_and(gray, gray, mask=cv2.bitwise_not(combined_mask)) enhanced_gray = cv2.bitwise_or(enhanced_gray, combined_mask) # 二值化处理(可选,根据图像情况调整) _, thresh = cv2.threshold(enhanced_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 形态学操作:修复断裂的线条(可选) kernel = np.ones((2,2), np.uint8) thresh = cv2.dilate(thresh, kernel, iterations=1) thresh = cv2.erode(thresh, kernel, iterations=1) # 显示处理后的图像 plt.imshow(thresh, cmap='gray', interpolation='nearest') plt.show() # OCR识别 print(tess.image_to_string(thresh))
关键步骤说明
- HSV颜色空间转换:相比RGB,HSV的色调(H)通道独立于亮度,更容易精准提取特定颜色。
- 颜色掩码提取:针对每种目标颜色设置阈值,过滤出对应颜色的表格元素,避免灰度转换时的信息丢失。
- 掩码合并与灰度增强:将所有颜色的表格元素统一转为黑色(或白色),生成无颜色干扰的清晰表格底图。
- 形态学操作:膨胀和腐蚀可以修复二值化后可能出现的线条断裂,进一步提升表格结构的完整性。
微调建议
如果识别效果仍不理想,可以根据实际图像调整以下参数:
- 各颜色的HSV阈值范围:可以用取色工具获取目标颜色的HSV值,再微调上下限。
- 形态学操作的核大小和迭代次数:根据表格线条的粗细调整,避免过度处理导致文字模糊。
内容的提问来源于stack exchange,提问作者NFeruch - FreePalestine
相关产品推荐
相关产品推荐

