计算机视觉-Harris特征点检测实验报告
实验二 Harris特征点检测实验
一、实验目的
- 掌握 Harris 角点检测算法的基本原理。
- 学会使用计算机程序实现 Harris 角点检测。
- 理解并对比角点检测结果与实际图像特征之间的关系。
- 分析 Harris 角点检测在实际图像处理中的应用和局限性。
二、实验内容和要求
1.实验内容:
- 选择一组图像作为实验对象,用于进行 Harris 角点检测。
- 使用 Python 和 OpenCV 实现 Harris 角点检测算法。
- 调整 Harris 算子的各参数(如角点响应函数的阈值、窗口大小等),比较不同参数下的检测效果。
- 可视化角点检测结果,通过图像中标记的角点位置进行验证和分析。
2.基本要求:
- 编写 Harris 角点检测程序,并能够对给定图像进行检测。
- 掌握 Harris 角点检测的参数调节方法,并能解释参数对检测结果的影响。
- 对比不同图像和不同参数设置下的检测效果,进行分析并撰写实验报告。
三、实验设备
实验设备主要有:计算机、OpenCV库
四、实验原理
使用一个滑动窗口在下面三幅图中滑动,可以得出以下结论:
左图表示一个平坦区域,在各方向移动,窗口内像素值均没有太大变化;
中图表示一个边缘特征(Edges),如果沿着水平方向移动(梯度方向),像素值会发生跳变;如果沿着边缘移动(平行于边缘) ,像素值不会发生变化;
右图表示一个角(Corners),不管你把它朝哪个方向移动,像素值都会发生很大变化。
算法的核心是利用局部窗口在图像上进行移动,判断灰度是否发生较大的变化。如果窗口内的灰度值(在梯度图上)都有较大的变化,那么这个窗口所在区域就存在角点。
这样就可以将 Harris 角点检测算法分为以下三步:
- 1.当窗口(局部区域)同时向 x (水平)和 y(垂直) 两个方向移动时,计算窗口内部的像素值变化量 E(x,y) ;
- 2.对于每个窗口,都计算其对应的一个角点响应函数 R;
- 3.然后对该函数进行阈值处理,如果 R>threshold,表示该窗口对应一个角点特征。
五、实验步骤
实验代码:
from PIL import Image
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("C:\\Users\\aslon\\Desktop\\louna.jpg")//图片路径
gray_img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# Initiate FAST object with default values
fast = cv2.FastFeatureDetector_create()
# find and draw the keypoints
kp = fast.detect(gray_img,None)
img2 = cv2.drawKeypoints(image, kp, None, color=(0,0,255))
# Print all default params
print( "Threshold: {}".format(fast.getThreshold()) )
print( "nonmaxSuppression:{}".format(fast.getNonmaxSuppression()) )
print( "neighborhood: {}".format(fast.getType()) )
print( "Total Keypoints with nonmaxSuppression: {}".format(len(kp)) )
# Disable nonmaxSuppression
fast.setNonmaxSuppression(0)
kp = fast.detect(gray_img,None)
print( "Total Keypoints without nonmaxSuppression: {}".format(len(kp)) )
img3 = cv2.drawKeypoints(image, kp, None, color=(0,0,255))
img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
plt.subplot(121), plt.imshow(img2), plt.title('fast_true'), plt.axis('off')
img3 = cv2.cvtColor(img3,cv2.COLOR_BGR2RGB)
plt.subplot(122), plt.imshow(img3), plt.title('fast_false'), plt.axis('off')
plt.show()
实验原图:
处理后图:
六、实验总结
不同图像的效果对比
1. 简单图像:
对于具有清晰边缘和明显角点的简单图像,如几何图形(如正方形、三角形等),Harris 角点检测通常能够准确地检测出角点。在这种情况下,检测到的角点数量相对较少,位置也比较明确,角点响应值较高。
图像中的噪声较少时,角点检测的准确性更高,不会将噪声误检测为角点。
2. 复杂图像:
对于自然场景图像或纹理复杂的图像,Harris 角点检测可能会检测到更多的角点,包括一些不太明显的角点和由于纹理变化引起的伪角点。
复杂图像中的噪声会对角点检测产生更大的影响,可能导致一些噪声点被检测为角点,降低检测的准确性。
不同参数设置的效果对比
1. 窗口大小:
较小的窗口尺寸适用于检测局部细节的角点,但对噪声更敏感。在图像中存在较多噪声时,可能会检测到很多伪角点。
较大的窗口尺寸可以平滑噪声,但可能会错过一些小尺度的角点,并且对图像的局部变化不敏感。
2. 阈值:
较高的阈值会减少检测到的角点数量,只保留响应值较高的明显角点。这可以提高检测的准确性,但可能会遗漏一些较弱的角点。
较低的阈值会增加检测到的角点数量,包括一些不太明显的角点和伪角点。这可以提高角点的覆盖率,但会降低检测的准确性。
3. 梯度计算方法:
使用不同的梯度计算方法(如 Sobel 算子、Prewitt 算子等)可能会对 Harris 角点检测的结果产生影响。不同的梯度计算方法在对边缘的敏感度和抗噪性方面有所不同。
综上所述,在使用 Harris 角点检测时,需要根据具体的图像特点和应用需求选择合适的参数设置,以获得最佳的检测效果。同时,对于不同的图像,可能需要进行多次试验和调整参数,以找到最适合的检测方法。