2014-12-24 3 views
0

У меня есть изображение и вы хотите создать многоугольники сегментов этого изображения, используя управляемый маркером водораздел. Я написал следующий код, но я не могу отделить объекты друг от друга и создать многоугольники объекта.Как создать многоугольники для сегментации водораздела

Как решить эти проблемы? Большое спасибо за Вашу помощь.

import cv2 
import numpy as np 
import scipy.misc 
import scipy.ndimage as snd 
# image is read and is converted to a numpy array 
img = cv2.imread('D:/exam_watershed/Example_2_medicine/Medicine_create_poly/medicine.jpg') 
# image is convereted to grayscale 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
# binary thresholding is done using the threshold 
# from Otsu's method 
ret1,thresh1 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 
# foreground pixels are determined by 
# performing erosion 
fore_ground = cv2.erode(thresh1,None,iterations = 3) 
bgt = cv2.dilate(thresh1,None,iterations = 3) 
ret,back_ground = cv2.threshold(bgt,1,100,1) 
# marker is determined by adding foreground and background pixels 
marker = cv2.add(fore_ground,back_ground) 
# converting marker to 32 int 
marker32 = np.int32(marker) 
cv2.watershed(img,marker32) 
res = scipy.misc.toimage(marker32) 
res.save('D:/exam_watershed/Example_2_medicine/Medicine_create_poly/res_output.png') 

original image

image after segment

ответ

1

This question, кажется, довольно близко к вашим потребностям, так как в данном примере используется один и тот же образ, как ваш.

Чтобы преобразовать полученные «плотины» в полигоны, я предлагаю использовать cv2.findContours вместе с cv2.approxPolyDP на изображении результатов.

+0

Следуйте своим предложениям, я преобразую изображение сегментации в двоичное изображение, а затем запустим контуры: _, contours1, _ = cv2.findContours (thresh3, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE). Тогда работает функции: Защиту approxing (УНТ): назад = [] закрыто = True для НКТ в УНТ: эпсилон = 10 cnt2 = cv2.approxPolyDP (CNT, эпсилон, закрытые) back.append (cnt2) возвращение назад c = приближение (контуры1). И сохраните результат, image_out = cv2.imwrite ('D: /contour2.jpg', c). Однако изображение с ошибкой не является числовым или скалярным. Как это исправить? Благодаря – user30985