OpenCV Python如何去除二值化文档图像中的微小点状噪点
噪点去除解决方案
针对你提到的二值化图像存在微小点状噪点、直接腐蚀会损伤文字的问题,可通过以下3种方法解决,优先推荐连通域过滤方案,对文字笔画的损伤最小:
方案1:连通域面积过滤(最优)
原理是微小噪点均为独立的小面积连通块,直接筛除面积低于阈值的连通块即可,不会对正常大小的文字笔画产生影响。你可以根据自己的文字大小调整阈值min_area,推荐取值范围5~20。
新增去噪函数代码如下:def remove_small_noise(thresh, min_area=10): # 统计图像中所有连通域 num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh, connectivity=8) clean_img = np.zeros_like(thresh) # 仅保留面积大于阈值的连通域 for i in range(1, num_labels): if stats[i, cv2.CC_STAT_AREA] >= min_area: clean_img[labels == i] = 255 return clean_img调用方式:在二值化得到
thresh后,调用clean_thresh = remove_small_noise(thresh)即可得到去噪后的图像。方案2:小核形态学开运算
你之前直接使用腐蚀效果差是因为仅做了腐蚀操作,会整体收窄文字笔画。开运算为「先腐蚀后膨胀」,微小噪点在腐蚀步骤就被消除,后续膨胀步骤可以把被轻微腐蚀的文字笔画恢复到原有粗细,不会出现文字变细断裂的问题。
代码如下:# 生成2x2的小尺寸卷积核,避免损伤文字 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) clean_thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)方案3:调整预处理+二值化参数
可以在二值化前对灰度图做高斯模糊,提前消除部分噪点,同时适当调大自适应阈值的参数,减少二值化阶段产生的噪点:- 灰度转换后增加高斯模糊步骤
- 将自适应阈值的块大小从11调整为13或15,偏差值从2调整为3或4
修改后的二值化函数如下:
def binarize(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 新增高斯模糊预处理 gray = cv2.GaussianBlur(gray, (3,3), 0) # 调整自适应阈值参数 thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 15, 3) return thresh
以上三种方案可以组合使用,比如先调整二值化参数,再做连通域过滤,去噪效果会更好。
内容的提问来源于stack exchange,提问作者TTT2
相关产品推荐
相关产品推荐

