使用 OpenCV 和 Python 准确寻找水域边缘

Posted

技术标签:

【中文标题】使用 OpenCV 和 Python 准确寻找水域边缘【英文标题】:Finding waters edge using OpenCV and Python accurately 【发布时间】:2017-01-18 22:55:22 【问题描述】:

我一直在努力尝试使用 OpenCV/Python 检测水的边缘,我得到的结果相当不准确,并且没有稳健性。 这是我到目前为止所取得的成就: Original Image, output image

Canny Edge detection

我目前正在做的是设置一些变量(高斯模糊的水平、用于 Canny 边缘检测的 sigma 以及测量的水平可以在每个点之间改变的最大偏差),执行“自动”Canny 边缘检测(测量中值像素强度并用于形成上下边界),然后从左下角向上移动以找到第一个“白色”像素。这是在帧的整个长度上以五次的 x 间隔完成的。

计算点的平均 y 值。然后测试每个点,看它是否偏离平均像素太远,偏差限制设置得更早。然后将剩余的点绘制在图像上作为蓝线。在每一帧记录绘制像素的平均值。

30 帧后,计算平均值并将其绘制为红线,然后假定为“真实”水位高度。

有人对更好的方法有任何想法吗?什么会使水的边缘更加突出?这种方法适用于我录制的大多数镜头,但效果不佳。

提前致谢。

【问题讨论】:

【参考方案1】:

我曾处理过类似的问题,希望这些建议可以在某种程度上帮助您:

尝试限制您的搜索区域:您能假设水位应该在哪里吗?还要考虑正确检测水位。假设在下一帧中水位将不断下降/上升是否安全?会慢慢改变吗?裁剪您的图像,以便仅考虑可以安全假设水位存在的区域。 更改色彩空间:您可以尝试在 HSV 等其他色彩空间中工作,以便将亮度与色度分开 霍夫变换线检测:尝试使用此算法搜索图像中的特定水平线或其他形状。 图像不失真:如有必要,尝试校正图像以纠正曲线,或使用反向透视映射 (IPM) 取消透视。

你也可以考虑改变边缘检测算法。

【讨论】:

类似的情况,但在不同的学科 - 我也使用中值滤波器来消除“热像素”失真。

以上是关于使用 OpenCV 和 Python 准确寻找水域边缘的主要内容,如果未能解决你的问题,请参考以下文章

基于OpenCV 的车牌识别

使用Python,OpenCV沿着轮廓寻找极值点

使用Python,OpenCV沿着轮廓寻找极值点

如何使用 Opencv 和 python 从网络上播放视频

TensorFlow 和 OpenCV 实时分类

通过 python opencv 寻找齿轮的牙齿