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

And*_*zer 11 opencv detection

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

以下更难:

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

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

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

ren*_*nsz 3

根据我的理解,您正在寻找一条水平线(如果存在)将唯一的天空部分与其余部分分开。

我会逐行计算图像统计数据,因此水平直方图或类似的。

它甚至可以基于全局阈值或自定义“天空”函数。以某种方式确定像素是否是天空(强度、色调),并在扫描线内对它们进行计数。

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

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