Advertisement

Harris和sift角点检测以及图像特征点检测、sift特征原理描述

阅读量:

本次实验采用了PyCharm作为运行环境。随后将简要介绍PyCharm的下载与安装过程,并进行基本测试。通过官方网站获取PyCharm的安装包文件,并按照系统提示逐步完成安装流程。安装完成后,请访问以下链接获取破解版本的相关参考文档:https://www.cnblogs.com/itfat/p/9388829.html。破解完成后,请访问PyCharm的主界面并启动程序。请确保所有破解步骤已完成后再进行下一步操作:建立新项目并配置相关Python文件路径设置

之后可以建立一个python文件啦~~

编写完成后需将代码保存到运行的位置,在PyCharm主界面右上方的位置上有相应的图标标识;程序启动后遇到错误提示,请耐心检查是否有误操作;还需设置相应的开发环境参数;这相对而言较为简单;无需担心;在PyCharm主界面右上方的位置上有相应的图标标识;单击进入设置界面;然后从选项中选择Python工具包安装即可

配置好python后通过如下路径可以添加你所需要的包~~

通过右上角的加号就可以查找并安装相关的包啦~~

点击右上角就可以安装相关的包啦~~

至此,读者可以轻松上手并愉快地使用PyCharm.

在图中,W函数代表窗口函数,M矩阵是梯度算子作用后的结果。针对该矩阵,我们可以对其进行对称变换,假设我们选择两个特征值来进行比较,其几何意义与下图所示相似。在几何模型中,通过比较两个特征值的大小来确定像素属性的核心代码部分。

复制代码
    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算法主要包含三个核心流程:

  1. 获取关键点;
  2. 对这些关键点补充详细特征信息(局部特征),即生成描述符;
  3. 通过对比带有特征向量的关键点对来找出相互匹配的特征对,并建立景物间的对应关系。
    尺度空间理论最初于1962年首次提出,在这一理论中:
    通过对原始图像实施尺度变换以获得多尺度的空间表示,并在此基础上实现边缘检测、角点识别以及不同分辨率下的特征提取功能;
    从而确保关键点检测在不同尺度下的不变性特性得以实现。
    关键点检测的相关概念如下
    根据文献《Scale-space theory: A fundamental tool for analyzing structures at different scales》可知:高斯函数是唯一能够生成多尺度空间的滤波核函数;图像的空间表示L(x, y, σ)定义为原始图像I(x, y)与可变尺度参数σ的二维高斯函数G(x, y, σ)进行卷积运算的结果。
在这里插入图片描述

2、高斯模糊
高斯模糊是一种在Adobe Photoshop等软件中被广泛应用的技术,
主要用于减少噪声并提升整体锐度。
该技术通过特定算法生成具有自然过渡效果的画面,
仿佛将原始图片置于一种半透膜般的观察环境中。
3、高斯金字塔
构建高斯金字塔的过程分为两个关键步骤:
首先,
执行一次高斯平滑操作以去除高频细节;
其次,
进行降采样处理以获取不同分辨率的信息。
为了保证尺度上的连续性,
在简单的降采样基础上叠加了必要的平滑滤波操作。
通过构建多级分辨率图层结构,
则能够获得o组s层的不同细节表达。

σ表示尺度空间坐标;
s代表sub-level层坐标;
σ₀代表初始尺度;
S表示每组层数(通常在3至5之间)。
最后可以将组内的和组间的尺度整合起来:

i——金字塔组数
n——每一组的

4、关键点方向分配:
基于尺度不变性求取极值点可使其具备缩放无关特性。通过分析关键点邻域内像素梯度方向分布特征可为每个关键点设定其对应的方向参数进而使描述子对图像旋转具有抗变性能素值表示

通过梯度直方图统计法确定关键点的方向,在一定区域内计算像素对特定方向贡献大小。
主要由极值点附近区域梯度直方图的最大峰值决定。
当在梯度方向直方图中出现第二个与主峰值能量相当(约80%)以上的峰值时,则认为该峰为主峰辅助方向。
这有助于提高匹配算法的稳定性;此外,在SIFT算法中提到约15%的关键特征可能具有多个主要方向。
如图所示,
其中描述子由2×2×8维向量表征,
左图中的种子块由8×8的小块构成;
每个小格代表尺度空间中的一个像素,
箭头指向像素梯度的主要朝向,
箭头长度表示幅值大小;
在4×4窗口内计算并累加八个主要梯度的方向,
形成一个种子块,
右图为实例展示:
一个特征块则包含四个这样的种子信息。

6、关键点匹配:

在运行SIFT代码之前,必须下载VLFeat库.但代码不支持VLFeat库的21.x版本,应下载对应的20.x版本.具体信息可参考链接: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()

运行结果为:

在本次实验中仅定位出两张图片上的两个关键点这对结果影响较大主要原因在于照片的整体亮度较低导致特征点不够突出此外图片的整体分辨率较低使得计算出的像素坐标精度受到影响影响了后续的配准效果

原文:<>

全部评论 (0)

还没有任何评论哟~