Извлечение компонентов из краевого изображения и сохранение для дальнейшей обработки - PullRequest
0 голосов
/ 01 января 2019

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 голосов
/ 01 января 2019

Вам может не потребоваться использовать 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)
0 голосов
/ 01 января 2019

This:

   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 ... Если у вас есть какие-либо вопросы, оставьте комментарий.

...