openCV过滤器图像 - 用本地最大值替换内核

Lar*_*bar 4 c++ opencv image-processing max filter

关于我的问题的一些细节:

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

我有一个填充响应值的矩阵.最大的响应值是 - 检测到角点的最大概率是.

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

确切的问题:

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

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

fra*_*xel 15

我就是这样做的:

  1. 创建一个内核,它定义了一个像素邻域.
  2. 通过使用此内核扩展图像来创建新图像.该扩张图像包含每个点的最大邻域值.
  3. 在这两个数组之间进行相等比较.它们相等的任何地方都是有效的邻域最大值,并255在比较数组中设置.
  4. 将比较数组与原始数组相乘(适当缩放).
  5. 这是您的最终数组,仅包含邻域最大值.

这些放大图像说明了这一点:

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内核处理后:

在此输入图像描述

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