2016-07-07 6 views
2

Я пытаюсь применить алгоритм WaterShed к изображению согласно учебнику: OpenCv WaterShed Docs. Я ранее применен пороговая Оца после гауссовской фильтрации и Morpholigical преобразований на исходное изображение, чтобы улучшить качество изображения в соответствии с кодом:Дистанционное преобразование в OpenCV Python автоматически преобразует CV_8UC3 в CV_32SC1, создавая ошибку утверждения

img = cv2.imread('Results\Feb_16-0.jpg',0) 
kernel = np.ones((1,1),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) 
blur = cv2.GaussianBlur(opening,(1,1),0) 
ret3,th4 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 

Применив расстояние преобразования в качестве первого этапа алгоритма водораздела в соответствии с кодом:

# sure background area 
sure_bg = cv2.dilate(opening,kernel,iterations=1) 
# Finding sure foreground area 
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,3) 

создает ошибку:

error: (-215) src.type() == CV_8UC3 && dst.type() == CV_32SC1 in function cv::watershed 

в котором канал изображения 8bit 3 предпринята, чтобы быть преобразованы в 32b это одноканальное изображение. Как я могу предотвратить это и все же работать с Трансформацией расстояния?

+0

Вы смогли это обработать? –

+0

К сожалению, я не смог это обработать –

+0

Кажется, я вообще не получаю эту ошибку. Можете ли вы загрузить изображение, которое используете? –

ответ

0

В функции cv2.watershed(img,markers) ваш входной параметр img должен иметь 3 канала. Полный рабочий код:

#Load image in grayscale 
img = cv2.imread('Results\Feb_16-0.jpg',0) 

kernel = np.ones((1,1),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) 
blur = cv2.GaussianBlur(opening,(1,1),0) 
ret3,th4 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 

# sure background area 
sure_bg = cv2.dilate(opening,kernel,iterations=1) 
# Finding sure foreground area 
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,3) 

ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0) 
sure_fg = np.uint8(sure_fg) 
unknown = cv2.subtract(sure_bg,sure_fg) 

ret, markers = cv2.connectedComponents(sure_fg) 
markers = markers+1 
markers[unknown==255] = 0 
markers = markers.astype('int32') 

#now load same image as color image 
img = cv2.imread('Results\Feb_16-0.jpg',1) 

markers = cv2.watershed(img,markers) 
img[markers == -1] = [255,0,0] 
0

Эта ошибка возникает, когда ваш входной массив в cv2.distanceTransform не отформатирован должным образом. Это должен быть 2D-массив типа np.uint8 (не int8).

Например

import cv2 as cv 
import numpy as np 

testim = np.zeros((11,11), dtype = uint8) 
testim[2:6,1:6] = 255 
testim[3,3] = 0 
print(testim) 
dist = cv.distanceTransform(testim, cv.DIST_L2, 5) 
print(testim) 

Если вы читаете изображение, которое не в нужном формате, вы должны сначала преобразовать его в серый цвет (только один канал) и убедитесь, что он находится в формате формате uint8. Это можно сделать с помощью imagename.astype(np.uint8)

Это было протестировано в opencv версии 3.3.1, python 3.5.