拐角检测中的非最大抑制

时间:2018-08-08 07:17:49

标签: python opencv

我正在用Python编写哈里斯拐角检测算法,并且为了检测拐角点,有能力执行非最大抑制。

我发现转角响应函数R在打印出来时似乎是准确的,但是我不知道从这里去哪里。我大致了解非最大抑制的概念,即,将窗口内具有最高强度的像素设置为拐点,将其余像素设置为0。尽管我不确定在实现方面该如何进行。

计算完后,我是否可以使用它创建的地图将原始图像中的那些像素设置为特定颜色(以指示哪些是角)?

到目前为止,我的代码如下:

import matplotlib.pyplot as plt
import numpy as np
import cv2

# Load image
img = cv2.imread('mountains.jpg')

# Make a copy of the image
img_copy = np.copy(img)

# Convert image from BGR to RGB
img_copy = cv2.cvtColor(img_copy, cv2.COLOR_BGR2RGB)

# Convert to grayscale for filtering
gray = cv2.cvtColor(img_copy, cv2.COLOR_RGB2GRAY)

# Copy grayscale and convert to float32 type
gray_1 = np.copy(gray)
gray_1 = np.float32(gray_1)
img_1 = np.copy(img)

# Compute derivatives in both x and y directions
sobelx = cv2.Sobel(gray_1, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(gray_1, cv2.CV_64F, 0, 1, ksize=5)

# Determine M = [A C ; C B] performing element-wise multiplication
A = np.square(sobelx)
B = np.square(sobely)
C = np.multiply(sobelx, sobely)

# Apply gaussian filter to matrix components
gauss = np.array([[1, 2, 1],
                  [2, 4, 2], 
                  [1, 2, 1]])/16

A_fil = cv2.filter2D(A, cv2.CV_64F, gauss)
B_fil = cv2.filter2D(B, cv2.CV_64F, gauss)
C_fil = cv2.filter2D(C, cv2.CV_64F, gauss)

# Calculate determinant
det = A_fil * B_fil - (C_fil ** 2)

# Calculate trace (alpha = 0.04 to 0.06)
alpha = 0.04
trace = alpha * (A_fil + B_fil) ** 2

# Using determinant and trace, calculate corner response function
R = det - trace

# Display corner response function
f, ax1 = plt.subplots(1, 1, figsize=(20,10))

ax1.set_title('Corner response fuction')
ax1.imshow(R, cmap="gray")

(注意:堆栈溢出图像无法正常工作)

输出:

Output

使用OpenCV的Harris角检测:

OpenCV

1 个答案:

答案 0 :(得分:1)

已经有一段时间了,所以您可能已经有了答案,但是由于没人回答,因此我将其留给后代。

这是一种简单的非最大值抑制算法:

  • 将您的图像划分为图块(例如64 x 48像素)
  • 选择最小的分隔空间(例如,要素之间> = 10像素)
  • 选择每个图块的最大要素数量(例如5)

将每个窗口图块中的要素按R(从最高到最低)排序,然后仅接受(最多)5个与其他要素相距至少10个像素的最大要素。您将不能保证窗砖之间的最小距离为10px,但这是一个合理的开始。