openCV 中的图像分割

Image Segmentation in openCV

我有一张路的图片。

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

然后我在蒙版上应用了特定区域的轮廓来去除噪声(cv2.findContours)

我得到了很好的面具,白色是车道,其他地方都是黑色。

但是,我无法将三个车道放入单独的数组中 - 我尝试了 watershed 算法,它给出了车道的边界,但是没有将它们分成不同的数组.

我想要的结果是拥有三个独立的数组,每个数组包含每条车道的所有像素编号。

我也扭曲了图像。

下面的屏幕截图是蒙版和原始扭曲图像的按位与。

您可以找到轮廓并填充它们并用作蒙版。 要查找轮廓,您可以使用 cv2.findContours() function in OpenCV. You can find an example in 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)rgb 值。然后你可以尝试 here for the second argument and values in here 中的值作为 findContours() 函数的第三个参数..