Извлечение компонентов из краевого изображения и сохранение для дальнейшей обработки
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)
Выход
Новый вывод 1
2 ответа
Возможно, вам не нужно использовать 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)
Это:
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... Если у вас есть какие-либо вопросы, оставьте комментарий.