在 Matlab 中,我们可以对距离变换进行分水岭变换来分离两个接触的物体:
上面的第一张图片是我们希望分离的带有触摸对象的图片。第二个图像是它的距离变换。
因此,如果调用黑白图像img
,在 Matlab 中我们可以这样做:
D = -bwdist(~img);
L = watershed(D);
现在用 openCV 做同样的事情:OpenCV 有一个基于标记的分水岭分割功能。似乎要执行使用 openCV 分离两个触摸对象的相同任务,需要为对象和背景提供标记。
img = np.zeros((400, 400), np.uint8)
cv2.circle(img, (150, 150), 100, 255, -1)
cv2.circle(img, (250, 250), 100, 255, -1)
dist = cv2.distanceTransform(img, cv2.cv.CV_DIST_L2, cv2.cv.CV_DIST_MASK_PRECISE)
dist3 = np.zeros((dist.shape[0], dist.shape[1], 3), dtype = np.uint8)
dist3[:, :, 0] = dist
dist3[:, :, 1] = dist
dist3[:, :, 2] = dist
markers = np.zeros(img.shape, np.int32)
markers[150,150] = 1 # seed for circle one
markers[250, 250] = 2 # seed for circle two
markers[50,50] = 3 # seeds for background
cv2.watershed(dist3, markers)
在下图中,您可以看到markers
执行分水岭后的图像。原来的黑白 img
以红色叠加在上面。问题是结果markers
图像中的对象边界与原始图像不同。如何确保对象边界保持不变?