1

我有一个带有一些斑点的图像。有些是一个像素点,有些不是。当我使用 cvBlobsLibs 查找一个像素点的高度和宽度时,它显示该值等于零。它是否正确?我尝试使用轮廓来填充一个点像素,但似乎也失败了。任何其他可以删除一个点像素甚至删除等于零的高度或宽度的方法?

4

1 回答 1

3

我不确定为什么它的单个像素元素的面积为零。(我的想法说它应该是一个)。查看contourArea. 它说,面积是使用 计算的Green Formula,因此面积和像素数可能不同。

其次,要去除这种噪声,您可以使用中值过滤器。我在下面使用 Python 展示了它。

输入图像:

在此处输入图像描述

现在代码:

>>> img2 = cv2.imread('D:\Abid_Rahman_K\work_space\mask.png',0)

>>> contours,hierarchy = cv2.findContours(img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

非零像素数:

>>> cv2.countNonZero(img2)
121

现在应用 medianFilter 并再次检查非零像素的数量:

>>> blur = cv2.medianBlur(img2,5)
>>> cv2.countNonZero(blur)
0

输出图像:

在此处输入图像描述

编辑

如果图像有物体,它不会受到模糊的影响。

输入图像:

在此处输入图像描述

输出图像:

在此处输入图像描述

在对此答案进行第二次评论后进行编辑。

正如 Mizuki 评论的那样,在中值滤波之后,位置很近的对象有可能相互连接。为了理解这一点,我在这里给出了一张来自维基百科页面的图片。检查使用高半径中值滤波器后由黑线分隔的黄色对象如何连接。

在此处输入图像描述

这是因为,中值滤波器使用一个窗口来计算该窗口中所有值的中值,并用该中值替换中心元素。随着窗口大小的增加,更多的元素用于计算中位数。因此,狭窄的间隙被消除了。

维基百科文章是一个很好的:链接

另请参阅此链接以获得简单的解释:链接

因此,为了避免这种情况,还有另一种称为腐蚀和膨胀的方法(均在 OpenCV 中实现)。简单地说,腐蚀减小了白色物体的大小,而膨胀增加了白色物体的大小。

所以侵蚀去除了小的白色像素,但它也减小了我们对象的大小。所以我们使用 dilate 来恢复它的大小。由于所有白噪声都已因侵蚀而被消除,因此它们不会在膨胀中返回。

这是去除噪音的好方法。

于 2012-06-29T10:28:05.660 回答