You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:调整预处理+二值化参数
    可以在二值化前对灰度图做高斯模糊,提前消除部分噪点,同时适当调大自适应阈值的参数,减少二值化阶段产生的噪点:

    1. 灰度转换后增加高斯模糊步骤
    2. 将自适应阈值的块大小从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:06:08