OpenCV的过滤图像 - 更换与当地最大的内核(openCV filter image - rep

2019-07-29 10:35发布

我的问题的一些细节:

我想实现的OpenCV角点检测(另一种算法,这是内置的:康力,哈里斯等)。

我有充满响应值的矩阵。 最大的响应值是 - 转角的最大概率检测出。

我有一个问题,即在一个点的附近有(但只能有一个)检测到几个小钱。 我需要减少检测假角落数。

确切的问题:

我需要通过矩阵与内核走路,每个计算内核的最大价值,离开最大值,但其他值在内核做出等于零。

是否有内置的OpenCV函数来做到这一点?

Answer 1:

这是我会怎么做:

  1. 创建一个内核,它定义了一个像素附近。
  2. 通过使用这个内核扩张你的图像创建一个新的形象。 此膨胀图像包含每个点的最大值附近的值。
  3. 做这两个阵列之间的相等比较。 只要它们是相等的是一个有效的附近最大,并且被设定为255的比较阵列英寸
  4. 乘以比较阵列中,和原来的阵列一起(缩放适当)。
  5. 这是你的最后一个数组,只含有邻最大值。

这是通过在这些图像放大所示:

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

固体区域是由于在共享局部最大值的值。



Answer 2:

我建议一个原始2步方法(有可能存在更有效的方法),使用内置函数的OpenCV:

  1. 第1步:用方形内核形态膨胀(相当于你的邻居)。 这一步给你另一个图像,由内核内的最高值替换每个像素值之后。

  2. 步骤2:如果测试原始响应图像的每个像素的cornerness值等于由扩张步骤中给出的最大值。 如果没有,那么显然存在在附近一个更好的角落。



Answer 3:

如果你正在寻找一些内置功能,FilterEngine会帮你做一个自定义过滤器(内核)。

http://docs.opencv.org/modules/imgproc/doc/filtering.html#filterengine

另外,我建议某种降噪,通常模糊,所有的处理之前。 也就是说,除非你真的想图像原始。



文章来源: openCV filter image - replace kernel with local maximum