【问题标题】:Pixel height and width of blobs斑点的像素高度和宽度
【发布时间】:2012-06-29 22:30:40
【问题描述】:

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

【问题讨论】:

    标签: opencv


    【解决方案1】:

    我不确定为什么它的单个像素元素的面积为零。 (我的想法说它应该是一个)。查看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 所评论的,在中值滤波之后,位置很近的对象有可能相互连接。为了理解这一点,我在这里给出了一张来自维基百科页面的图片。使用大半径中值滤波后,检查被黑线分隔的黄色物体是如何连接起来的。

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

    维基百科文章不错:Link

    也可以看这个链接以获得简单的解释:Link

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

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

    这是去除噪音的好方法。

    【讨论】:

    • 感谢您的回复和回答。中值滤波器用于去除一个像素点和那些“就 h 和 w 而言等于零”的斑点。但有一件事是,这些斑点也连接在一起,这不是我想要的。无论如何,我想我也可以使用它。谢谢@Abid。如果有时间,不妨试试 cvBlobsLib。如果是一个像素点,你会看到宽度和高度为零。
    • 是的,它在 OpenCV 本身中为零。 (cvBlobsLib 也是如此)。关于blob之间的联系,我忘了再提一件事。我有一个想法。我会尽快编辑。
    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2014-12-06
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多