window大小对openCV中哈里斯角检测器的结果有什么影响

What affect does window size have on the results of the harris corner detector in openCV

我正在研究不同参数对使用 openCV 的 Harris 角检测器错误率的影响。输入参数是 window 大小、sobel 运算符的内核大小和 k 参数的值。我发现当我增加 window 大小时,每个角的响应数量似乎有所增加。例如,如果每个 window 包含一个角都用一个点标记,那么当我使用 7x7 window 而不是 2x2 window 时,在已识别的角周围似乎有更高密度的点.更改 window 大小似乎也会增加正确识别的角的数量。

我的编码如下,是从this例子中得到的

import cv2
import numpy as np

filename = 'resized_image.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

gray = np.float32(gray)
dst = cv2.cornerHarris(gray,7,3,0.015)

#result is dilated for marking the corners, not important
dst = cv2.dilate(dst,None)

# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.05*dst.max()]=[0,0,255]
cv2.imwrite('corners3.jpg', img )
cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

有人能解释一下增加 window 大小对哈里斯角检测器结果的影响吗?特别是为什么每个角的响应数量似乎随着 window 大小的增加而增加。据我了解,此函数计算 window 梯度并使用 sobel 运算符执行一些平滑(如果这对结果有任何影响)。对不起,如果这是一个明显的问题,但我只是计算机视觉的新手。

"responses per corner" 是什么意思?在 "true" 角位置附近的检测器响应中看到多个峰值簇是正常的。发生这种情况是因为响应函数对于自然图像来说一点也不平滑——毕竟它计算的是导数的乘积,这会放大原始图像中的任何 "random" 振荡。 Harris 过滤器所做的只是增强此函数不平滑的区域 "peaky",但峰值可以彼此靠近,即使您对图像的直觉告诉您它们不应该如此。

解决这个问题的一个明显的技术是计算 "smoothed derivatives"(即 Gx * I,而不是 Ix,其中 G 是一个小的高斯核,等等),但这有一些副作用"weak" 角落可能会变得平滑。

无论是否使用平滑导数,一种用于解决此问题并获得 "clean" 个角的预期数量 N 的简单算法是从响应 k * N 到 select最强的峰按降低的检测器响应强度排序(k,比如说,在 5 到 10 的范围内),然后:

  1. 选择列表中的下一个峰。
  2. 在其位置 (x, y) 处查找 Harris 检测器响应值 H(x,y)。
  3. 如果 H(x,y) > 0,则

    将其添加到输出清洁角列表中;

    将 (x, y) 的小 m x m 邻域中的所有 H 值设置为 0。

  4. 否则跳过这个高峰。
  5. 如果输出列表的大小小于 N 并且还有剩余的峰,则转到 1。

"cluster" 抑制邻域的宽度 m 应该表达您关于 "real" 角应该彼此相距多远的先验信息。此方法显然假设簇的 "best" 角是哈里斯滤波器响应最强的角。

顺便说一句,如果你喜欢名字(或谷歌搜索),这通常称为 "non-local-maxima suppression"。

BTW-2:有关查找 H 响应的所有局部最大值的详细信息,请参阅 this answer,然后按响应值等进行排序。