openCV中的图像分割

时间:2018-06-20 09:59:24

标签: python opencv image-processing opencv-python

我有一条道路的图像。

我对其应用了颜色阈值处理,并得到了黄色和白色标记(cv2.inRange)的蒙版

然后我在蒙版上应用了特定区域的轮廓,以消除噪音(cv2.findContours

我已经获得了很好的口罩,上面有白色的车道,其他地方都是黑色的。

但是,我无法将这三个通道分成单独的阵列-我尝试了分水岭算法,它给了我通道的边界,但是没有将它们分成不同的阵列。

我想要的结果是拥有三个单独的数组,每个数组包含每个泳道的所有像素数。

我也扭曲了图像。

下面的屏幕快照是蒙版和原始扭曲图像的按位和

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以找到轮廓并将其填充并用作遮罩。 要查找轮廓,可以使用OpenCV中的cv2.findContours()功能。您可以在OpenCV Docs中找到示例。
像在文档中一样,您可以通过等高线获取轮廓,

_, contours, _ = cv2.findContours(your_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

变量contours将具有轮廓列表。在您的情况下,每个车道将添加为单独的轮廓。

然后如this所述,您可以创建遮罩。

masks = []
for contour in contours:
    img = np.zeros( (height, width) ) 
    cv2.fillPoly(img, pts =[contours], color=(255,255,255))
    masks.append(img)

您还可以使用cv2.drawContours功能,设置thickness=cv2.FILLED来创建遮罩。

修改

首先确保所有黑色区域的值均为(0, 0, 0)的{​​{1}}。然后,您可以尝试here中第二个参数的值和herergb函数的第三个参数的值。