从图像中确定气泡大小的算法

9
我正在寻找一种好的方法来从以下图像中隔离出一个气泡。我正在使用Visual Studio 2015和C#。
我听说过分水岭方法,并认为它可能是一个好的解决方案。
我尝试实现在此处找到的代码解决方案:watershed image segmentation 我没有取得很大的成功。该解决方案有问题,例如:FilterGrayToGray函数无法找到。
有人知道一个好的方法吗? Example of Image

1
你尝试过OpenCV(或Emgu CV for .Net... C#)吗?也许使用一些二进制滤镜和斑点探测器就足以至少检测出你的气泡了... - Alex S. Diaz
所以我尝试了一个需要OpenCV的不同算法,但是NuGet提供的所有版本的OpenCV库都无法工作。 - Toster
1
有一个关于计算大米粒数的编程挑战,可以参考一下这个链接:http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice。使用C#语言可以回答这个问题。 - CSharpie
4个回答

4
你只需要训练一个神经网络,使其能够识别没有气泡的图像部分(例如16x16像素的组)。如果无法成功识别正方形,则可以进行一系列水平扫描线,并记录边缘的起始和结束位置。你可以在图像上相当精确地确定气泡的区域(但要确定其体积需要考虑到表面曲率,这可能会更加困难)。如果有使用更多摄像机的可能性,则可以三角测量气泡的更多部分并获得真实体积的精确概念。还有另一种启发式方法来了解气泡大小,即使用已知的体积通过量,因此如果在时间间隔内排放了X升空气,并且气泡具有一定比例的截面,您可以重新分配总体积以进一步增加精度(当然,必须考虑压力,因为池底的气泡会更小)。

Show different images tweaked

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

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

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

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

编辑:

代码取决于您使用的库,您可以轻松实现高斯模糊和水平扫描线,对于神经网络,已经有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
}

还有更多的编辑待处理...在此期间尝试自己完成文档,我已经给出足够的线索让你完成工作,你只需要基本了解简单的图像处理算法和使用现成的神经网络。


由于存在一些噪音(波浪,光反射)问题,因此可以使用似乎效果更好的边缘检测方法,最好的方法可能是尝试高斯差分并手动调整以仅看到气泡的边缘。 - CoffeDeveloper
1
神经网络是必要的,因为存在明显的非气泡边缘(池边缘、明亮的高光),这些应该是手动禁用区域或被NN丢弃的区域。当然,更好的方法是将相机定位在只有单色蓝色背景的位置,这将消除对NN的要求。 - CoffeDeveloper
1
如果你需要的话,我可以在午休时间后提供一个C#代码片段示例,但我不是Delphi程序员 :) - CoffeDeveloper
你能告诉我你使用了哪些库吗?因为我在这方面遇到了不小的问题。AForge中的高斯模糊在我的代码中有问题,能否详细说明一下你是如何使用该库以及如何从C#端处理图像神经网络的?我在C#方面感到非常迷茫。 - Toster
1
好的,谢谢。我成功地获得了所需的效果,我使用了一些边缘检测技术,包括FastEdgeDetection、gamma / 亮度 / 对比度和高斯差分。至于神经网络,我将基于图像中人脸检测的算法进行建模。感谢您的帮助。 - Toster
显示剩余5条评论

2

如果你正在寻找一些有趣的事情,可以研究一下应用示例:光学字符识别。基本上,你需要训练一个神经网络来检测气泡,并在图像上滑动窗口进行尝试。当你捕捉到一个气泡时,你可以使用另一个已经训练好的神经网络来估计气泡的大小或体积(你可能可以通过测量空气流来训练神经网络)。这并不像听起来那么困难,并且提供了非常高的精度和适应性。

P.S. Azure ML看起来很不错,是一个免费的资源,拥有所有功能而无需深入了解。


1

有两个解决方案:

解决方案1:

使用霍夫变换检测圆形

解决方案2:

我以前也在类似的图像分割任务中遇到了很多麻烦。基本上我最终采用了洪水填充,这类似于你编程的分水岭算法。

以下是我会尝试的一些技巧:

  • 缩小图像。
  • 使用颜色。我注意到你只将所有内容都变成灰色;如果你有一个深蓝色的背景和黑色的边界,那么这样做就没有多大意义。

1
你是想单独处理一张图片中的气泡,还是想从图像流中追踪同一个气泡?
如果要单独处理气泡,请尝试在图像上使用卷积矩阵来检测边缘。您应该根据图像的特性选择边缘检测卷积核。这里有一个在gimp中执行laplace边缘检测的示例,但在代码中实现也相当简单。

Laplace edge detection

这可以帮助隔离气泡的边缘。
如果您正在追踪相同的气泡从流中产生,由于气泡在液体中流动时会扭曲,因此这更加困难。如果帧速率足够高,则很容易从一帧到另一帧看到差异,并且可以判断可能是哪个气泡(基于位置差异)。即您需要将当前帧与上一帧进行比较,并使用一些智能尝试从一帧到另一帧确定相同的气泡。使用基准物来帮助提供参考点也很有用。图像底部的喷嘴可能是一个好选择,因为您可以为其生成签名(喷嘴形状不会改变!)并每次检查它。气泡的签名不会太有用,因为它们可能会从一幅图像到另一幅图像大幅变化,因此您将处理从一帧到另一帧图像中斑点及其可能的位置。 有关卷积矩阵工作原理的更多信息,请参见此处有关边缘检测的更多信息,请参见此处。 希望这有所帮助,祝你好运。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接