目录
一、Harris角点检测
1.1 算法思想
角点原理来源于人对角点的感性判断,即图像在各个方向灰度有明显变化。算法的核心是利用局部窗口在图像上进行移动判断灰度发生较大的变化,所以此窗口用于计算图像的灰度变化。
根据下面三幅图可以清晰理解角点检测的过程:当一个窗口在图像上移动,如图(a),窗口在各个方向上都没有变化,则认为窗口区域为平滑区域。如图(b),窗口在某个方向上没有变化,另一个方向上有明显变化,那么,这块区域可能存在边缘。如图(c),窗口在各个方向上灰度发生了较大的变化,那么,这块区域可能存在角点。Harris角点检测正是利用了这个直观的物理现象,通过窗口在各个方向上的变化程度,决定是否为角点。
(1) (2) (3)
1.2 数学模型
根据算法思想,构建数学模型,计算移动窗口的的灰度差值。
角点响应函数R定义为:
其中 ,
R取决于M的特征值,对于角点|R|很大,平坦的区域|R|很小,边缘的R为负值
二、不同场景图片对实验实验影响
2.1 纹理平坦的图片
实验结果显示了四张图片,分别为harris响应函数,以及threshold为0.01、0.05和0.1检测出的角点图片。
2.1.1 正面
实验结果:
2.1.2 侧面
实验结果:
2.1.3旋转
2.1.4 尺度变化
近距离:
远距离:
2.1.5 分析
平坦区的R值为小数值,在远距离检测到的角点比较近距离的焦点要多,在相同阈值下侧面检测到的点比正面的点多
,旋转的图片也能够检测出相同区域的角点,变化并不是很大。
2.2 边缘多的图片
2.2.1 正面
实验结果:
2.2.2 侧面
实验结果:
2.2.3 旋转
实验结果:
2.2.4 尺度变化
近距离:
远距离:
2.2.5 分析
由角点响应函数R: 我们可以知道,阈值(k)越大,检测的响应越少,标记出来的点的数量越少,阈值小检测的点越多。由实验结果可以看到旋转对检测结果的影响并不大,正面检测到的点旋转之后还是能检测到相同的点;侧面检测到的点比较多,可能也有光线的一部分原因,范围很大;远距离下检测出的角点相比于近距离更多。
2.3 角点丰富的图片
2.3.1 正面
实验结果:
2.3.2 侧面
实验结果:
2.3.3 旋转
实验结果:
2.3.4 尺度变化
近距离:
远距离:
2.3.5 分析
R为大数值正数的时候检测为角点,纹理角点比较丰富的场景下,图片中的一个个的正方框,正面检测检测出很多的角点,但是在侧面的时候发现随着阈值的增加点比正面稍微少一点,旋转的图和正面比检测的点也有一些少,远景的范围比较大,一些在近景中以为是边缘的地方,在远景中也有可能检测为角点,所以远景的角点比较多。
三、实验代码
不同场景下的图片放到代码运行得到结果
# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import harris
"""
Example of detecting Harris corner points (Figure 2-1 in the book).
"""
# 读入图像
im = array(Image.open('C:/Users/asus/Pictures/window/Harris/Harris.jpg').convert('L'))
# 检测harris角点
harrisim = harris.compute_harris_response(im)
# Harris响应函数
harrisim1 = 255 - harrisim
figure()
gray() # 灰度
# 画出Harris响应图
subplot(141)
imshow(harrisim1)
print(harrisim1.shape)
axis('off')
axis('equal')
threshold = [0.01, 0.05, 0.1]
for i, thres in enumerate(threshold):
filtered_coords = harris.get_harris_points(harrisim, 6, thres)
subplot(1, 4, i+2)
imshow(im)
print(im.shape)
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
axis('off')
show()