使用OpenCV v4.5.x增强彩色图像凸显文本以适配OCR识别
OpenCV 4.5.x 图像预处理方案(适配OCR识别)
针对非黑背景、模糊白色文本,以及中间白色竖线干扰的问题,以下是一套直接可用的预处理流程,完全基于OpenCV 4.5.x实现:
核心步骤拆解
1. 灰度转换
先将彩色图像转为灰度图,减少计算量,聚焦文本与背景的亮度差异:
import cv2 as cv import numpy as np # 读取目标图像 img = cv.imread("your_image_path.jpg") # 转为灰度图 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
2. 消除模糊(锐化文本)
针对略模糊的文本,用非锐化掩模增强边缘清晰度,比单纯高斯模糊更适合文本类图像:
# 生成模糊版灰度图作为掩模 blurred = cv.GaussianBlur(gray, (5, 5), 0) # 原图与模糊图加权叠加,实现锐化 unsharp = cv.addWeighted(gray, 1.5, blurred, -0.5, 0)
参数说明:1.5是原图权重,-0.5是模糊图权重,可根据模糊程度微调(模糊越重,原图权重可适当提高)。
3. 最大化对比度+背景转黑
用自适应高斯阈值处理,能根据局部区域的亮度自动调整阈值,完美解决非均匀背景的问题,直接将背景压为黑色,文本保留白色:
# 自适应阈值处理,反转结果实现黑底白字 thresh = cv.adaptiveThreshold( unsharp, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, 11, 2 )
参数说明:11是局部区域大小(奇数),2是阈值调整量,可根据文本大小微调。
4. 去除白色竖线干扰
利用形态学开运算,先腐蚀掉细竖线,再膨胀恢复文本的原有形状:
# 创建垂直方向的结构元素(匹配竖线的宽度和长度) kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 5)) # 开运算去除竖线 cleaned = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=1)
如果竖线更粗,可将结构元素的高度调整为7或9;若仍有零星噪声,可追加中值滤波:
cleaned = cv.medianBlur(cleaned, 3)
完整运行代码
将上述步骤整合,直接运行即可得到适合OCR的预处理图像:
import cv2 as cv import numpy as np def preprocess_for_ocr(image_path): # 读取图像 img = cv.imread(image_path) if img is None: raise ValueError("无法读取图像,请检查路径") # 灰度转换 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 锐化去模糊 blurred = cv.GaussianBlur(gray, (5, 5), 0) unsharp = cv.addWeighted(gray, 1.5, blurred, -0.5, 0) # 自适应阈值转黑底白字 thresh = cv.adaptiveThreshold( unsharp, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, 11, 2 ) # 去除竖线干扰 kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 5)) cleaned = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=1) # 可选:去除零星噪声 cleaned = cv.medianBlur(cleaned, 3) return cleaned # 使用示例 processed_img = preprocess_for_ocr("sample.jpg") # 保存预处理后的图像 cv.imwrite("ocr_ready.jpg", processed_img)
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

