在OpenCV中是否有一种可靠的方法来检测水线,例如此图像中河流的边缘?
答案 0 :(得分:1)
这项任务具有挑战性,因为必须使用技术组合。此外,对于每种技术,数值参数可能仅在非常窄的范围内正确地工作。这意味着人类专家必须通过对每个图像的反复试验来调整它们,或者必须使用许多不同的参数多次执行该技术,以便选择正确的结果。
以下大纲对此示例图像具有高度特异性。它可能不适用于任何其他图像。
一点建议: 像往常一样,任何多步骤图像分析都应始终以最可靠的步骤开始,然后继续到不太可靠的步骤。在可能的情况下,不太可靠的步骤应该利用更可靠步骤的结果来增强其自身的准确性。
将图像转换为HSV颜色空间,找到位于图像上半部分的青色。
保留此HSV图像,因为它也适用于接下来的几个步骤。
使用适当选择的sigma和阈值在灰度版图像上运行Canny边缘检测。这将拾取灌木上的树枝,看起来像一堆噪音。同时,水面会比较光滑。
在此技术中使用灰度,以减少反射对水面的影响(来自灌木的绿色和黄色反射)。可能有其他颜色空间(或预处理技术)更能够去除该反射。
首先,标记已经归类为灌木或天空的任何图像部分。由于灌木检测比水检测更可靠,灌木检测的结果应该用于通知不太可靠的水检测。
<强>观察强>
由于仰角低的观点,水波纹呈水平伸长。实际上,每个图像特征都显示为水平拉伸。这称为Anisotropy。我们可以利用这种趋势来检测它们。
注意:我没有各向异性检测的经验。也许你可以从别人那里得到更好的想法。
创意1:
使用maximally-stable extremal regions (MSER)作为斑点检测器。
维基百科的介绍似乎令人生畏,但它确实与连接组件算法有关。可以像Dijkstra's algorithm那样完成一个简单的实现。
创意2:
请注意,图像要素是水平拉伸的,更简单的方法是将水平渐变的绝对值相加,并将其与垂直渐变的绝对值之和进行比较。