python计算机视觉编程(三)——Harris角点 SIFT 匹配地理标记图像

本文介绍了Python中使用VLFeat计算SIFT特征和Harris角点的方法,以及如何利用它们匹配地理标记图像。通过高斯金字塔、DoG极值点检测和关键点定位等步骤解释了SIFT算法的原理,展示了SIFT在特征匹配上的优势,但指出其运行时间较长。此外,还提到了pydot工具包用于可视化相关流程。
摘要由CSDN通过智能技术生成

准备

使用的到一些函数在文末给出

VLFeat

使用开源工具包VLFeat提供的二进制文件来计算图像的SIFT特征
链接: http://www.vlfeat.org/建议下载20以前的版本,最新版本产生的SIFT特征文本为空
将bin目录下对应的系统文件夹复制出来
在这里插入图片描述
之后将process_image函数中路径改成相应的位置
在这里插入图片描述

pydot工具包

用pydot可以直接可视化他们直接的关联
1.安装graphviz

pip install graphviz

2.安装graphviz软件,地址在:https://graphviz.gitlab.io/_pages/Download/Download_windows.html

3.把安装后的graphviz软件的bin目录设为环境变量,重启。

4.安装pydot

pip install pydot

由于sift速度较慢,建议把图片压缩后使用!!!

Harris角点

原理

角点检测最原始的想法就是取某个像素的一个邻域窗口,当这个窗口在各个方向上进行小范围移动时,观察窗口内平均的像素灰度值的变化(即,E(u,v))。
在这里插入图片描述
从上图可知,我们可以将一幅图像大致分为三个区域(‘flat’,‘edge’,‘corner’),这三个区域变化是不一样的。

在这里插入图片描述
将函数二维泰勒展开
在这里插入图片描述
于是对于局部微小的移动量 [u,v], 可以近似得到下面的表达:
在这里插入图片描述
其中M是 22 矩阵, 可由图像的导数求得:
在这里插入图片描述
窗口移动导致的图像变化量: 实对称矩阵M的特征值分析
在这里插入图片描述
记M的特征值为 λ 1, λ 2
在这里插入图片描述
定义: 角点响应函数R
在这里插入图片描述
在这里插入图片描述
角点计算流程:
对角点响应函数R进行阈值处理:
R > threshold
提取R的局部极大值

代码实现

Harris角点检测

from pylab import *
from PIL import Image
from scipy.ndimage import filters
from sift import *

# 读入图像
im = array(Image.open('123.jpg').convert('L'))

# 检测harris角点
harrisim = compute_harris_response(im)
filtered_coords = get_harris_points(harrisim,6)

plot_harris_points(im, filtered_coords)

在这里插入图片描述
Harris角点匹配

from pylab import *
from PIL import Image
from pylab import *
from numpy import *
from scipy.ndimage import filters
from sift import *


im1 = array(Image.open("123.jpg").convert("L"))
im2 = array(Image.open("456.jpg").convert("L"))

# resize加快匹配速度
im1 = imresize(im1, (int(im1.shape[1]/2), int(im1.shape[0]/2)))
im2 = imresize(im2, (int(im2.shape[1]/2), int(im2.shape[0]/2)))

wid = 5
harrisim = compute_harris_response(im1, 5)
filtered_coords1 = get_harris_points(harrisim, wid+1)
d1 = get_descriptors(im1, filtered_coords1, wid)

harrisim = compute_harris_response(im2, 5)
filtered_coords2 = get_harris_points(harrisim, wid+1)
d2 = get_descriptors(im2, filtered_coords2, wid)

print ('starting matching')
matches = match_twosided(d1, d2)

figure()
gray() 
plot_matches(im1, im2, filtered_coords1, filtered_coords2, matches)
show()

在这里插入图片描述
可以看出特征点的匹配比较混乱,下文将介绍SIFT,它的效果非常不错,缺点就是比较耗时。

SIFT

原理

SIFT算法实现特征匹配主要有三个流程, 1、 提取关键点; 2、 对关键点附加
详细的信息( 局部特征) , 即描述符; 3、 通过特征点( 附带上特征向量的关
键点) 的两两比较找出相互匹配的若干对特征点, 建立景物间的对应关系。
1.高斯模糊
高斯模糊是在Adobe Photoshop等图像处理软件中广泛使用的处理
效果, 通常用它来减小图像噪声以及降低细节层次。 这种模糊技术生成
的图像的视觉效果是好像经过一个半透明的屏幕观察图像。
二维高斯函数
高斯卷积核是实现尺度变换的唯一变换核,并且是唯一的线性核。高斯模糊是一种图像滤波器,它使用正态分布(高斯函数)计算模糊模板,并使用该模板与原图像做卷积运算,达到模糊图像的目的。
在这里插入图片描述
2.尺度空间
尺度空间理论最早于1962年提出, 其主要思想是通过对原始图像进行尺度变换, 获得图像多尺度下的空间表示。从而实现边缘、 角点检测和不同分辨率上的特征提取, 以满足特征点的尺度不变性。尺度空间中各尺度图像的模糊程度逐渐变大, 能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。尺度越大图像越模糊。
2.1高斯金字塔
高斯金子塔的构建过程可分为两步:
( 1) 对图像做高斯平滑;
( 2) 对图像做降采样。
为了让尺度体现其连续性, 在简单下采样的基础上加上了高斯滤波。一幅图像可以产生几组( octave)图像, 一组图像包括几层( interval) 图像。
在这里插入图片描述
高斯图像金字塔共o组、 s层,则有:
在这里插入图片描述
σ——尺度空间坐标;
s——sub-level层坐标;
σ0——初始尺度;
S——每组层数( 一般为3~5)
最后可将组内和组间尺度归为:
在这里插入图片描述
i——金字塔组数
n——每一组的层数
2.2DOG
使用高斯金字塔每组中相邻上下两层图像相减,得到高斯差分图像,进行极值检测。
在这里插入图片描述
在这里插入图片描述
可以通过高斯差分图像看出图像上的像素值变化情况。 ( 如果没有变化, 也就没有特征。 特征必须是变化尽可能多的点。 )DOG图像描绘的是目标的轮廓。
2.3DoG的局部极值点
特征点是由DOG空间的局部极值点组成的。 为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较, 看其是否比它的图像域和尺度域的相邻点大或者小。中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9× 2个点共26个点比较, 以确保在尺度空间和二维图像空间都检测到极值点。
在这里插入图片描述
3关键点定位
3.1去除边缘响应
由于DoG函数在图像边缘有较强的边缘响应, 因此需要排除边缘响应。DoG函数的峰值点在边缘方向有较大的主曲率, 而在垂直边缘的方向有较小的主曲率。主曲率可以通过计算在该点位置尺度的2×2的Hessian矩阵得到, 导数由采样点相邻差来估计:
在这里插入图片描述
Dxx 表示DOG金字塔中某一尺度的图像x方向求导两次
D的主曲率和H的特征值成正比。 令 α , β为特征值, 则
在这里插入图片描述
该值在两特征值相等时达最小。 Lowe论文中建议阈值T为1.2, 即在这里插入图片描述时保留关键点, 反之剔除
4方向分配
通过尺度不变性求极值点, 可以使其具有缩放不变的性质。 而利
用关键点邻域像素的梯度方向分布特性, 可以为每个关键点指定方向参数
方向, 从而使描述子对图像旋转具有不变性。
像素点的梯度表示:在这里插入图片描述

梯度幅值:在这里插入图片描述
梯度方向:在这里插入图片描述
通过求每个极值点的梯度来为极值点赋予方向。
方向直方图的生成
确定关键点的方向采用梯度直方图统计法, 统计以关键点为原点, 一定区域内的图像像素点对关键点方向生成所作的贡献。
关键点主方向: 极值点周围区域梯度直方图的主峰值也是特征点方向。
关键点辅方向: 在梯度方向直方图中, 当存在另一个相当于主峰值80%能量的峰值时, 则将这个方向认为是该关键点的辅方向。
这可以增强匹配的鲁棒性, Lowe的论文指出大概有15%关键点具有
多方向, 但这些点对匹配的稳定性至为关键。
5关键点特征描述
下图是一个SIFT描述子事例。 其中描述子由2× 2× 8维向量表征, 也即是2× 2个8方向的方向直方图组成。 左图的种子点由8× 8单元组成。 每一个小格都代表了特征点邻域所在的尺度空间的一个像素, 箭头方向代表了像素梯度方向, 箭头长度代表该像素的幅值。 然后在4×4的窗口内计算8个方向的梯度方向直方图。 绘制每个梯度方向的累加可形成一个种子点, 如右图所示: 一个特征点由4个种子点的信息所组成。在这里插入图片描述
6关键点匹配
分别对模板图( 参考图, reference image) 和实时图( 观测图,observation image) 建立关键点描述子集合。 目标的识别是通过两点集内关键点描述子的比对来完成。 具有128维的关键点描述子的相似性度量采用欧式距离。
在这里插入图片描述
穷举匹配
在这里插入图片描述
模板图中关键点描述子:
在这里插入图片描述
实时图中关键点描述子:
在这里插入图片描述
任意两描述子相似性度量:在这里插入图片描述
要得到配对的关键点描述子需满足:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值