我有一幅图像,我曾经使用一种称为Rake的方法在LabView中进行分析。基本上,该方法的作用是找到图像上沿平行线的所有有效边缘。
http://zone.ni.com/reference/en-XX/help/370281P-01/imaqvision/imaq_rake_3/(在链接底部的最后一个图像中看到)。
此功能的优点在于,它将为您提供所有大于特定边缘强度的边缘点,并且每个边缘只会生成一个边缘点(边缘线的厚度为1像素)
我想使用OpenCV做类似的事情。我可以想象的方式是
-用我选择的过滤器解构Canny运算符,
-具有两个阈值的边缘值的滞后阈值
-随后非最大抑制
-读取该行上的像素并标记所有大于我的阈值的像素
问题是canny是 bundle 销售的,我自己找不到nonmaxima抑制函数。
有人知道做与我描述的操作类似的方法吗?
谢谢
最佳答案
不知道我是否完全理解这个问题,但是关于非 bundle 的非最大抑制部分:
二维非最大抑制的一种简单方法是:
放大图像。 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)
https://stackoverflow.com/questions/9814183/