从边缘图像中提取分量并存储以进行进一步处理

时间:2019-01-01 10:43:06

标签: python opencv edge-detection connected-components

1 输入

Input

给出一个边缘图像,我想一个个地检索其中的组件并将每个组件存储为一个图像,以便以后可以使用它进行处理。我猜这叫做连接组件标签。

例如,在输入图像中,有2条线,1个圆,2条曲线 我想要5个包含这5个组件的图像文件。

我能够提出如下代码,但我不知道如何进一步进行。目前,我在输出中将所有组件涂成不同的颜色。

      import scipy
      from skimage import io
      from scipy import ndimage
      import matplotlib.pyplot as plt
      import cv2
      import numpy as np

    fname='..//Desktop//test1.png'
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    #canny
   img_canny = cv2.Canny(img,100,200)

   threshold = 50

   # find connected components
   labeled, nr_objects = ndimage.label(img_canny) 
   print('Number of objects is %d'% nr_objects)

   plt.imsave('..//Desktop//out.png', labeled)

输出

output

新输出

2 个答案:

答案 0 :(得分:1)

您可能不需要使用base = '....' additional = () if some_condition: additional = ('additional', 'elements') path = os.path.join(base, *additional) 来分割轮廓,只需使用二进制阈值技术即可:

cv2.canny()

答案 1 :(得分:0)

此:

   num=nr_objects
   i=0
   while i<num:
      plt.imshow(labeled)
      i=i+1

不会循环显示不同的标签,只会显示相同的图像num次。您需要执行以下操作:

   for i in range(num):
      tmp = np.zeros(labeled.shape)
      tmp[labeled == i] = 255
      plt.imshow(tmp)

然后,您将为每个标签看到一个。您也可以使用for循环...如果您有任何问题,请发表评论。