【问题标题】:How to segment curved roads/lanes/paths/tracks/objects etc?如何分割弯曲的道路/车道/路径/轨道/对象等?
【发布时间】:2021-05-21 02:54:02
【问题描述】:

有没有像下图那样使用图像处理技术分割检测轨迹?

图 1:沙地上的车轮轨迹

图 2:要检测的轨道示例

【问题讨论】:

  • 即使是很难看到轨迹的人类。即使您可以分割轨道像素,我认为由于所有交叉点都很难提取轨道。根据我的直觉,我猜这目前还不能很好地解决。
  • 如果每一帧只存在一个轨道(以蓝色绘制)而不是其他轨道的交叉点和人群。在这种情况下是否可以只跟踪一个轨道段?
  • 分割轨道像素,也许你可以提一下如何做到这一点?
  • 问题在于跟踪整个轨道路径。由于不同图像的强度不同,很难找到一种万能的解决方案。另一个问题是轨道的尾部,我认为这很难检测到。我建议你研究一个深度学习解决方案(试试lmb.informatik.uni-freiburg.de/people/ronneber/u-net)。如果您有足够的数据(如果不使用迁移学习)以及标记它们的时间。干杯。
  • @Merlin 我认为即使分割轨道像素对于此类图像也非常具有挑战性。您可以尝试像 SOBEL 算子这样的梯度提取,结合一些聚类或局部归一化,并将结果与​​颜色聚类的一些掩蔽相结合(以区分沙子与海/海岸/遮阳伞和其他导致边缘/渐变的东西)。但实际上,这对我来说非常具有挑战性。

标签: python opencv image-processing computer-vision image-segmentation


【解决方案1】:

在我看来,答案是否定的。首先我去掉了光照效果,然后应用 Canny 来获取图像的特征,只有部分轨迹是可见的。接下来,我执行了彩色分割以获得二进制掩码。然后我使用二进制掩码去除背景,再次看到唯一的部分轨道。


    1. 去除光照效果:为了让轨迹更显眼,我们需要减少图像中的闪电。为了减少,我们将使用cv2.GaussianBlur 平滑图像,然后使用cv2.divide 使像素在比例范围内均匀分布。
    • # Load the image
      img = cv2.imread("v1uU4.jpg")
      
      # Convert to the gray-scale
      gry = convert_to_grayscale(img)
      
      # Remove the lightning effect
      blr = cv2.GaussianBlur(gry, (125, 125), 0)
      div = cv2.divide(gry, blr, scale=192)
      
    1. 显示图像的特征:然后我们加载非光照图像,将其转换为灰度,应用高斯平滑得到图像的特征:
    • # Load non-lightning image
      img = cv2.imread("non-lightning.png")
      
      # Convert to the gray-scale
      gry = convert_to_grayscale(img)
      
      # Remove the lightning effect
      blr = cv2.GaussianBlur(gry, (5, 5), 0)
      
      # Find canny features
      cny = cv2.Canny(blr, 50, 200)
      
    • 在这里您可以看到只有轨道的左侧部分可见。当然,不同的参数会给出不同的结果。如果您愿意尝试它们,就会有更多不需要的功能可用。


  • 第二种方法

    1. 颜色分割 我们将加载非照明图像,转换为 HSV 颜色空间并使用cv2.inRange 找到二进制掩码。然后我们使用二进制掩码使轨道更加明显。
    • # Convert to HSV color-space
      hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
      
      # Perform color-segmentation to get the binary mask
      lwr = np.array([0, 0, 0])
      upr = np.array([179, 255, 194])
      msk = cv2.inRange(hsv, lwr, upr)
      
    1. 使用二进制掩码提取轨迹:
    • # Extracting the rod using binary-mask
      krn = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 30))
      dlt = cv2.dilate(msk, krn, iterations=5)
      res = 255 - cv2.bitwise_and(dlt, msk)
      

在我看来,移除背景并只显示可见轨道是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2012-12-12
    • 2023-03-02
    • 2014-02-25
    • 2017-03-28
    • 2010-11-22
    • 2022-06-14
    相关资源
    最近更新 更多