openCV中的图像分割

3
我有一张路的图像。
我对其应用了颜色阈值,并得到了黄色和白色标记的掩模(cv2.inRange)。
然后,我在掩模上获得了特定区域的轮廓以消除噪声(cv2.findContours)。
我已经获得了良好的掩模,其中白色为车道,其他地方为黑色。
然而,我无法将三条车道分别放入不同的数组中 - 我尝试了分水岭算法,它给我车道的边界,但没有将它们分成不同的数组。
我的期望结果是有三个单独的数组,每个数组包含每条车道的所有像素编号。
我也对图像进行了透视变换。
下面的截图是掩模和原始透视变换图像的按位与。

enter image description here


使用 image = cv2.bitwise_and(image,image,mask=mask_lanes)。看看它是否给出了车道线。 - zindarod
是的,我用了那个并且有车道线。图像是车道线和其余部分都是黑色的。但是我需要将车道线放在单独的数组中。也就是说,将车道线的像素放在不同的数组中。 - Shreyas Pimpalgaonkar
2
你能分享一张参考图片吗? - vasu gupta
我现在已经编辑了问题。 - Shreyas Pimpalgaonkar
那些蓝色的线是由于分水岭算法引起的。你现在可以忽略它们。 - Shreyas Pimpalgaonkar
@ShreyasPimpalgaonkar,你可以在https://stackoverflow.com/questions/60978380/how-to-remove-the-background-of-the-image-of-interest-using-opencv-on-android中帮助我吗? - Carlos Diego
1个回答

1
你可以找到轮廓并填充它们以用作掩码。 要查找轮廓,可以使用OpenCV中的cv2.findContours()函数。您可以在OpenCV文档中找到示例。
如文档所述,您可以通过以下方式获取轮廓:
_, 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 来创建掩模。

修改

首先确保所有黑色区域的 rgb 值都为 (0, 0, 0)。 然后,您可以尝试在此处使用第二个参数中的值,并在findContours()函数的第三个参数中使用此处中的值。


哦,没错,我也试过那个,但是错过了。我的图像中有很多轮廓(每张大约10-15个),有没有办法可以过滤掉其他的,只得到所需的轮廓呢? - Shreyas Pimpalgaonkar
非常感谢,这给了我想要的结果,但是车道顺序被打乱了。有没有办法可以按从左到右的顺序对它们进行排序? - Shreyas Pimpalgaonkar
这里的 contours 变量是 contour 列表,而 contour 是坐标列表。也许你可以尝试通过 contour 的坐标值来将它们分离。我没有想到任何其他方法。 - Ramesh-X
@Ramesh-X,你能帮我解决这个问题吗?https://stackoverflow.com/questions/60978380/how-to-remove-the-background-of-the-image-of-interest-using-opencv-on-android - Carlos Diego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接