水边缘检测

时间:2014-02-22 21:14:29

标签: opencv edge-detection

在OpenCV中是否有一种可靠的方法来检测水线,例如此图像中河流的边缘?

http://www.pequannockriver.org/pics/river1.JPG

1 个答案:

答案 0 :(得分:1)

这项任务具有挑战性,因为必须使用技术组合。此外,对于每种技术,数值参数可能仅在非常窄的范围内正确地工作。这意味着人类专家必须通过对每个图像的反复试验来调整它们,或者必须使用许多不同的参数多次执行该技术,以便选择正确的结果。

以下大纲对此示例图像具有高度特异性。它可能不适用于任何其他图像。

一点建议: 像往常一样,任何多步骤图像分析都应始终以最可靠的步骤开始,然后继续到不太可靠的步骤。在可能的情况下,不太可靠的步骤应该利用更可靠步骤的结果来增强其自身的准确性。

天空检测

将图像转换为HSV颜色空间,找到位于图像上半部分的青色。

保留此HSV图像,因为它也适用于接下来的几个步骤。

灌木的检测

使用适当选择的sigma和阈值在灰度版图像上运行Canny边缘检测。这将拾取灌木上的树枝,看起来像一堆噪音。同时,水面会比较光滑。

在此技术中使用灰度,以减少反射对水面的影响(来自灌木的绿色和黄色反射)。可能有其他颜色空间(或预处理技术)更能够去除该反射。

从较低仰角角度检测水波纹

首先,标记已经归类为灌木或天空的任何图像部分。由于灌木检测比水检测更可靠,灌木检测的结果应该用于通知不太可靠的水检测。

<强>观察

由于仰角低的观点,水波纹呈水平伸长。实际上,每个图像特征都显示为水平拉伸。这称为Anisotropy。我们可以利用这种趋势来检测它们。

注意:我没有各向异性检测的经验。也许你可以从别人那里得到更好的想法。

创意1:

使用maximally-stable extremal regions (MSER)作为斑点检测器。

维基百科的介绍似乎令人生畏,但它确实与连接组件算法有关。可以像Dijkstra's algorithm那样完成一个简单的实现。

创意2:

请注意,图像要素是水平拉伸的,更简单的方法是将水平渐变的绝对值相加,并将其与垂直渐变的绝对值之和进行比较。