欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Harris角点检测

程序员文章站 2023-12-25 17:57:27
...

1、基本原理

1.1 角点

• 局部窗口沿各方向移动,均产生明显变化的点
• 图像局部曲率突变的点
Harris角点检测

2.2 Harris角点

人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。
Harris角点检测

1.3 Harris角点检测步骤

Step1:计算图矩阵M;

Step2:对图像进行高斯滤波,得到新的M,高斯滤波窗口可选9×9;

Step3:用CRF=Det(M)-kTrace^2(M)计算原图像上各个点的CRF 值;

Step4:选取局部极值点;

Step5:设定阈值,CRF 值大于阈值的点作为最终选取的角点。

2、 进行Harris角点检测实验

2.1 实验代码

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

img = cv2.imread('pic4-1.jpg')
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()

2.2 重要函数解析

cv2.cornerHarris()
img - 数据类型为 float32 的输入图像
blockSize - 角点检测中要考虑的领域大小
ksize - Sobel 求导中使用的窗口大小
k - Harris 角点检测方程中的*参数

2.3 平坦条件下的实验结果

1)结果1-正面图
Harris角点检测
2)结果2-侧面图
Harris角点检测
3)结果3-旋转图
Harris角点检测
4)结果4-远近改变
Harris角点检测
5)结果5-明暗改变
Harris角点检测小结: 可以看出,在平坦条件下Harris角点检测有一定的优势,改变角度及旋转拍摄对其影响不大,ksize较大时,检测效果较差,其结果还受图片明暗程度的影响。

2.4 多边缘条件下的实验结果

1)结果1-正面图
Harris角点检测
2)结果2-侧面图
Harris角点检测
3)结果3-旋转图
Harris角点检测
4)结果4-远近改变
Harris角点检测
5)结果5-明暗改变
Harris角点检测
**小结:**可以看出,在多边缘条件下,Harris角点检测能较好地检测出多个水平及垂直,改变角度及旋转拍摄对其影响不大,ksize较大时,检测效果较差,其结果还受图片明暗程度的影响。

2.5 角点丰富下的实验结果

1)结果1-正面图
Harris角点检测
2)结果2-侧面图
Harris角点检测
3)结果3-旋转图
Harris角点检测
4)结果4-远近改变
Harris角点检测
5)结果5-明暗改变
Harris角点检测

**小结:**可以看出,在角点丰富条件下,Harris角点检测效果较差,特征点提取过多,其结果还受图片明暗程度的影响。

3、实验小结

1)Harris角点提取算法这种算子受信号处理中自相关面数的启发,给出与自相关函数相联系的矩阵M。M 阵的特征值是自相关函数的一阶曲率,如果两个曲率值都高,那么就认为该点是角点特征。
2)Harris角点检测有其优点:稳定性高,尤其对L型角点(也就是直角)检测精度高。其缺点也是明显的,对图片大小及图片的明暗程度敏感。

上一篇:

下一篇: