【问题标题】:Algorithm for determining the size of air bubbles from image从图像中确定气泡大小的算法
【发布时间】:2023-03-22 11:43:01
【问题描述】:

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

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

我尝试实现此处找到的代码解决方案:watershed image segmentation

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

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

【问题讨论】:

  • 您是否尝试过 OpenCV(或 Emgu CV for .Net...C#)?也许使用一些带有斑点检测器的二元过滤器应该足以至少检测到你的气泡......
  • 所以我尝试了一种需要 OpenCV 的不同算法,但是所有版本的库 Open CV 可用 NuGet 不起作用。
  • 如果有帮助的话,codegolf 上有一个challenge。用C# 回答

标签: c# image-editing watershed


【解决方案1】:

想到解决方案:

解决方案 1:

使用Hough transform for circles

解决方案 2:

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

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

  • 缩小图像。
  • 使用颜色。我注意到你只是让一切变灰;如果您有深蓝色背景和黑色边界,那将毫无意义。

【讨论】:

    【解决方案2】:

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

    附: Azure ML 作为所有花里胡哨的免费来源看起来不错,无需深入了解。

    【讨论】:

      【解决方案3】:

      您应该只训练一个Neural network 来识别没有气泡时的图像部分(例如 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
      }
      

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

      【讨论】:

      • 由于边缘检测使用似乎效果更好的方法,因为存在一些噪音(波、光反射),最好的办法可能是尝试高斯差异并手动调整它以仅看到气泡的边缘。
      • 神经网络是必要的,因为有明显的非气泡边缘(水池边缘,明亮的亮点),那些应该是手动禁用的区域或被NN丢弃的区域。当然,更好的方法是将相机定位在只有单色蓝色背景的位置,这样就不需要 NN。
      • 你能给出这个解决方案的代码示例吗?我在暗示解决方案方面遇到了问题,这与我在 C# 中必须解决的问题相同,而且我是 Delphi 的更多用户。
      • 如果你愿意,我可以在午休时间提供示例 C# sn-p,我不是 Delphi 程序员 :)
      • 好的,谢谢,我设法得到了想要的效果,我有某种类型的边缘确定,FastEdgeDetection 操纵伽玛/亮度/对比度和差异高斯。至于神经网络,我将以图像中的人脸检测算法为模型。感谢您的帮助
      【解决方案4】:

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

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

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

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

      For more information on how convolution matrices work see here.

      For more information on edge detection see here.

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

      【讨论】:

        猜你喜欢
        • 2011-12-23
        • 1970-01-01
        • 2018-06-13
        • 2016-07-31
        • 1970-01-01
        • 2018-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多