【问题标题】:Image Segmentation in openCVopenCV中的图像分割
【发布时间】:2025-12-06 22:20:03
【问题描述】:

我有一张道路的图像。

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

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

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

但是,我无法将三个车道分成单独的数组 - 我尝试了 分水岭算法,它为我提供了车道的边界,但没有将它们分成不同的数组。

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

我也扭曲了图像。

下面的截图是掩码和原始扭曲图像的按位和。

【问题讨论】:

  • 使用image = cv2.bitwise_and(image,image,mask=mask_lanes)。看看它是否为您提供了车道。
  • 是的,我用过它并且有车道。图像为车道,其余为黑色。但我需要单独阵列中的车道。就像车道在不同阵列中的像素一样。
  • 你可以分享图片以供参考吗??
  • 我现在已经编辑了问题。
  • 那些蓝线是因为分水岭。你可以暂时忽略它们

标签: python opencv image-processing opencv-python


【解决方案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来创建掩码。

修改

首先确保rgb 值中的所有黑色区域都是(0, 0, 0)。然后你可以尝试here 中的值作为第二个参数,here 中的值作为findContours() 函数的第三个参数..

【讨论】:

  • 哦,对了,我也试过了,但是错过了,我得到了很多轮廓(每张图像大约 10-15 个),有什么办法可以过滤它们以获得只想要的那些?
  • 非常感谢,这给了我想要的结果,但是车道被打乱了。有没有办法让我从左到右对它们进行排序?
  • 这里的 contours 变量是contours 的列表,contour 是坐标列表。也许您可以尝试通过contours 的坐标值将它们分开。我没有想到其他方法..
  • @Ramesh-X 你可以在*.com/questions/60978380/…帮助我
最近更新 更多