OpenCV沿着一条线找到所有重要的边缘

时间:2012-03-21 23:10:37

标签: image opencv labview edge-detection

我有一个用于在LabView中使用名为Rake的方法进行分析的图像。基本上,该方法的作用是找到图像上沿平行线的所有重要边缘。 http://zone.ni.com/reference/en-XX/help/370281P-01/imaqvision/imaq_rake_3/(如链接底部的最后一张图片所示)。 这个函数的优点在于它将为您提供大于某个边缘强度的所有边缘点,并且每个边缘将仅生成一个边缘点(边缘线的粗细为1个像素)

我想用OpenCV做类似的事情。我这样想的方式是 - 使用我选择的过滤器解构Canny运算符, - 具有两个阈值的边缘值的滞后阈值 - 然后是非最大限度抑制 - 读取该行的像素并标记所有大于我的阈值的像素

问题是canny是一个捆绑,我无法自己找到nonmaxima抑制函数。 有没有人知道一种类似于我所描述的操作的方法?

由于

1 个答案:

答案 0 :(得分:0)

不确定我是否完全理解这个问题,但关于非捆绑的非最大抑制部分:

2d非最大抑制的一种简单方法是: 扩大图像。 OpenCV中的扩张将每个像素的值设置为本地邻域的max()。重复几次或使用更大的内核来获得所需的半径。

然后将扩张图像与原始图像进行比较,并将具有不同值的所有像素设置为零。

其余像素是局部最大值。

 # some code I once used in OpenCV/Python
 # given an image, sets all pixels to zero, unless they are local maxima
 def supressNonMaxima(img):
     localMax = cvCreateImage (cvGetSize(img), IPL_DEPTH_16U, 1)
     cvDilate(img, localMax, null, 3)  # max() with radius of 3

     mask = cvCreateImage( cvGetSize(img), 8, 1)
     cvCmp(img, localMax, mask, CV_CMP_LT)

     cvSet(img,0,mask)