Lar*_*bar 4 c++ opencv image-processing max filter
关于我的问题的一些细节:
我正在尝试在openCV中实现角点检测器(另一种算法,内置:Canny,Harris等).
我有一个填充响应值的矩阵.最大的响应值是 - 检测到角点的最大概率是.
我有一个问题,即在一个点附近检测到的角很少(但只有一个).我需要减少错误检测到的角落数量.
确切的问题:
我需要使用内核遍历矩阵,计算每个内核的最大值,保留最大值,但内核中的其他值等于零.
是否有内置的openCV函数来执行此操作?
fra*_*xel 15
我就是这样做的:
255在比较数组中设置.这些放大图像说明了这一点:
9像素乘9像素原始图像:

在使用5 x 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)
Run Code Online (Sandbox Code Playgroud)
直到现在我才意识到这一点,但这就是@sansuiso在他/她的回答中提出的建议.
在此之前,可能会更好地说明这个图像:

用5 x 5内核处理后:

实心区域归因于共享的局部最大值.