C++ openCV过滤器映像-用局部最大值替换内核
有关我的问题的一些详细信息: 我试图在openCV(另一种内置算法:Canny、Harris等)中实现角点检测器 我有一个矩阵,里面有响应值。最大响应值为-检测到角点的最大概率为 我有一个问题,在一个点附近检测到的角很少(但只有一个角)。我需要减少错误检测角点的数量 精确问题: 我需要用一个核遍历矩阵,计算每个核的最大值,保留最大值,但核中的其他值等于零C++ openCV过滤器映像-用局部最大值替换内核,c++,opencv,image-processing,filter,max,C++,Opencv,Image Processing,Filter,Max,有关我的问题的一些详细信息: 我试图在openCV(另一种内置算法:Canny、Harris等)中实现角点检测器 我有一个矩阵,里面有响应值。最大响应值为-检测到角点的最大概率为 我有一个问题,在一个点附近检测到的角很少(但只有一个角)。我需要减少错误检测角点的数量 精确问题: 我需要用一个核遍历矩阵,计算每个核的最大值,保留最大值,但核中的其他值等于零 是否有内置的openCV函数来执行此操作?我建议使用openCV内置函数的原始两步程序(可能存在更有效的方法): 步骤1:使用方形核(对应于您
是否有内置的openCV函数来执行此操作?我建议使用openCV内置函数的原始两步程序(可能存在更有效的方法):
我会这样做:
255
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内核进行处理后:
实心区域是由于共享的局部最大值造成的。如果您正在寻找一些内置功能,FilterEngine将帮助您创建自定义过滤器(内核)
此外,我建议在进行所有处理之前进行某种降噪处理,通常是模糊处理。除非你真的想要原始图像。你不是在寻找局部最大值吗?比如这里:我不需要在每个内核中只使用局部最大值,但我需要这样一个过滤器,当在每个步骤中内核中只保留局部最大值时,其他值为零不确定我是否理解您的意思,但在任何情况下,使用MinMaxLoc将其限制为内核(或ROI,并在图像中移动该ROI)应该不会起作用?就像他们的评论一样。嗯……但是是的,你是对的。我可以用一个内核遍历图像,并计算MinMaxLoc。它不仅返回值,还返回最大值的位置。然后我使内核中的所有元素都等于零,除了max。。。我第一次有这个想法,但我想openCV可能有更简单的内置功能来实现这一点。谢谢。是的,我明白了,这是extended@sansuiso的想法的实现。@inuendo-是的,很有趣,我在发帖之前没有读过他们的答案,这让我笑了;)@fraxel,我在回答一个相关问题后才注意到你的答案:)在我的回答中,我建议如何处理具有相同值的像素(高原)。