TOC

去除噪点的简单实现

最近在学习图像处理,然后看到一个概念:连通域,并且了解到了一些相关的算法:two pass,seed filling。

学习的时候是自己写方法实现,今天了解到了 CV 中有一个方法可以简单的计算连通域,然后写了一个简单的函数作为 Demo。

示例图片

/tmp/test.jpg
示例图片

放大可以看得更清楚:
示例图片(放大)

可以看到右边格子中有一个小点,底面有两个小点,我们就可以基于连通域面积的判断来去除。

PS:图片中还有一些模糊的地方,和本文要讲的内容无关,通过二值化简单的处理一下就没了。

代码实现

代码经过精简之后,就只有这么几行:

img: np.ndarray = cv2.imread('/tmp/test.jpg', cv2.IMREAD_GRAYSCALE)
img[img < 100], img[img >= 100] = 0, 255
num, cmpts = cv2.connectedComponents(~img)
for i in range(num):
    cndt = cmpts == i
    if len(cmpts[cndt]) < 12: # 面积小于12个点的就去除
        img[cndt] = 255

最终效果:
效果图片