文章目录
一.局部图像描述子
1.Harris角点检测
角点特征:
1.轮廓之间的交点。
2.对于同一场景,即使视角发生变化,通常具备稳定性质的特征。
3.该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化。
4.角点处的一阶导数最大,二阶导数为0。
5.角点指示了物体边缘变化不连续的方向。
1.1 Harris 角点检测算子:
Harris 算子是一种简单的点特征提取算子,这种算子受信号处理中自相关函数的启发,给出与自相关函数相联系的矩阵M。M阵的特征值是自相关函数的一阶曲率,如果两个曲率值都高,那么就认为该点是特征点。为了消除噪声对于角点检测的影响,可以使用一个高斯滤波器来平滑图像。
1.2 Harris 角点检测算法原理:
利用矩形窗在图像上移动,若窗内包含有角点,则窗口向各个方向移动时,窗内的灰度值都会发生变化。从而达到检测图像角点的目的。如果像素周围显示存在多于一个方向的边,我们认为该点为兴趣点。该点就称为角点。
1.3 Harris 角点检测基本思想:
1.4 Harris 角点检测数学表达:
2.编码及实例测试
2.1 源码:
# -*- 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('D:\\xjx\pictures\jmu1.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')
#原书采用的PCV中PCV harris模块
#harris.plot_harris_points(im, filtered_coords)
# plot only 200 strongest
# harris.plot_harris_points(im, filtered_coords[:200])
show()
2.2 图组实例测试:
图组1:角点丰富图
原图(其中一角度):
1.
3.
4.
5.
结论:
角点大多取得在轮廓边缘区域,颜色较亮或很深的地方无角点,光线,角度在此组影响也不太明显(可能光线整体过暗影响测试)。
图组2:边缘丰富
原图(其一):
1.
2.
3.
4.
5.
结论:
当图片的线条越多,在线条的交叉点容易产生角点,交点越多,角点越多,并且重复、粘连在一起。目标图像角度,明暗不同时,角点的选择略有不同,多数选择图片颜色较深的地方;远近不同时,细节更明显,因此角点的数量更多。
图组3:纹理平坦
原图1:
1.
2.
3.
4.
5.
结论:在纹理比较平坦的图片中,几乎取不到角点,若光线角度变化,在边缘突出或阴影处可取得角点,但是这些改变影响不大,角点数量依旧较少。
3.总结论
角点检测算子对光线亮度等变化更敏感,角度变化对结果影响不大,旋转对结果无影响,具有旋转不变性;在目标图像远近不同时,角点及其数量会有变化,由此推论Harris角点检测算子不具有尺度不变性。
纹理平坦图像变化都很微小。