9

我正在寻找一种从下图中隔离气泡的好方法。我正在使用 Visual Studio 2015 和 C#。

我听说过分水岭方法,并相信它可能是一个很好的解决方案。

我尝试实现此处找到的代码解决方案:分水岭图像分割

我没有取得太大的成功。该解决方案无法找到函数,例如:FilterGrayToGray。

有谁知道这样做的好方法?

图像示例

4

4 回答 4

4

你应该只训练一个神经网络在没有气泡时识别图像的某些部分(例如 16x16 像素组)。然后,当识别正方形不成功时,您会进行一系列水平扫描线并记录边缘开始和结束的位置。您可以在图像上非常精确地确定气泡的截面(但确定其体积需要考虑表面曲率,这是可能的,但更难)。如果您有可能使用更多相机,您可以对气泡的更多部分进行三角测量,并准确了解实际体积。作为另一个了解气泡大小的启发式方法,您还可以使用已知的体积吞吐量,因此您知道如果在某个时间间隔内排放 X 升空气,

显示调整后的不同图像

如您所见,您可以使用高斯差分和对比度等简单算法来获得不同的质量结果。

  • 在左图中,您可以轻松消除所有背景噪音,但是您现在已经丢失了部分气泡。您可以通过在泳池上使用不同的照明来重新获得错过的气泡边缘
  • 在右图中,您拥有整个气泡边缘,但现在您还需要从图片中手动丢弃更多区域。

至于边缘检测算法,您应该使用不向边缘添加固定偏移量的算法(如卷积矩阵或拉普拉斯),为此我认为高斯差分效果最好。

保留所有中间数据,以便可以轻松验证和调整算法并提高其精度。

编辑:

代码取决于您使用的库,您可以轻松实现高斯模糊和水平扫描线,对于神经网络,已经有 c# 解决方案。

// Do gaussian difference
Image ComputeGaussianDifference (Image img, float r1, float r2){
    Image img = img.GaussianBlur( r1);
    Image img2 = img.GaussianBlur( r2);
    return (img-img2).Normalize(); // make values more noticeable
}

更多编辑待定..同时尝试自己记录,我已经提供了足够的线索让你完成这项工作,你只需要对简单的图像处理算法和现成的神经网络的使用有基本的了解。

于 2016-05-27T08:19:17.027 回答
2

以防万一,如果您正在寻找一些乐趣 - 您可以研究应用示例:照片 OCR。基本上你训练一个神经网络来检测气泡,然后在图像的滑动窗口上尝试它。当您捕获一个时 - 您使用另一个 NN,该 NN 被训练来估计气泡大小或体积(您可能可以测量您的气流来训练 NN)。它并不像听起来那么困难,并且提供了非常高的精度和适应性。

PS Azure ML 作为所有花里胡哨的免费来源看起来不错,无需深入研究。

于 2016-05-27T08:06:14.083 回答
1

想到解决方案:

解决方案1:

对圆使用Hough 变换

解决方案2:

过去,我在处理类似的图像分割任务时也遇到了很多麻烦。基本上我最终得到了洪水填充,这类似于您编写的分水岭算法。

我会在这里尝试一些帽子戏法:

  • 缩小图像。
  • 使用颜色。我注意到你只是让一切变灰;如果您有深蓝色背景和黑色边界,那将毫无意义。
于 2016-05-27T07:34:03.273 回答
1

您希望在单个图像中隔离气泡,还是从图像流中跟踪相同的气泡?

要隔离“气泡”,请尝试在图像上使用卷积矩阵来检测边缘。您应该根据图像的性质选择边缘检测卷积。这是在 gimp 中完成的拉普拉斯边缘检测的示例,但是在代码中直接实现是失败的。

拉普拉斯边缘检测

这有助于隔离气泡的边缘。

如果您要跟踪流中的同一个气泡,这将更加困难,因为气泡在流过液体时会变形。如果帧速率足够高,则很容易看到帧与帧之间的差异,并且您可以判断它可能是哪个气泡(基于位置差异)。即,您必须将当前帧与前一帧进行比较,并使用一些智能来尝试找出哪个气泡在帧与帧之间是相同的。使用基准来帮助提供参考点也会很有用。图像底部的喷嘴可能会很好,因为您可以为其生成签名(喷嘴不会改变形状!)并每次检查。气泡的签名不会有太大帮助,因为它们可能会从一个图像到下一个图像发生巨大变化,

有关卷积矩阵如何工作的更多信息,请参见此处

有关边缘检测的更多信息,请参见此处。

希望这有帮助,祝你好运。

于 2016-05-27T08:30:51.233 回答