目录
一:Harris角点检测器
1.1角点的解释
1.2Harris角点检测基本思想
1.3harris检测:数学表达
1.4代码部分
二:SIFT
2.1.SIFT介绍
2.2 SIFT算法实现步骤简述
2.3 关键点检测
2.4 关键点检测——DOG
2.5关键点方向分配
2.6关键点匹配
2.7代码部分
一:Harris角点检测器
1.1角点的解释
角点是一阶导数(即灰度的梯度)的局部最大所对应的像素点;也是两条及两条以上边缘的交点。角点指示了物体边缘变化不连续的方向,角点处的一阶导数最大,二阶导数为0。角点是指图像中梯度值和梯度方向的变化速率都很高的点。下图为不同类型的角点:
1.2Harris角点检测基本思想
角点定义 <- 窗口向任意方向的移动都导致图像灰度的明 显变化
从图像局部的小窗口观察图像特征:
1.3harris检测:数学表达
将图像窗口平移[u,v]产生灰度变化E(u,v)
有泰勒公式展开可得:(Ix,Iy 分别为偏导数,在图像中为图像的方向导数)
I(x+u,y+v)=I(x,y)+Ix∗u+Iy∗v+O(u^2,v^2)
E(u,v)=sum[w(x,y)[Ix∗u+Iy∗v+O(u^2,v^2)]^2]
可以近似得到:E(u,v)=sum[w(x,y)[Ix∗u+Iy∗v]^2]
即
令
因此最后对角点的检测成了对矩阵M的特征值的分析了,令M其特征值为x1,x2
当x1>>x2或者x2>>x1,则检测到的是边缘部分
当x1,x2都很小,图像窗口在所有移动的方向上移动灰度级都无明显变化.
当X1,X2都很大时且相当,检测到的是角点
1.4代码部分
from PIL import Image
from numpy import *
from pylab import *
from scipy.ndimage import filters
def compute_harris_response(im, sigma=3):
#计算x方向的导数
imx = zeros(im.shape) #zeros()生成全零数组
filters.gaussian_filter(im, (sigma,sigma),(0,1),imx)
#计算x方向的导数
imy = zeros(im.shape) #zeros()生成全零数组
filters.gaussian_filter(im, (sigma,sigma),(0,1),imy)
#计算harris矩阵的分量
Wxx = filters.gaussian_filter(imx*imx,sigma)
Wxy = filters.gaussian_filter(imx*imy,sigma)
Wyy = filters.gaussian_filter(imy*imy,sigma)
#计算特征值和迹
Wdet = Wxx*Wyy - Wxy*2
Wtr = Wxx + Wyy
return Wdet / Wtr
#获取角点
def get_harris_points(harrism, min_dist=10, threshold=0.1):
"""从一幅Harris响应图像中返回角点。min_dist为分割角点和图像边界的最少像素数目"""
#寻找高于阈值的候选角点
corner_threshold = harrism.max()*threshold
harrisim_t = (harrisim > corner_threshold) * 1
#得到候选点的坐标
coords = array(harrisim_t.nonzero()).T
#以及它们的Harris响应值
candidate_values = [harrism[c[0],c[1]] for c in coords]
#对侯选点按照Harris响应值进行排序
index = argsort(candidate_values)
#将可行点的位置保存到数组中
allowed_locations = zeros(harrism.shape)
allowed_locations[min_dist:-min_dist,min_dist:-min_dist]=1
#按照min_distance 原则,选择最佳Harris点
filtered_coords = []
for i in index:
if allowed_locations[coords[i,0],coords[i,1]] == 1:
filtered_coords.append(coords[i])
allowed_locations[(coords[i,0]-min_dist):(coords[i,0]+min_dist),(coords[i,1]-min_dist):(coords[i,1] + min_dist)] = 0
return filtered_coords
def plot_harris_points(image, filtered_coords):
"""绘制图像中检测到的角点"""
figure()
gray()
imshow(image)
plot([p[1] for p in filtered_coords],[p[0] for p in filtered_coords], '*')
axis('off')
show()
if __name__ == "__main__":
im = array(Image.open("D:\图片\tu\1.jpg").convert("L"))
imshow(im)
harrisim = compute_harris_response(im)
filtered_coords = get_harris_points(harrisim,6)
plot_harris_points(im, filtered_coords)
二:SIFT
2.1.SIFT介绍
SIFT又称为尺度不变特征变换,是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。
SIFT算法可以解决的问题:
1.目标的旋转、缩放、平移 2.图像仿射/投影变换 3.弱光照影响
4.部分目标遮挡 5.杂物场景 6.噪声
2.2 SIFT算法实现步骤简述
SIFT算法实现特征匹配主要有三个流程,1、提取关键点;2、对关键点附加 详细的信息(局部特征),即描述符;3、通过特征点(附带上特征向量的关 键点)的两两比较找出相互匹配的若干对特征点,建立景物间的对应关系。
2.3 关键点检测
1. SIFT中要查找的关键点一般为角点、边缘点、暗区域的亮点以及亮区域的暗点。假定两幅图像中 有相同的景物,那么使用某种算法分别提取各自的特征点,这些点之间会有 相互对应的匹配关系
2.尺度空间主要思想是通过对原 始图像进行尺度变换,获得图像多尺度下的空间表示。从而实 现边缘、角点检测和不同分辨率上的特征提取,以满足特征点 的尺度不变性。尺度空间中各尺度图像的模 糊程度逐渐变大,能够模拟人在 距离目标由近到远时目标在视网 膜上的形成过程。 尺度越大图像越模糊。
3. 高斯模糊:高斯模糊是在Adobe Photoshop等图像处理软件中广泛使用的处理 效果,通常用它来减小图像噪声以及降低细节层次。这种模糊技术生成 的图像的视觉效果是好像经过一个半透明的屏幕观察图像。
2.4 关键点检测——DOG
DoG(Difference of Gaussian)函数:
DoG高斯差分金字塔:对应DOG算子,需构建DOG金字塔
可以通过高斯差分图像 看出图像上的像素值变 化情况。(如果没有变 化,也就没有特征。特 征必须是变化尽可能多 的点。)DOG图像描 绘的是目标的轮廓。
DoG的局部极值点:特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点, 每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域 的相邻点大或者小。中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个 点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。
2.5关键点方向分配
通过尺度不变性求极值点,可以使其具有缩放不变的性质。而利用关 键点邻域像素的梯度方向分布特性,可以为每个关键点指定方向参数方向, 从而使描述子对图像旋转具有不变性。
像素点的梯度表示:
方向直方图的生成:确定关键点的方向采用梯度直方图统计法, 统计以关键点为原点,一定区域内的图像像 素点对关键点方向生成所作的贡献。
关键点的主方向与辅方向:
关键点主方向:极值点周围区域梯度直方图的主峰值也是特征点方向
关键点辅方向:在梯度方向直方图中,当存在另一个相当于主峰值 80%能量的峰值时,则将这个方向认为是该关键点的辅方向。
这可以增强匹配的鲁棒性,Lowe的论文指出大概有15%关键点具有 多方向,但这些点对匹配的稳定性至为关键
2.6关键点匹配
分别对模板图(参考图,reference image)和实时图(观测图, observation image)建立关键点描述子集合。目标的识别是通过两点 集内关键点描述子的比对来完成。具有128维的关键点描述子的相似 性度量采用欧式距离。
关键点的匹配可以采用穷举法来完成,但是这样耗费的时间太 多,一般都采用kd树的数据结构来完成搜索。搜索的内容是以 目标图像的关键点为基准,搜索与目标图像的特征点最邻近的 原图像特征点和次邻近的原图像特征点。



