OpenCV Python 中的距离变换自动将 CV_8UC3 转换为 CV_32SC1,从而产生断言错误

Ani*_*mik 5 python opencv computer-vision watershed opencv3.0

我正在尝试按照教程将 WaterShed 算法应用于图像:OpenCv WaterShed Docs。我早些时候在灰度图像上应用了高斯滤波和形态变换之后的大津阈值处理,以根据代码提高图像质量:

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)
Run Code Online (Sandbox Code Playgroud)

根据代码,将距离变换应用为分水岭算法的第一阶段:

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

创建错误:

error: (-215) src.type() == CV_8UC3 && dst.type() == CV_32SC1 in function cv::watershed
Run Code Online (Sandbox Code Playgroud)

其中尝试将8位3通道图像转换为32位单通道图像。如何防止这种情况发生并使用距离变换?

小智 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]
Run Code Online (Sandbox Code Playgroud)