像素高度和宽度的斑点

时间:2012-06-29 06:30:22

标签: opencv

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

1 个答案:

答案 0 :(得分:3)

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

其次,要消除此噪音,可以使用medianFilter。我已经使用Python在下面展示了它。

输入图片:

enter image description here

现在代码:

>>> 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

输出图片:

enter image description here

修改

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

输入图片:

enter image description here

输出图片:

enter image description here

在对此答案发表第二次评论后编辑。

正如Mizuki评论的那样,在中值滤波后,紧密放置的物体有可能相互连接。为了理解这一点,我在这里给出一个来自维基百科页面的图片。在使用高半径的中值滤波器后,检查黑线分离的黄色物体是如何连接的。

enter image description here

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

维基百科文章很好:Link

另请参阅此链接以获取简单说明:Link

为了避免这种情况,还有另一种称为侵蚀和扩张的方法(都在OpenCV中实现)。简单地说,侵蚀减少了白色物体的大小,扩张增加了白色物体的大小。

因此侵蚀会消除小的白色像素,但它也会减小对象的大小。所以我们使用扩张来恢复它的大小。由于所有白噪声都已因侵蚀而被清除,因此它们不会再膨胀。

这是消除噪音的好方法。