基于OpenCV的OCR图像清洗:如何识别文档红黑文本
优化建议
1. 针对红色固定文本:从颜色通道入手提取
直接转灰度会完全丢失红色的色彩特征,这是你当前识别红色文本困难的核心原因。建议用HSV色彩空间分离红色区域:
- HSV对颜色的区分度远高于RGB,红色在HSV中分为两段区间(0-10和170-180),可以精准生成红色掩码
- 配合形态学操作(膨胀+腐蚀)消除噪点,强化红色文本的轮廓
示例代码:
import cv2 import numpy as np img = cv2.imread("your_document.jpg") # 转换为HSV色彩空间 hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义红色的HSV范围(可根据实际文档微调饱和度/亮度阈值) lower_red_1 = np.array([0, 120, 60]) upper_red_1 = np.array([10, 255, 255]) lower_red_2 = np.array([170, 120, 60]) upper_red_2 = np.array([180, 255, 255]) # 生成红色区域掩码 mask_red_part1 = cv2.inRange(hsv_img, lower_red_1, upper_red_1) mask_red_part2 = cv2.inRange(hsv_img, lower_red_2, upper_red_2) red_mask = cv2.bitwise_or(mask_red_part1, mask_red_part2) # 形态学操作优化掩码:先膨胀补全文本间隙,再腐蚀去除噪点 kernel = np.ones((2, 2), np.uint8) red_mask = cv2.dilate(red_mask, kernel, iterations=1) red_mask = cv2.erode(red_mask, kernel, iterations=1) # 提取红色文本区域 red_text_area = cv2.bitwise_and(img, img, mask=red_mask)
2. 针对黑色变量文本:优化灰度阈值流程
黑色文本在灰度图中区分度较高,但直接阈值容易受噪点干扰,建议增加预处理步骤:
- 先做高斯模糊减少文档中的斑点噪点
- 再用自适应阈值或OTSU自动阈值,替代手动调整level参数
示例代码:
# 处理黑色变量文本 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊去噪 blurred_gray = cv2.GaussianBlur(gray_img, (3, 3), 0) # OTSU自动阈值(无需手动调level) _, black_text_thresh = cv2.threshold(blurred_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
3. 合并双文本区域,定位目标字段
将红色固定文本和黑色变量文本的二值图合并,再通过轮廓检测或模板匹配定位目标区域:
- 把红色文本区域转灰度后生成二值图,和黑色文本二值图合并
- 用红色固定文本(如「N°」「Texte」)作为模板,通过模板匹配找到其坐标
- 根据固定文本的位置,截取旁边的变量文本区域,后续用OCR(如Tesseract)提取内容
合并代码示例:
# 红色文本转灰度并生成二值图 red_gray = cv2.cvtColor(red_text_area, cv2.COLOR_BGR2GRAY) _, red_text_thresh = cv2.threshold(red_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 合并红色和黑色文本的二值图 combined_text_thresh = cv2.bitwise_or(red_text_thresh, black_text_thresh)
4. 额外优化点
- 如果文档存在倾斜,先用霍夫直线变换矫正图像,避免文本错位
- 对裁剪后的变量文本区域,再做一次小幅度的形态学膨胀,强化字符轮廓,提升OCR准确率
内容的提问来源于stack exchange,提问作者Medestrac
相关产品推荐
相关产品推荐

