边缘检测的最快方法是什么?

时间:2010-10-05 11:26:32

标签: algorithm performance graphics image-processing edge-detection

我正在考虑为工业问题实施基于图像处理的解决方案。

图像由红色矩形组成。在里面我会看到一个圆圈矩阵。要求是计算以下约束下的圆圈数。 (实际应用:计算瓶套中的瓶数。任何缺少的瓶子???)

  
      
  1. 手术所用的时间应该非常短。
  2.   
  3. 我也需要检测红色矩形。我的目标是数数   包装中的物品,没有   机制(传感器)触发   相机。所以相机需要捕捉   照片不断但是   程序应该有一种丢弃的方法   不必要的图像。
  4.   
  5. 处理应该是实时的。
  6.   
  7. 图像捕获中可能存在“噪音”。您可能会看到椭圆而不是圆圈。
  8.   

我的问题如下,

  
      
  1. 与给定匹配的最佳边缘检测算法是什么   场景?
  2.   
  3. 除边缘外,还有其他任何机制可以使用吗?   检测
  4.   
  5. 我使用的语言和表现之间是否有很大的影响   系统?
  6.   

6 个答案:

答案 0 :(得分:8)

AHH - 你现在告诉我们瓶子在固定的位置!

这是一个令人难以置信的简单问题。

你要做的就是看看12个斑点中的每个斑点,看看那里是否有黑色区域。没有比这更容易了。

您无需进行任何边缘或形状检测。

就这么简单。

然后你指出盒子可能会被旋转,事情可能会摇摇欲坠。盒子可以旋转一点(甚至很多,每次0到360)非常容易处理。瓶子处于“槽”(即使是摇摆)的事实大大改变了问题的性质。你的主要问题(这很容易)等待每个新的红色方块(板条箱)在相机下居中。我刚刚意识到你的字面意思是“矩阵”,特别是你原始问题中的句子。与发现混乱的圆圈相比,这完全改变了一切。找到斑点是否在12点之一处“开启”是“识别图像中的圆圈”的一个完全不同的问题。也许你可以张贴一张图片来结束这个问题。


最后我相信下面的Kenny确定了最佳解决方案 :blob分析。


“计算瓶套中的瓶子数量”......

个别瓶子是否位于“插槽”中?即,有4x3 = 12个孔,每个瓶子一个。

换句话说,你“只”必须确定12个洞中每个洞中是否有一个瓶子。

这是对的吗?

如果是这样,你的问题就比“任何地方”的一堆瓶子更普遍的问题要容易得多。

很简单,我们从哪里看到瓶子?顶部,侧面,底部或?我们总是看到顶部/底部,或者它们是混合的(即,从顶部到尾部包装)。这些问题产生巨大的巨大差异。

答案 1 :(得分:3)

冲浪/筛选=在这种情况下矫枉过正你肯定不需要它。

如果您想要实时速度(800x600图像上大约20fps +),我建议使用Cuda使用sobel之类的标准滤镜方案实现边缘检测,然后实施二值化+ image closure确保圆的边缘不分开。

最难的部分是装配圆圈。这假设你已经到了你已经采取边缘并确保它们使用图像闭合(形态学)连接的步骤。此时我将按如下方式进行:

  1. 运行blob analysis/connected components以分割出触摸的圈子。如果圈子可以触及下一步将会更加棘手
  2. 对于每个连接的组件/ blob使用可以实时运行的RANSAC拟合圆形或矩形(与Hough变换相反,我相信非常难以实时运行。 )
  3. 如果你不能单独划分形成圈子的连通组件,那么第2步将会更加 ,因此应该对如何保证这种情况进行一些额外的考虑。

    祝你好运。

    修改

    考虑到这一点之后,我觉得RANSAC非常适合圆形连接组件触摸的情况。 RANSAC应该假设圆圈只适用于连接组件的一部分(由于它能够在大多数异常点的情况下表现良好。)这意味着您可以添加额外的检查以查看拟合圆是否包含整个连接组件,如果没有,则在被忽略的连接组件部分重新运行RANSAC。根据需要冲洗并重复多次。

    此外,我意识到我说圈子,但你可以使用RANSAC轻松地拟合椭圆而不是圆圈。

    另外,我想评论一下,当我说CUDA是一个不错的选择时,我的意思是CUDA是实现sobel滤镜+ binirization +图像关闭的不错选择。连接组件和RANSAC可能最好留给CPU,但是你可以尝试将它们推到CUDA上,虽然我不知道GPU会给你带来多大的优势。

答案 2 :(得分:2)

  • 对于圈子,尝试Hough变换。
  • 其他机制:dunno
  • 编译语言可能会更快。

答案 3 :(得分:1)

  1. 颜色之和+凸包以检测边界。大多数情况下,你需要一个矩形的四个角,而不是它的边?
  2. 没有动作,没有第二个相机,一点点选择 - 许多数学方法对一点输入(颜色直方图,颜色分布矩阵)。说不上。
  3. Java ==高内存消耗,Lisp ==高脑消耗,C ++ ==记忆/ cpu /速度/大脑使用最佳。

答案 4 :(得分:1)

SIFT应该对圆形物体有很好的反应 - 但它已获得专利。 GLOH是一个类似的算法,但我不知道是否有任何实现可供使用。

实际上,做一些更多的研究,SURF是SIFT的改进版本,有很多可用的实现,请查看维基百科页面上的链接。

答案 5 :(得分:1)

如果对比度良好,blob analysis是作业的算法。