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

标签 python opencv edge-detection connected-components

1 输入

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

例如,在输入图像中,有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)

输出

新输出

最佳答案

您可能不需要使用cv2.canny()来分割轮廓,您可以简单地使用二进制阈值技术,例如:

img = cv2.imread("/path/to/img.png")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(img_gray, 130, 255, cv2.THRESH_BINARY_INV)

# Opencv v3.x
im, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

for i in xrange(len(contours)):
    rect = cv2.boundingRect(contours[i])
    contour_component = img[rect[1]:rect[1] + rect[3], rect[0]:rect[0] + rect[2]]

    cv2.imwrite("component_{}.png".format(i), contour_component)

关于python - 从边缘图像中提取成分并存储以进行进一步处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53994812/

相关文章:

python - 在 python 中将位数组写入文件?

python - Python和代理模拟/可视化环境

opencv - 背景减法 + MOOSE 滤波器

python - 如何使用 OpenCV houghlines 计算屏幕截图中的选项卡数量?

java - FloodFill 算法填充超出指定边界

python - 警告 : Ignored class "Label" re-declaration

python - One-Hot 编码训练和测试数据时形状不匹配。将 get_dummies 与管道一起使用时,Train_Data 比 Test_data 具有更多的虚拟列

c++ - 如何将 'int' 值放入 'const char*'

visual-studio-2010 - OpenCV:使用具有 SURF 功能的彩色帧的问题

c# - 托管代码 (C#) 与 Matlabs 和 C++ 的速度比较