Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用泛洪填充填充边缘工作不正常_Python_Opencv_Image Processing_Edge Detection_Flood Fill - Fatal编程技术网

Python 使用泛洪填充填充边缘工作不正常

Python 使用泛洪填充填充边缘工作不正常,python,opencv,image-processing,edge-detection,flood-fill,Python,Opencv,Image Processing,Edge Detection,Flood Fill,我在python中使用openCV来检测混凝土中的裂缝。我能够使用canny边缘检测来检测裂缝。接下来,我需要填充边缘。我使用了openCV的泛光填充操作,但是一些间隙被填充,而一些间隙没有被填充。左边的是输入图像,而右边的是泛光填充图像。我猜这是因为我的边在点上有断裂。我如何解决这个问题? 我的洪水填充代码: im_th1 = imginput im_floodfill = im_th1.copy() # Mask used to flood filling. # Notice the siz

我在python中使用openCV来检测混凝土中的裂缝。我能够使用canny边缘检测来检测裂缝。接下来,我需要填充边缘。我使用了openCV的泛光填充操作,但是一些间隙被填充,而一些间隙没有被填充。左边的是输入图像,而右边的是泛光填充图像。我猜这是因为我的边在点上有断裂。我如何解决这个问题? 我的洪水填充代码:

im_th1 = imginput
im_floodfill = im_th1.copy()
# Mask used to flood filling.
# Notice the size needs to be 2 pixels than the image.
h, w = im_th1.shape[:2]
mask = np.zeros((h + 2, w + 2), np.uint8)

# Floodfill from point (0, 0)
cv2.floodFill(im_floodfill, mask, (5, 5), 255);

# Invert floodfilled image
im_floodfill_inv = cv2.bitwise_not(im_floodfill)

# Combine the two images to get the foreground.
im_out = im_th1 | im_floodfill_inv
cv2.imshow("Foreground", im_out)
cv2.waitKey(0)

我经常在这里看到,所以每个人都想使用边缘检测,然后填充边缘之间的区域

除非使用有意创建闭合轮廓的边缘检测方法,否则检测到的边缘可能不会形成闭合轮廓。除非具有闭合轮廓,否则无法对区域进行洪水填充

在大多数情况下,一些过滤和一个简单的阈值就足够了。例如:

import PyDIP as dip
import matplotlib.pyplot as pp

img = dip.Image(pp.imread('oJAo7.jpg')).TensorElement(1) # From OP's other question
img = img[4:698,6:]

lines = dip.Tophat(img, 10, polarity='black')
dip.SetBorder(lines, [0], [2])
lines = dip.PathOpening(lines, length=100, polarity='opening', mode={'robust'})
lines = dip.Threshold(lines, method='otsu')[0]

这个结果是在一个简单的top-hat过滤器之后得到的,它只保留薄的东西,然后是一个路径打开,它只保留长的东西。此组合将删除大比例着色,以及小凹凸和其他内容。过滤后,一个简单的大津阈值产生一个标记裂缝中所有像素的二值图像

注:

  • 输入图像是OP发布的图像,也是本问题中发布的图像的输入
  • 我正在使用PyDIP,您可以并且需要自己编译它。希望很快我们会有一个二进制发行版。我是作家

    • 我找到了我所寻找的解决方案。在这里发布,因为它可能对其他人有用。在互联网上进行了一些研究后,发现只有两行代码,如下所示:

      对我有效的代码是:

      kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 9))
      dilated = cv2.dilate(image, kernel)
      eroded=cv2.erode(dilated,kernel)
      

      结果显示在显示结果前后的附件中。

      我在使用上述代码时遇到错误:“模块‘pydip’没有属性‘Image’”。我尝试使用PIP安装PyDIP来安装PyDIP库。这不是正确的方法吗?您的输出看起来很有希望,但在这里不起作用@Eshant:不,您不能通过
      pip
      安装PyDIP,我们还没有二进制发行版,您需要从源代码进行编译。