Harris角点检测
文章目录
1、基本原理
1.1 角点
• 局部窗口沿各方向移动,均产生明显变化的点
• 图像局部曲率突变的点
2.2 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-正面图
2)结果2-侧面图
3)结果3-旋转图
4)结果4-远近改变
5)结果5-明暗改变
小结: 可以看出,在平坦条件下Harris角点检测有一定的优势,改变角度及旋转拍摄对其影响不大,ksize较大时,检测效果较差,其结果还受图片明暗程度的影响。
2.4 多边缘条件下的实验结果
1)结果1-正面图
2)结果2-侧面图
3)结果3-旋转图
4)结果4-远近改变
5)结果5-明暗改变
**小结:**可以看出,在多边缘条件下,Harris角点检测能较好地检测出多个水平及垂直,改变角度及旋转拍摄对其影响不大,ksize较大时,检测效果较差,其结果还受图片明暗程度的影响。
2.5 角点丰富下的实验结果
1)结果1-正面图
2)结果2-侧面图
3)结果3-旋转图
4)结果4-远近改变
5)结果5-明暗改变
**小结:**可以看出,在角点丰富条件下,Harris角点检测效果较差,特征点提取过多,其结果还受图片明暗程度的影响。
3、实验小结
1)Harris角点提取算法这种算子受信号处理中自相关面数的启发,给出与自相关函数相联系的矩阵M。M 阵的特征值是自相关函数的一阶曲率,如果两个曲率值都高,那么就认为该点是角点特征。
2)Harris角点检测有其优点:稳定性高,尤其对L型角点(也就是直角)检测精度高。其缺点也是明显的,对图片大小及图片的明暗程度敏感。