如何用OpenCV为图像中所有文字及背景添加红色轮廓?
解决文字轮廓检测问题
问题根源
原代码的核心问题在于:
- 阈值方向错误:使用
THRESH_BINARY保留了浅色的星星区域,深色文字被转为黑色,无法被轮廓检测识别 - 形态学操作无效:
(1,1)的卷积核没有起到降噪或连接文字笔画的作用 - 固定阈值适配性差:216的高阈值过滤掉了部分文字细节
修改后的代码
import cv2 as cv import numpy as np # 读取图像 image = cv.imread("input1.jpg") img_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # 高斯降噪 img_denoised = cv.GaussianBlur(img_gray, (5,5), 2) # 改用自适应阈值,适配复杂背景的文字提取 thresh = cv.adaptiveThreshold(img_denoised, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, 11, 2) # 用闭操作连接文字笔画、填充小空洞 kernel = np.ones((2,2), np.uint8) closing = cv.morphologyEx(thresh, cv.MORPH_CLOSE, kernel) # 检测最外层轮廓 contours, hierarchy = cv.findContours(closing, mode=cv.RETR_EXTERNAL, method=cv.CHAIN_APPROX_SIMPLE) # 过滤噪声轮廓,绘制文字轮廓 for cnt in contours: if cv.contourArea(cnt) > 20: # 根据实际图像调整面积阈值 cv.drawContours(image, [cnt], -1, (0, 0, 255), 2) # 显示结果 cv.imshow("Text Contours", image) cv.waitKey(0) cv.destroyAllWindows()
关键修改说明
- 自适应阈值:结合
THRESH_BINARY_INV将深色文字转为白色区域,局部阈值调整能适配不同区域的明暗差异 - 形态学闭操作:
(2,2)卷积核先膨胀后腐蚀,修复文字笔画断裂,同时过滤小噪声 - 轮廓过滤:通过面积筛选排除细小噪声,只保留文字轮廓
- 轮廓检测模式:
RETR_EXTERNAL只提取最外层轮廓,减少冗余计算
内容的提问来源于stack exchange,提问作者user20545193
相关产品推荐
相关产品推荐

