一、harris角点检测
此次实验的运行环境是pycharm,下面先简单介绍一下pycharm的下载安装以及简单的测试,先通过相关网站下载pycharm安装包,通过一步步的提示完成安装,安装完成后pycharm的相关破解参考网站(https://www.cnblogs.com/itfat/p/9388829.html),破解完成后打开首页,打开首页之后按照如下步骤建立新项目以及python文件:
之后可以建立一个python文件啦~~
完成之后写入要运行的代码,运行时发现还会出错,不要着急,还需要配置python环境,这个比较简单,在pycharm主页面右上角找到一下图标,点击进入,选择python,就可以选择相关的python啦~~
配置好python后通过如下路径可以添加你所需要的包~~
点击右上角就可以安装相关的包啦~~
到此就可以愉快的使用pycharm啦~~
好啦,现在来介绍harris的相关原理啦
1、角点检测的思想:
角点原理来源于人对角点的感性判断,即图像在各个方向灰度有明显变化。算法的核心是利用局部窗口在图像上进行移动判断灰度发生较大的变化,所以此窗口用于计算图像的灰度变化为:[-1,0,1;-1,0,1;-1,0,1][-1,-1,-1;0,0,0;1,1,1]。人各个方向上移动这个特征的小窗口,如图3中窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如图1中,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。
2、构建数学建模模型为,此处是参考别人啦,自己不会(理亏~~~~)
上图中W函数表示窗口函数,M矩阵为偏导数矩阵。对于矩阵可以进行对称矩阵的变化,假设利用两个特征值进行替代,其几何含义类似下图中的表达。在几何模型中通过判断两个特征值的大小,来判定像素的属性。
用python实现harris角点检测的主代码为:
import harris
from PIL import Image
from numpy import *
from pylab import *
from scipy.ndimage import filters
im = array(Image.open('2.jpg').convert('L'))
harrisim = harris.compute_harris_response(im)
filtered_coords = harris.get_harris_points(harrisim,6)
harris.plot_harris_points(im,filtered_coords)
其中相关的包需要读者自己添加,由于版本的不匹配安装包时也会遇到其他的问题,参考其他网站都会有解决办法,此处省略啦~~(偷懒!!)
运行上面代码可以得出结果为:
其中蓝色圈出的地方就是特征点。
computer_harris_response:在一幅灰度图像中,对每一个像素计算harris角点检测器响应函数。
get_harris_points:从一副harris响应图像中返回角点。
plot_harris_points:绘制图像中检测到的角点
在图像中寻找对应点代码如下:
from PIL import Image
from numpy import *
import harris_1
from pylab import *
wid=5
im1=array(Image.open('1.jpg').convert('L'))
im2=array(Image.open('2.jpg').convert('L'))
harrisim=harris_1.compute_harris_response(im1,5)
filtered_coords1=harris_1.get_harris_points(harrisim,0.2,wid+1)
d1=harris_1.get_descriptors(im1,filtered_coords1,wid)
harrisim=harris_1.compute_harris_response(im2,5)
filtered_coords2=harris_1.get_harris_points(harrisim,0.2,wid+1)
d2=harris_1.get_descriptors(im2,filtered_coords2,wid)
print ('starting matching')
matches=harris_1.match_twosided(d1,d2)
figure()
gray()
harris.plot_matches(im1,im2,filtered_coords1,filtered_coords2,matches)
show()
运行结果中出现错误,如下提示:
讲真是改了许久呢,但还是出现问题,由于时间问题不能耗在这里啦,不过后续还会补齐的,大家可以帮我看看噻~~
二、sift检测点和匹配原理
SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配,获得了良好效果。包括的内容有
根据准则,提取图像中的特征点; 提取特征点周围的图像块,构造特征描述符;通过特征描述符对比,实现特征匹配。
sift可以实现的内容有:
• 目标的旋转、缩放、平移
• 图像仿射/投影变换(视点• 弱光照影响(illumination)
• 部分目标遮挡(occlusion)
• 杂物场景(clutter)
• 噪声 SIFT算法可以解决的
实现步骤为:
SIFT算法实现特征匹配主要有三个流程:
1、提取关键点;
2、对关键点附加详细的信息(局部特征),即描述符;
3、通过特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点,建立景物间的对应关系。
尺度空间理论最早于1962年提出,其主要思想是通过
对原始图像进行尺度变换,获得图像多尺度下的空间表示。
从而实现边缘、角点检测和不同分辨率上的特征提取,以
满足特征点的尺度不变性。
关键点检测的相关概念:
1、根据文献《Scale-space theory: A basic tool for analysing structures at
different scales》可知,高斯核是唯一可以产生 多尺度空间的核,一个
图像的尺度空间,L(x, y, σ) ,定义为原始图像 I(x, y)与一个可变尺度的2
维高斯函数G(x, y, σ) 卷积运算。
2、高斯模糊
高斯模糊是在Adobe Photoshop等图像处理软件中广泛使用的处理
效果,通常用它来减小图像噪声以及降低细节层次。这种模糊技术生成
的图像的视觉效果是好像经过一个半透明的屏幕观察图像。
3、高斯金字塔
高斯金子塔的构建过程可分为两步:
(1)对图像做高斯平滑;
(2)对图像做降采样。
为了让尺度体现其连续性,在简单下采样的基础上加上了高斯滤波。一幅图像可以产几组(octave)图像,一组图像包括几层(interval)图像。
高斯图像金字塔共o组、s层,
则有:
σ——尺度空间坐标;
s——sub-level层坐标;
σ0——初始尺度;
S——每组层数(一般为3~5)
最后可将组内和组间尺度
归为:
i——金字塔组数
n——每一组的
4、关键点方向分配:
通过尺度不变性求极值点,可以使其具有缩放不变的性质。而利用关键点邻域像素的梯度方向分布特性,可以为每个关键点指定方向参数方向,从而使描述子对图像旋转具有不变性。像素点的梯度表示
确定关键点的方向采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点对关键点方向生成所作的贡献。
• 关键点主方向:极值点周围区域梯度直方图的主峰值也是特征点方向
• 关键点辅方向:在梯度方向直方图中,当存在另一个相当于主峰值80%能量的峰值时,则将这个方向认为是该关键点的辅方向。这可以增强匹配的鲁棒性,Lowe的论文指出大概有15%关键点具有多方向,但这些点对匹配的稳定性至为关键。
5、关键点描述:
下图是一个SIFT描述子事例。其中描述子由2×2×8维向量表征,也即是2×2个8方向的方向直方图组成。左图的种子点由8×8单元组成。每一个小格都代表了特征点邻域所在的尺度空间的一个像素,箭头方向代表了像素梯度方向,箭头长度代表该像素的幅值。然在4×4的窗口内计算8个方向的梯度方向直方图。绘制每个梯度方向的累加可形成一个种子点,如右图所示:一个特征点由4个种子点的信息所组成。
6、关键点匹配:
sift运行代码之前,需要下载vlfeat但是代码中不支持21版本的,需要下载20版本,可以参考(http://www.vlfeat.org/)
sift特征点提取的代码如下:
import sift
from PIL import Image
from numpy import *
imname = '1.jpg'
im1 = array(Image.open(imname).convert('L'))
sift.process_image(imname,'1.sift')
l1,d1 = sift.read_features_from_file('1.sift')
figure()
gary()
sift.plot_features(im1,l1,circle=True)
show()
运行结果为:
基本的函数在此省略,相关课本以及其他网站可以收集到,至于运行结果不要着急,由于本人照片出现问题,正在努力拯救中,莫慌,后面补齐哈~~
特征点匹配的相关代码为:
from PIL import Image
from pylab import *
from numpy import *
import sift
import os
im1f = '1.jpg'
im2f = '2.jpg'
im1 = array(Image.open(im1f))
im2 = array(Image.open(im2f))
sift.process_image(im1f, 'out_sift_1.txt')
l1,d1 = sift.read_features_from_file('out_sift_1.txt')
figure()
gray()
subplot(121)
sift.plot_features(im1, l1, circle=False)
process_image(im2f, 'out_sift_2.txt')
l2,d2 = sift.read_features_from_file('out_sift_2.txt')
subplot(122)
sift.plot_features(im2, l2, circle=False)
matches = sift.match_twosided(d1, d2)
print( '{} matches').format(len(matches.nonzero()[0]))
figure()
gray()
sift.plot_matches(im1,im2,l1,l2,matches, show_below=True)
show()
运行结果为:
此次实验中匹配只匹配到两个点,主要存在问题是照片的特征点不明显,而且像素太低,匹配时难以匹配到相似点。
其中相关函数的理解为:
match:是对于第一个图像中的每个描述子,选取其在第二张图片中的匹配。
match_twosided:是双向对称版本的match()。
process_image:处理一幅照片,然后将其保存在文件中。
read_features_from_file:读取特征属性值,然后将其以矩阵的形式返回。
write_feature_to_file:将特征位置和描述子保存在文件中
plot_features:显示带有特征的图像。
三、可视化连接图像:
首先通过图像间是否具有匹配的局部描述子来定义图像间的连接,然后可视化这些连接情况。为了完成可视化,可以在图中显示这些图像,图的边代表连接。这里使用pydot工具包,该工具包是功能强大的GraphViz图形库的Python接口。 安装时,需要先安装graphviz-2.38.msi,再运行命令pip install pydot,最后可在系统路径PATH中添加graphviz的路径:C:\Program Files (x86)\Graphviz2.38\bin。注意:pydot的Node节点添加图片时,图片的路径需要为绝对路径,且分隔符为/。
原文:https://blog.csdn.net/zhuxiaoyang2000/article/details/53930610