gpt4 book ai didi

python-2.7 - python 2.7 : Area opening and closing binary image in Python not so accurate

转载 作者:太空宇宙 更新时间:2023-11-03 22:09:22 33 4
gpt4 key购买 nike

我使用的是 Python 2.7,我使用了以下 Python 和 Matlab 函数来去除图像中的噪声和填充孔

enter image description here .

1。使用 Python 和 Opencv 去除噪声和填充孔的代码

img = cv2.imread("binar.png",0)
kernel = np.ones((5,5),np.uint8)
open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
close = cv2.morphologyEx(open, cv2.MORPH_CLOSE, kernel)
  1. 使用 ndimage.binary_closing 在 python 和 scipy 中使用的代码:

      im = cv2.imread("binar.png", cv2.IMREAD_GRAYSCALE)
    open_img = ndimage.binary_opening(im)
    close_img = ndimage.binary_closing(open_img)
    clg = close_img.astype(np.int)
  2. 在 Matlab 中使用的代码:我使用了 imfillbwareaopen

我得到的结果如下图所示:

使用 nd.image.binary_closing 的第一张图片。我的问题是它没有完全填满所有白色 Blob 。我们可以看到中间仍然存在少量黑色部分。 enter image description here

使用 cv2.morphologyEx 生成的第二张图片。这也是同样的问题,因为它在白色 Blob 之间也有一些小的白色部分。在这里,我又遇到了一个问题。它将一些白色像素转换为黑色,否则不应该这样。我在图 2 中提到了那些红色区域。红色突出显示的部分与较大的 Blob 相连,但即便如此,它们也会被转换成黑色像素。 enter image description here

我从 MATLAB 处理得到的第三张图片,其中 imfill 完美工作,无需将基本的白色像素转换为黑色。 enter image description here

所以,我的问题是,Python 2.7 是否有任何方法可以像在 Matlab 中一样去除特定区域以下的噪声并准确填充白色 Blob ?还有一件事是,我想找出最后处理的那些最终处理的 Blob 的质心和面积以供进一步使用。我可以使用 cv2.connectedComponentsWithStats 找出这些,但我想在去除噪音和填充 Blob 后找到面积和质心。

谢谢。

(我认为这不是重复的,因为我想用 Python 而不是 Matlab 来做。)

最佳答案

来自 Matlab's imfill() documentation :

BW2= imfill(BW,locations) performs a flood-fill operation on background pixels of the input binary image BW, starting from the points specified in locations. (...)

BW2= imfill(BW,'holes') fills holes in the input binary image BW. In this syntax, a hole is a set of background pixels that cannot be reached by filling in the background from the edge of the image.

I2= imfill(I) fills holes in the grayscale image I. In this syntax, a hole is defined as an area of dark pixels surrounded by lighter pixels.

我标记的副本显示了通常完成第三个变体的方法。然而,对于许多图像,第二个变体仍然可以正常工作并且非常容易实现。从第一个变体中,您看到它提到了一个flood-fill 操作,它可以在 OpenCV 中用 cv2.floodFill() 实现.第二种变体给出了一个非常简单的方法——从边缘进行洪水填充,剩下的像素是从外面无法到达的黑洞。然后,如果您反转此图像,您将获得白色像素作为孔洞,您可以将其添加到 mask 中以填充孔洞。

import cv2
import numpy as np

# read image, ensure binary
img = cv2.imread('image.png', 0)
img[img!=0] = 255

# flood fill background to find inner holes
holes = img.copy()
cv2.floodFill(holes, None, (0, 0), 255)

# invert holes mask, bitwise or with img fill in holes
holes = cv2.bitwise_not(holes)
filled_holes = cv2.bitwise_or(img, holes)
cv2.imshow('', filled_holes)
cv2.waitKey()

Filled holes

请注意,在本例中,我只是将背景的起始像素设置为 (0,0)。然而,可能会有,例如,一条白线从中心向下延伸,这将切断该操作以停止为图像的另一半填充(即停止寻找背景)。更稳健的方法是遍历图像上的所有边缘像素,并在每次遇到黑色像素时进行洪水填充。您可以使用 cv2.floodFill() 中的 mask 参数更轻松地完成此操作,它允许您每次继续更新掩码。


要找到每个 Blob 的质心,您可以使用轮廓检测​​和 cv2.moments() 来找到每个轮廓的质心,或者您也可以使用 cv2.connectedComponentsWithStats() 就像你提到的那样。

关于python-2.7 - python 2.7 : Area opening and closing binary image in Python not so accurate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45968617/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com