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

时间:2015-05-22 08:15:53

标签: opencv detection

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

以下更难:

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

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

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

3 个答案:

答案 0 :(得分:1)

根据我的理解,你正在寻找一条水平线 - 如果存在的话 - 将独家天空部分与其余部分分开。

我会逐行计算图像统计数据,所以水平直方图或与之类似。

它甚至可以基于全球门槛或定制的天空'功能。如果像素是天空或不是天空,则以某种方式决定(强度,色调)并在扫描线内计算它们。

然后水平地对齐一半图像,对两个部分的行值求和,并确定你的“水平线”的方向。应该被移动。这部分也是一半,直到你到达正确的行。通过这样的二分搜索,您应该能够提取哪条线将天空与前景分开。如果它是第一行:没有天空,如果是最后一个:全天。

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

答案 1 :(得分:1)

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

您可以在OpenCV中使用iOS执行此操作。将您的OpenCV项目与iPhone中的指南针链接。然后将天空与地面分开,就像指南针App那样做。

请参阅http://imgur.com/bwLpaOC

答案 2 :(得分:0)

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