我的问题的一些细节:
我想实现的OpenCV角点检测(另一种算法,这是内置的:康力,哈里斯等)。
我有充满响应值的矩阵。 最大的响应值是 - 转角的最大概率检测出。
我有一个问题,即在一个点的附近有(但只能有一个)检测到几个小钱。 我需要减少检测假角落数。
确切的问题:
我需要通过矩阵与内核走路,每个计算内核的最大价值,离开最大值,但其他值在内核做出等于零。
是否有内置的OpenCV函数来做到这一点?
我的问题的一些细节:
我想实现的OpenCV角点检测(另一种算法,这是内置的:康力,哈里斯等)。
我有充满响应值的矩阵。 最大的响应值是 - 转角的最大概率检测出。
我有一个问题,即在一个点的附近有(但只能有一个)检测到几个小钱。 我需要减少检测假角落数。
确切的问题:
我需要通过矩阵与内核走路,每个计算内核的最大价值,离开最大值,但其他值在内核做出等于零。
是否有内置的OpenCV函数来做到这一点?
这是我会怎么做:
255
的比较阵列英寸 这是通过在这些图像放大所示:
9像素×9像素的原始图像:
用5×5像素内核处理之后,仅局部邻域极大值保持(即最大值从具有较大值的像素分隔超过2个像素。):
有一点需要注意。 如果两个相邻最大值具有相同的值,那么他们都将出现在最终的影像中。
下面是一些Python代码,它,它应该是很容易转换为C ++:
import cv
im = cv.LoadImage('fish2.png',cv.CV_LOAD_IMAGE_GRAYSCALE)
maxed = cv.CreateImage((im.width, im.height), cv.IPL_DEPTH_8U, 1)
comp = cv.CreateImage((im.width, im.height), cv.IPL_DEPTH_8U, 1)
#Create a 5*5 kernel anchored at 2,2
kernel = cv.CreateStructuringElementEx(5, 5, 2, 2, cv.CV_SHAPE_RECT)
cv.Dilate(im, maxed, element=kernel, iterations=1)
cv.Cmp(im, maxed, comp, cv.CV_CMP_EQ)
cv.Mul(im, comp, im, 1/255.0)
cv.ShowImage("local max only", im)
cv.WaitKey(0)
我不知道到现在为止,但这是@sansuiso在他/她的答案建议。
这可能是更好地与这一形象,前图所示:
通过5内核用5处理后:
固体区域是由于在共享局部最大值的值。
我建议一个原始2步方法(有可能存在更有效的方法),使用内置函数的OpenCV:
第1步:用方形内核形态膨胀(相当于你的邻居)。 这一步给你另一个图像,由内核内的最高值替换每个像素值之后。
步骤2:如果测试原始响应图像的每个像素的cornerness值等于由扩张步骤中给出的最大值。 如果没有,那么显然存在在附近一个更好的角落。
如果你正在寻找一些内置功能,FilterEngine会帮你做一个自定义过滤器(内核)。
http://docs.opencv.org/modules/imgproc/doc/filtering.html#filterengine
另外,我建议某种降噪,通常模糊,所有的处理之前。 也就是说,除非你真的想图像原始。