在OpenCV中找到天空/地面分离



我正在尝试检测图像中的地平线,并返回天空的遮罩(或倒置为地面)。虽然它似乎有很多用途,但我正在努力寻找一个好的解决方案。更糟糕的是,这似乎是一个如此简单的问题,大多数人在探测视界方面没有问题。

下面的代码使它更难:

  • 地平线在使用的图像中很少是一条直线(山地景观),因此边缘检测和霍夫线变换将不起作用。
  • 需要在所有光照条件下工作。阈值(如Otsu阈值)可以工作,但在日出前等低对比度条件下效果不佳。固定值阈值不起作用,因为光线在一天中变化太大。

我现在尝试的是使用颜色滤镜将其限制为低饱和度,然后找到轮廓并检测和填充最大的轮廓。在此之后,我填充轮廓上方的区域。这确实有效,但我仍然无法想象这个问题会如此困难。

我在Delphi XE8中编写代码,使用OpenCV包装器,但欢迎使用任何其他语言的答案或想法!

在我的理解中,你是在寻找一条水平线-如果存在的话-将唯一的天空部分与其他部分分开。

我会逐行计算图像统计,所以是水平直方图或类似的。

它甚至可以基于全局阈值或自定义的"天空"函数。以某种方式(强度,色调)决定像素是否为天空,并在扫描线内计算它们。

然后将图像的一半水平,将两部分的行值相加,并决定"水平线"应该移动的方向。把这部分也翻一半,一直翻到正确的那一排。有了这样的二元搜索,你应该能够提取哪条线将天空与前景分开。如果是第一行:no sky,如果是最后一行:all sky。

这个问题肯定有其他的解决方法,所以我期待看到更多的建议。

我的答案完全不同。您可以将OpenCV与磁罗盘连接起来,将天空与地面分开。

你可以在iOS的OpenCV中这样做。将你的OpenCV项目与IPhone中的指南针链接起来。然后把天空和地面分开,就像指南针应用程序那样。

见https://i.stack.imgur.com/P00oG.jpg

你可以尝试卷积深度神经网络,比如http://mi.eng.cam.ac.uk/projects/segnet/,或者训练你自己的类似网络。

相关内容

  • 没有找到相关文章

最新更新