如何使用OpenCV去除图片黑点且不损坏原有文本内容
OpenCV去除图片黑点且不损伤文本的实现方法
是可以实现的,之前使用基础的膨胀、腐蚀、形态学操作效果不理想,核心原因是没有针对噪声和文本的尺寸差异做针对性的参数适配,直接使用全局操作很容易出现去噪不彻底或者文本笔画被侵蚀的问题。

具体实现步骤
- 噪声特征匹配:首先对图像做OTSU自适应二值化,分离前景(文字+噪声)和背景,统计黑点噪声的最大像素尺寸,以此确定后续处理的阈值参数,保证参数不会覆盖到正常文字的最小笔画尺寸。
- 连通域面积过滤(优先推荐):这是对文本损伤最小的方案,调用
cv2.connectedComponentsWithStats()统计所有前景连通域的面积,设置阈值过滤掉面积小于最小文字面积的连通域,即可直接删除所有小尺寸黑点,完全不会影响正常文字的形态。 - 优化调整:如果处理后文字边缘有轻微毛刺,可以使用3×3的圆形核对处理结果做一次极轻微的闭运算,修复边缘的同时不会改变文字的原始结构。
核心代码示例
import cv2 import numpy as np # 读取待处理灰度图 img = cv2.imread("input_img.png", cv2.IMREAD_GRAYSCALE) # 自适应二值化,反转后前景显示为白色 _, binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) # 8连通域分析 num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(binary, connectivity=8) # 噪声面积阈值,可根据实际图像调整,针对本次测试图设置为10即可 noise_area_threshold = 10 # 遍历所有连通域,过滤小尺寸黑点噪声 for idx in range(1, num_labels): if stats[idx, cv2.CC_STAT_AREA] < noise_area_threshold: binary[labels == idx] = 0 # 反转回白底黑字的最终结果 final_result = 255 - binary
内容的提问来源于stack exchange,提问作者Shaiful Islam
相关产品推荐
相关产品推荐

