Skip to content

Latest commit

 

History

History
89 lines (67 loc) · 3.54 KB

File metadata and controls

89 lines (67 loc) · 3.54 KB

Harris算法

角点概念

  • 角点:在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。 从图像分析的角度来定义角点可以有以下两种定义: • 角点可以是两个边缘的交点; • 角点是邻域内具有两个主方向的特征点;

  • 角点计算方法: • 前者通过图像边缘计算,计算量大,图像局部变化会对结果产生较大的影 响; • 后者基于图像灰度的方法通过计算点的曲率及梯度来检测角点

Harris角点检测

  • 角点所具有的特征:
    • 轮廓之间的交点;
    • 对于同一场景,即使视角发生变化,通常具 备稳定性质的特征;
    • 该点附近区域的像素点无论在梯度方向上还 是其梯度幅值上有着较大变化;
  • 性能较好的角点:
    • 检测出图像中“真实”的角点
    • 准确的定位性能 • 很高的重复检测率
    • 噪声的鲁棒性 • 较高的计算效率

Harris实现过程

  • 计算图像在X和Y方向的梯度; image
  • 计算图像两个方向梯度的乘积; image
  • 使用高斯函数对三者进行高斯加权,生成矩阵M的A,B,C; image
  • 计算每个像素的Harris响应值R,并对小于某一阈值t的R置为零; • 在3×3或5×5的邻域内进行非最大值抑制,局部最大值点即为图像中的角点;

Open 中的函数 cv2.cornerHarris() 可以用来进 行角点检测。

参数如下:

  • img - 数据类型为 float32 的输入图像
  • blockSize - 角点检测中要考虑的领域大小
  • ksize - Sobel 求导中使用的窗口大小
  • k - Harris 角点检测方程中的自由参数,取值参数 为 [0,04,0.06]

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

img = cv2.imread('harris2.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst_block9_ksize19 = cv2.cornerHarris(gray, 9, 19, 0.04)
img1 = np.copy(img)
img1[dst_block9_ksize19 > 0.01 * dst_block9_ksize19.max()] = [0, 0, 255]

dst_block5_ksize19 = cv2.cornerHarris(gray, 5, 19, 0.04)
img2 = np.copy(img)
img2[dst_block5_ksize19 > 0.01 * dst_block5_ksize19.max()] = [0, 0, 255]

dst_block9_ksize5 = cv2.cornerHarris(gray, 9, 5, 0.04)
img3 = np.copy(img)
img3[dst_block9_ksize5 > 0.01 * dst_block9_ksize5.max()] = [0, 0, 255]

dst_block9_ksize31 = cv2.cornerHarris(gray, 9, 31, 0.04)
img4 = np.copy(img)
img4[dst_block9_ksize31 > 0.01 * dst_block9_ksize31.max()] = [0, 0, 255]

dst_block9_ksize19_k6 = cv2.cornerHarris(gray, 9, 19, 0.06)
img5 = np.copy(img)
img5[dst_block9_ksize19_k6 > 0.01 * dst_block9_ksize19_k6.max()] = [0, 0, 255]

dst_block9_ksize19_k6_1e_5 = cv2.cornerHarris(gray, 9, 19, 0.06)
img6 = np.copy(img)
img6[dst_block9_ksize19_k6_1e_5 > 0.00001 * dst_block9_ksize19_k6_1e_5.max()] = [0, 0, 255]

titles = ["Original", "block9_ksize19", "dst_block5_ksize19", "dst_block9_ksize5", "dst_block9_ksize31",
          "dst_block9_ksize19_k6", "dst_block9_ksize19_k6_1e_5"]
imgs = [img, img1, img2, img3, img4, img5, img6]
for i in range(len(titles)):
    plt.subplot(3, 3, i + 1), plt.imshow(imgs[i]), plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
# cv2.imshow('src',img)
# cv2.imshow('dst',img5)
# cv2.waitKey(0)
# cv2.destroyAllWindows()