Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ openCV过滤器映像-用局部最大值替换内核_C++_Opencv_Image Processing_Filter_Max - Fatal编程技术网

C++ openCV过滤器映像-用局部最大值替换内核

C++ openCV过滤器映像-用局部最大值替换内核,c++,opencv,image-processing,filter,max,C++,Opencv,Image Processing,Filter,Max,有关我的问题的一些详细信息: 我试图在openCV(另一种内置算法:Canny、Harris等)中实现角点检测器 我有一个矩阵,里面有响应值。最大响应值为-检测到角点的最大概率为 我有一个问题,在一个点附近检测到的角很少(但只有一个角)。我需要减少错误检测角点的数量 精确问题: 我需要用一个核遍历矩阵,计算每个核的最大值,保留最大值,但核中的其他值等于零 是否有内置的openCV函数来执行此操作?我建议使用openCV内置函数的原始两步程序(可能存在更有效的方法): 步骤1:使用方形核(对应于您

有关我的问题的一些详细信息:

我试图在openCV(另一种内置算法:Canny、Harris等)中实现角点检测器

我有一个矩阵,里面有响应值。最大响应值为-检测到角点的最大概率为

我有一个问题,在一个点附近检测到的角很少(但只有一个角)。我需要减少错误检测角点的数量

精确问题:

我需要用一个核遍历矩阵,计算每个核的最大值,保留最大值,但核中的其他值等于零


是否有内置的openCV函数来执行此操作?

我建议使用openCV内置函数的原始两步程序(可能存在更有效的方法):

  • 步骤1:使用方形核(对应于您的邻居)进行形态学膨胀。这一步为您提供了另一幅图像,将每个像素值替换为内核中的最大值

  • 步骤2:测试原始响应图像每个像素的角度值是否等于膨胀步骤给出的最大值。如果不是的话,那么很明显,附近有一个更好的角落


  • 我会这样做:

  • 创建一个内核,它定义一个像素邻域
  • 通过使用此内核扩展图像来创建新图像。此放大图像包含每个点的最大邻域值
  • 在这两个数组之间进行相等性比较。如果它们相等,则为有效的邻域最大值,并在比较数组中设置为
    255
  • 将比较数组与原始数组相乘(适当缩放)
  • 这是您的最终数组,仅包含邻域极大值
  • 这些放大的图像说明了这一点:

    9像素x 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内核进行处理后:


    实心区域是由于共享的局部最大值造成的。

    如果您正在寻找一些内置功能,FilterEngine将帮助您创建自定义过滤器(内核)


    此外,我建议在进行所有处理之前进行某种降噪处理,通常是模糊处理。除非你真的想要原始图像。

    你不是在寻找局部最大值吗?比如这里:我不需要在每个内核中只使用局部最大值,但我需要这样一个过滤器,当在每个步骤中内核中只保留局部最大值时,其他值为零不确定我是否理解您的意思,但在任何情况下,使用MinMaxLoc将其限制为内核(或ROI,并在图像中移动该ROI)应该不会起作用?就像他们的评论一样。嗯……但是是的,你是对的。我可以用一个内核遍历图像,并计算MinMaxLoc。它不仅返回值,还返回最大值的位置。然后我使内核中的所有元素都等于零,除了max。。。我第一次有这个想法,但我想openCV可能有更简单的内置功能来实现这一点。谢谢。是的,我明白了,这是extended@sansuiso的想法的实现。@inuendo-是的,很有趣,我在发帖之前没有读过他们的答案,这让我笑了;)@fraxel,我在回答一个相关问题后才注意到你的答案:)在我的回答中,我建议如何处理具有相同值的像素(高原)。