使用 OpenCV 和 Python 准确地寻找水边

Finding waters edge using OpenCV and Python accurately

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

Canny Edge detection

我目前正在做的是设置一些变量(高斯模糊的级别,用于 Canny 边缘检测的西格玛,以及测量的级别在每个点之间可以变化的最大偏差),执行 'automatic' Canny 边缘检测(测量中值像素强度并用于形成下边界和上边界),然后从左下角向上移动以找到第一个 'white' 像素。这是在帧的整个长度的五个 x 间隔内完成的。

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

30帧后,计算平均值并绘制为红线,然后假定为'real'水高。

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

提前致谢。

我也曾处理过类似的问题,希望这些建议能对您有所帮助:

  • 尽量限制你的搜索范围:你能假设水位应该在哪里吗?还要考虑是否已正确检测到水位。可以安全地假设在下一帧中水位将持续 decrease/increase 吗?会慢慢改变吗?裁剪图像,以便仅考虑可以安全假设存在水位的区域。
  • 更改颜色space:您可以尝试使用其他颜色 spaces,例如 HSV,以便将亮度与色度分开
  • 霍夫变换直线检测:尝试使用此算法搜索图像中特定的水平线,或其他形状。
  • 图像去畸变:必要时尝试校正图像以矫正曲线,或使用逆透视映射(IPM)取消透视。

您也可以考虑更改边缘检测算法。