从图像中确定气泡大小的算法
Algorithm for determining the size of air bubbles from image
我正在寻找一种从下图中分离出气泡的好方法。我正在使用 Visual Studio 2015 和 C#。
我听说过分水岭法,相信它可能是一个很好的解决方案。
我尝试实施此处找到的代码解决方案:watershed image segmentation
我没有取得太大的成功。该解决方案在查找功能时遇到问题,例如:FilterGrayToGray.
有谁知道这样做的好方法吗?
想到解决方案:
解决方案一:
使用 Hough transform for circles.
方案二:
以前我也被类似的图像分割任务困扰过。基本上我最终得到了一个洪水填充,这类似于你编写的分水岭算法。
我想在这里尝试的一些帽子戏法:
- 缩小图片。
- 使用颜色。我注意到你只是把一切都变灰了;如果您有深蓝色背景和黑色边界,那将毫无意义。
以防万一,如果您正在寻找一些乐趣 - 您可以调查 Application Example: Photo OCR。基本上你训练一个神经网络来检测气泡,然后在图像上滑动 window 来尝试它。当你捕获一个时 - 你使用另一个神经网络,它被训练来估计气泡大小或体积(你可能可以测量你的气流来训练神经网络)。它并不像听起来那么困难,并且提供了非常高的精度和适应性。
P.S。 Azure ML 看起来不错,作为所有花里胡哨的免费来源,无需深入。
您应该只训练一个 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
}
更多编辑待定..在此期间尝试自己记录,我已经给出了足够的跟踪让你完成这项工作,你只需要对简单的图像处理算法和现成的神经网络的使用有基本的了解。
您是要隔离单个图像中的气泡,还是要跟踪图像流中的同一个气泡?
要隔离 'bubble' 尝试在图像上使用卷积矩阵来检测边缘。您应该根据图像的性质选择边缘检测卷积。这是在 gimp 中完成的拉普拉斯边缘检测示例,但是无法直接在代码中实现。
这有助于隔离气泡的边缘。
如果您要跟踪流中的同一个气泡,这会更加困难,因为气泡在流过液体时会变形。如果帧速率足够高,则很容易看出帧与帧之间的差异,您可以判断它可能是哪个气泡(基于位置差异)。也就是说,您必须将当前帧与前一帧进行比较,并使用一些智能来尝试找出帧与帧之间哪个气泡相同。使用基准来帮助提供参考点也很有用。图像底部的喷嘴可能是一个很好的喷嘴,因为您可以为其生成一个签名(喷嘴不会改变形状!)并每次检查它。气泡的签名不会有太大帮助,因为它们可能会从一个图像到下一个图像发生巨大变化,因此您将处理斑点及其在图像中从一帧到下一帧的可能位置。
For more information on how convolution matrices work see here.
For more information on edge detection see here.
希望这对您有所帮助,祝您好运。
我正在寻找一种从下图中分离出气泡的好方法。我正在使用 Visual Studio 2015 和 C#。
我听说过分水岭法,相信它可能是一个很好的解决方案。
我尝试实施此处找到的代码解决方案:watershed image segmentation
我没有取得太大的成功。该解决方案在查找功能时遇到问题,例如:FilterGrayToGray.
有谁知道这样做的好方法吗?
想到解决方案:
解决方案一:
使用 Hough transform for circles.
方案二:
以前我也被类似的图像分割任务困扰过。基本上我最终得到了一个洪水填充,这类似于你编写的分水岭算法。
我想在这里尝试的一些帽子戏法:
- 缩小图片。
- 使用颜色。我注意到你只是把一切都变灰了;如果您有深蓝色背景和黑色边界,那将毫无意义。
以防万一,如果您正在寻找一些乐趣 - 您可以调查 Application Example: Photo OCR。基本上你训练一个神经网络来检测气泡,然后在图像上滑动 window 来尝试它。当你捕获一个时 - 你使用另一个神经网络,它被训练来估计气泡大小或体积(你可能可以测量你的气流来训练神经网络)。它并不像听起来那么困难,并且提供了非常高的精度和适应性。
P.S。 Azure ML 看起来不错,作为所有花里胡哨的免费来源,无需深入。
您应该只训练一个 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
}
更多编辑待定..在此期间尝试自己记录,我已经给出了足够的跟踪让你完成这项工作,你只需要对简单的图像处理算法和现成的神经网络的使用有基本的了解。
您是要隔离单个图像中的气泡,还是要跟踪图像流中的同一个气泡?
要隔离 'bubble' 尝试在图像上使用卷积矩阵来检测边缘。您应该根据图像的性质选择边缘检测卷积。这是在 gimp 中完成的拉普拉斯边缘检测示例,但是无法直接在代码中实现。
这有助于隔离气泡的边缘。
如果您要跟踪流中的同一个气泡,这会更加困难,因为气泡在流过液体时会变形。如果帧速率足够高,则很容易看出帧与帧之间的差异,您可以判断它可能是哪个气泡(基于位置差异)。也就是说,您必须将当前帧与前一帧进行比较,并使用一些智能来尝试找出帧与帧之间哪个气泡相同。使用基准来帮助提供参考点也很有用。图像底部的喷嘴可能是一个很好的喷嘴,因为您可以为其生成一个签名(喷嘴不会改变形状!)并每次检查它。气泡的签名不会有太大帮助,因为它们可能会从一个图像到下一个图像发生巨大变化,因此您将处理斑点及其在图像中从一帧到下一帧的可能位置。
For more information on how convolution matrices work see here.
For more information on edge detection see here.
希望这对您有所帮助,祝您好运。