sift算法的MATLAB程序

合集下载

尺度不变特征变换 SIFT算法 Matlab程序代码

尺度不变特征变换 SIFT算法 Matlab程序代码

尺度不变特征变换SIFT算法Matlab程序代码尺度不变特征变换(SIFT算法)Matlab程序代码测试例子的说明(Lowe的代码)2010-06-01 21:26目前网络上可以找到的关于SIFT算法Matlab测试代码的资源就是:1加拿大University of British Columbia大学计算机科学系教授David G.Lowe发表于2004年Int Journal of Computer Vision,2(60):91-110的那篇标题为"Distivtive Image Features from Scale-Invariant Keypoints"的论文。

作者在其学术网站上发表的Matlab程序代码(注意,这个程序代码的初始版本是D.Alvaro and J.J.Guerrero,来自Universidad de Zaragoza。

)2美国加州大学洛杉矶分校(University of California at Los Angeles)Andrea Vedaldi博士研究生给出的基于David Lowe发表的论文给利用Matlab和C语言混合编程给出的Sift detector and descriptor的实现过程。

Andrea Vedaldi Ph.D.Candidate/VisionLab/UCLAAndreaVedaldi(vedaldi@)Boelter Hall 3811(Vision Lab-map)University of California,LA(UCLA)(formerly University of Padova DII-map)News 4/10/2008-Minor tweaks to the MATLAB/SIFT code to eliminate dependencies on LAPACK(easier to compile)25/1/2008-VLFeat new version and website.1/11/2007-VicinalBoost code is now available.Bio.Andrea Vedaldi was born in Verona,Italy,in 1979.He received the DIng from the University of Padova,Italy,in 2003 and the MSc in Computer Science(CS)from the University of California,Los Angles(UCLA)in 2005.He is the recepient of the UCLA 2005 outstanding master in CS award and he is currently enrolled in the UCLA Ph.D program.Popular code VisionLab Features Library:SIFT,MSER andmore(beta).Collaborators Stefano Soatto,University of California at Los Angeles,Los Angeles,USA.Serge Belongie,University of Californiaat San Diego,San Diego,USA.Paolo Favaro,Heriot-WattUniversity,Riccarton,Edi nburgh,UK.Hailin Jin,Adobe System Incorporated,California,USA.Andrew Rabinowich,University ofCalifornia at San Diego,San Diego,USA.Gregorio Guidi,University of California at Los Angeles,Los Angeles,USA.Brian Fulkerson,Universityof California at Los Angeles,Los Angeles,USA.3以后陆续有许多基于Sift 算法实现图像目标匹配和目标识别等方面的应用,大多都是基于上述的代码和算法原理来进行的。

Matlab中的图像配准算法解析

Matlab中的图像配准算法解析

Matlab中的图像配准算法解析图像配准是计算机视觉和图像处理领域中一项重要的任务,它可以将多幅图像进行对齐,使它们在几何和视觉上更加一致。

在Matlab中,有多种图像配准算法可以使用,包括基于特征匹配的方法、基于区域的方法以及基于相位相关的方法。

本文将对这些算法进行解析,并探讨它们的原理和应用。

一、基于特征匹配的图像配准算法1.1 SIFT算法尺度不变特征转换(Scale-Invariant Feature Transform,SIFT)是一种常用的特征提取算法,它通过检测图像中的稳定特征点,并计算这些特征点的描述子来实现图像匹配。

在Matlab中,可以使用vl_feat工具包实现SIFT算法。

1.2 SURF算法加速稳健特征(Speeded-Up Robust Features,SURF)是一种基于尺度空间的特征提取算法,它可以在不同尺度下检测图像中的稳定特征点,并计算这些特征点的描述子。

在Matlab中,可以使用图像拼接工具箱中的SURF函数实现SURF算法。

二、基于区域的图像配准算法2.1 形态学图像配准形态学图像配准是一种基于区域的图像配准算法,它通过对图像进行分割和形态学变换,在不同尺度下提取图像的结构信息,并将其对齐。

在Matlab中,可以使用图像处理工具箱中的形态学变换函数实现形态学图像配准。

2.2 相关性图像配准相关性图像配准是一种基于相似度测量的图像配准算法,它通过计算图像之间的相似性来实现图像对齐。

在Matlab中,可以使用imregister函数实现相关性图像配准。

三、基于相位相关的图像配准算法相位相关图像配准是一种基于相位信息的图像配准算法,它通过计算图像频率域中的相位相关性来实现图像对齐。

在Matlab中,可以使用图像处理工具箱中的相位相关函数实现相位相关图像配准。

四、图像配准算法的应用图像配准在很多领域都有广泛的应用,例如医学影像配准、遥感图像配准和计算机视觉中的对象追踪等。

matlab的sift算法

matlab的sift算法

SIFT(Scale-Invariant Feature Transform)算法是一种用于图像处理中的特征检测方法,由David Lowe在1999年提出。

MATLAB中并没有内置的SIFT算法,但是你可以使用OpenCV库中的SIFT实现,具体步骤如下:1. 首先你需要安装OpenCV库。

如果你已经安装好了OpenCV,那么在MATLAB中引入OpenCV库应该没有问题。

你可以在MATLAB中使用以下命令检查是否已经安装好了OpenCV:```matlabver(cv)```如果没有安装,你可以参考OpenCV官网提供的安装教程进行安装。

2. 在引入OpenCV库之后,你就可以使用SIFT算法了。

以下是一个简单的例子:```matlab读取图像img = cv.imread('your_image.jpg');转换为灰度图gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY);创建SIFT对象sift = cv.SIFT_create();检测SIFT特征点,并计算描述子keypoints = cv.detectAndCompute(gray, cv.noArray(), sift);在原图上标出关键点img_with_keypoints = cv.drawKeypoints(img, keypoints, cv.DrawFlags('all'));显示图像cv.imshow('image', img_with_keypoints);cv.waitKey(0);cv.destroyAllWindows();```这个例子首先读取了一张图像并将其转换为灰度图。

然后创建了一个SIFT对象,使用这个对象来检测图像中的SIFT特征点,并计算出描述子。

最后在原图上标出了关键点并显示出来。

请注意这里的`'your_image.jpg'` 需要替换为你实际的图像路径和文件名。

sift算法matlab复杂代码

sift算法matlab复杂代码

一、介绍SIFT算法SIFT(Scale-Invariant Feature Transform)算法是一种用于图像处理和计算机视觉领域的特征提取算法,由David Lowe在1999年提出。

SIFT算法具有旋转、尺度、光照等方面的不变性,能够对图像进行稳健的特征点提取,被广泛应用于物体识别、图像匹配、图像拼接、三维重建等领域。

二、SIFT算法原理SIFT算法的主要原理包括尺度空间极值点检测、关键点定位、关键点方向确定、关键点描述等步骤。

其中,尺度空间极值点检测通过高斯差分金字塔来检测图像中的极值点,关键点定位则利用DoG响应函数进行关键点细化,关键点方向确定和关键点描述部分则通过梯度方向直方图和关键点周围区域的梯度幅度信息来完成。

三、使用Matlab实现SIFT算法在Matlab中实现SIFT算法,需要对SIFT算法的每个步骤进行详细的编程和调试。

需要编写代码进行图像的高斯金字塔和高斯差分金字塔的构建,计算尺度空间极值点,并进行关键点定位。

需要实现关键点的方向确定和描述子生成的算法。

将所有步骤整合在一起,完成SIFT算法的整体实现。

四、SIFT算法复杂代码的编写SIFT算法涉及到的步骤较多,需要编写复杂的代码来实现。

在编写SIFT算法的Matlab代码时,需要考虑到算法的高效性、可扩展性和稳定性。

具体来说,需要注意以下几点:1. 高斯差分金字塔和高斯金字塔的构建:在构建高斯差分金字塔时,需要编写代码实现图像的高斯滤波和图像的降采样操作,以得到不同尺度空间的图像。

还需要实现高斯差分金字塔的构建,以检测图像中的极值点。

2. 尺度空间极值点检测:在检测图像中的极值点时,需要编写代码实现对高斯差分金字塔的极值点检测算法,以找到图像中的潜在关键点。

3. 关键点的定位:关键点定位阶段需要编写代码实现对尺度空间极值点的精确定位,消除低对比度点和边缘响应点,并进行关键点的精细化操作。

4. 关键点的方向确定和描述子生成:在这一步骤中,需要编写代码实现对关键点周围区域的梯度幅度信息的计算和关键点方向的确定,以及生成关键点的描述子。

sift 特征点检测matlab函数

sift 特征点检测matlab函数

sift 特征点检测matlab函数SIFT特征点检测MATLAB函数引言:SIFT(Scale-Invariant Feature Transform)是一种常用的图像特征点检测算法,它具有尺度不变性和旋转不变性等优点,在计算机视觉和图像处理领域得到广泛应用。

本文将介绍SIFT特征点检测的MATLAB函数及其使用方法。

一、什么是SIFT特征点检测?SIFT特征点检测是一种基于局部特征的图像处理方法,它通过在图像中检测出具有稳定尺度和旋转不变性的关键点,从而实现图像的特征匹配、目标识别等应用。

SIFT算法主要包括关键点检测和特征描述两个步骤。

二、SIFT特征点检测的MATLAB函数在MATLAB中,我们可以使用vlfeat工具箱提供的函数来实现SIFT 特征点的检测。

具体来说,vl_sift函数可以用于检测图像中的SIFT特征点,并计算出每个特征点的主要特征描述子。

三、vl_sift函数的使用方法1. 函数调用格式[f, d] = vl_sift(I)其中,I为待检测的图像,返回值f为检测到的特征点的位置和尺度信息,d为特征点的主要描述子。

2. 示例代码下面是一个简单的示例代码,展示了如何使用vl_sift函数进行SIFT特征点检测。

```matlabI = imread('image.jpg'); % 读取图像I = single(rgb2gray(I)); % 转为灰度图像[f, d] = vl_sift(I); % SIFT特征点检测imshow(I); % 显示原图像hold on;vl_plotframe(f); % 显示特征点hold off;```通过上述代码,我们可以将图像中的SIFT特征点检测出来,并在原图像上用红色圆圈标出。

四、SIFT特征点检测的应用SIFT特征点检测在计算机视觉和图像处理领域有着广泛的应用。

以下是一些常见的应用场景:1. 特征匹配:通过比较两幅图像的SIFT特征点,可以进行图像的特征匹配,用于图像拼接、目标跟踪等任务。

sift matlab 代码

sift matlab 代码

sift matlab 代码Sift Matlab 代码Sift算法(Scale-invariant feature transform)是一种用于图像处理和计算机视觉中的特征提取算法。

Matlab是一种常用的编程语言和软件工具,用于实现各种算法和程序。

本文将介绍如何使用Matlab 编写Sift算法的代码,并对其原理和实现进行详细说明。

一、Sift算法原理Sift算法是一种基于局部特征的图像匹配算法,其主要思想是在图像中寻找关键点(keypoints),并对这些关键点进行描述,以便在不同图像之间进行匹配。

Sift算法具有尺度不变性和旋转不变性,能够稳定地提取图像的特征。

Sift算法的主要步骤包括尺度空间极值检测、关键点定位、关键点描述和关键点匹配等。

在尺度空间极值检测中,算法会在图像的不同尺度下检测局部极值点,这些点被认为是关键点的候选。

然后,通过对这些候选点进行精确定位和剔除不稳定点,最终得到真正的关键点。

接着,算法会对每个关键点周围的图像区域进行描述,生成描述子向量。

最后,通过比较不同图像的关键点描述子,实现图像匹配。

二、Matlab实现Sift算法在Matlab中实现Sift算法,可以使用现成的开源库或者自己编写代码。

一种常见的做法是使用vlfeat工具包,该工具包提供了Sift算法的Matlab接口,并包含了各种图像处理和特征提取的函数。

需要安装vlfeat工具包,并将其添加到Matlab的路径中。

然后,可以使用vl_sift函数来提取图像的Sift特征。

该函数会返回关键点的位置、尺度、方向以及描述子等信息,可以根据需要进行进一步处理和分析。

除了使用vlfeat工具包,也可以根据Sift算法的原理,编写自己的Sift代码。

在Matlab中,可以通过图像梯度计算、高斯金字塔构建和关键点描述等步骤,实现Sift算法的各个功能模块。

三、总结本文介绍了Sift算法的原理和在Matlab中的实现方法。

matlab sift角点提取

matlab sift角点提取

标题:MATLAB中的SIFT角点提取一、介绍SIFT角点提取SIFT(Scale-Invariant Feature Transform)是一种用于计算图像局部特征的算法,它能够在不同尺度和旋转下保持稳定性,并且对于光照变化具有一定的鲁棒性。

SIFT角点提取算法是计算机视觉领域中十分重要的一部分,能够对图像中的关键点进行稳健提取,因此在图像配准、目标检测和三维重建等领域有着广泛的应用。

二、MATLAB中的SIFT角点提取函数在MATLAB中,可以通过vlfeat工具箱来实现SIFT角点提取。

vlfeat 是一个视觉库,其中包括了SIFT、SURF等经典的图像特征提取算法。

具体来说,vlfeat中提供的函数vl_sift可以用于在MATLAB环境下实现SIFT特征提取。

通过调用vl_sift函数,在图像中提取出关键点的坐标、尺度和方向信息,并计算出各个关键点的描述子。

三、MATLAB中如何进行SIFT角点提取1. 准备图像数据在使用MATLAB进行SIFT角点提取之前,首先需要准备好图像数据。

可以使用imread函数读取图像,将其转换为灰度图像或彩色图像均可。

2. 加载vlfeat库通过MATLAB的addpath函数将vlfeat库添加到MATLAB的工作路径中,以便调用其中的函数。

3. 调用vl_sift函数使用vl_sift函数可以对图像进行SIFT角点提取,其调用方式如下:[f, d] = vl_sift(I)其中I为输入的图像,f为提取出的特征点信息,d为各个特征点的描述子。

4. 可视化可以通过vl_plotframe函数将提取出的关键点在图像上进行可视化显示,以便于观察提取结果。

四、SIFT角点提取的应用示例SIFT角点提取在图像配准中有着广泛的应用,下面以图像配准为例进行说明。

1. 加载图像加载两幅待配准的图像,通常我们会选择一幅作为基准图像,另一幅作为待配准图像。

2. SIFT角点提取对两幅图像分别调用vl_sift函数,提取出它们的SIFT特征点。

sift的matlab实现

sift的matlab实现

sift的matlab实现SIFT(Scale-Invariant Feature Transform)是一种用于图像特征提取的算法,它可以在不同尺度和旋转角度下提取出稳定的特征点。

在计算机视觉领域中,SIFT算法被广泛应用于图像匹配、目标跟踪、三维重建等方面。

本文将介绍SIFT算法的Matlab实现。

SIFT算法的Matlab实现主要分为以下几个步骤:1.图像预处理首先,需要将图像转换为灰度图像,并对其进行高斯模糊处理。

这一步的目的是为了降低图像噪声的影响,同时也可以使得后续的特征点检测更加准确。

2.特征点检测SIFT算法的核心是特征点检测,它可以在不同尺度和旋转角度下提取出稳定的特征点。

在Matlab中,可以使用vl_sift函数来实现特征点检测。

该函数会返回一个包含特征点位置、尺度、方向等信息的矩阵。

3.特征点描述在特征点检测之后,需要对每个特征点进行描述。

在SIFT算法中,使用了一种称为SIFT描述子的方法来描述特征点。

SIFT描述子是一个128维的向量,它可以描述特征点周围的梯度信息。

在Matlab中,可以使用vl_siftdescriptor函数来计算每个特征点的SIFT描述子。

4.特征点匹配特征点匹配是SIFT算法的最后一步,它可以将两幅图像中的特征点进行匹配。

在Matlab中,可以使用vl_ubcmatch函数来实现特征点匹配。

该函数会返回一个包含匹配点对的矩阵。

总结:SIFT算法是一种用于图像特征提取的算法,它可以在不同尺度和旋转角度下提取出稳定的特征点。

在Matlab中,可以使用vl_sift函数来实现特征点检测,使用vl_siftdescriptor函数来计算每个特征点的SIFT描述子,使用vl_ubcmatch函数来实现特征点匹配。

SIFT算法的Matlab实现可以应用于图像匹配、目标跟踪、三维重建等方面。

matlab sift角点提取

matlab sift角点提取

matlab sift角点提取【实用版】目录1.MATLAB SIFT 角点提取简介2.SIFT 算法原理3.MATLAB 中实现 SIFT 角点提取的步骤4.SIFT 角点提取在计算机视觉中的应用正文【1.MATLAB SIFT 角点提取简介】MATLAB SIFT 角点提取是一种在计算机视觉中用于特征点检测和描述子的方法。

SIFT 算法,全称“尺度不变特征变换”,是一种局部特征描述子,具有尺度、旋转、亮度不变性。

在 MATLAB 中,可以通过内置函数实现 SIFT 角点提取,以便在图像匹配、识别等任务中使用。

【2.SIFT 算法原理】SIFT 算法的原理是在不同尺度和旋转下,对图像中的局部区域进行处理,生成具有唯一性的特征描述子。

SIFT 算法主要包括以下几个步骤:1) 在图像中选择尺度空间中具有代表性的尺度。

2) 对每个尺度下的图像进行旋转,得到一系列旋转图像。

3) 在每个旋转图像上,计算梯度幅值和方向。

4) 将梯度幅值和方向组合成特征描述子。

【3.MATLAB 中实现 SIFT 角点提取的步骤】在 MATLAB 中实现 SIFT 角点提取,可以按照以下步骤进行:1) 读取图像,将图像转换为灰度图像。

2) 选择感兴趣区域,提取关键点。

3) 对关键点进行 SIFT 计算,得到特征描述子。

4) 使用 MATLAB 的匹配函数,对图像中的特征点进行匹配,找到匹配的特征点对。

【4.SIFT 角点提取在计算机视觉中的应用】SIFT 角点提取在计算机视觉领域具有广泛的应用,例如:1) 图像匹配:通过比较两张图像中的特征点匹配程度,判断两张图像是否来自同一场景。

2) 目标识别:利用目标物体的局部特征,识别图像中的目标物体。

3) 目标跟踪:在视频序列中,利用 SIFT 特征点匹配,实现对目标物体的跟踪。

MATLAB中常见的图像识别算法介绍

MATLAB中常见的图像识别算法介绍

MATLAB中常见的图像识别算法介绍图像识别是指利用计算机视觉技术对图像进行分析和处理,从中提取出有用的信息。

MATLAB作为一种强大的计算软件,提供了丰富的图像处理和分析工具,能够支持各种常见的图像识别算法。

在本文中,我们将介绍几种常用的图像识别算法,并探讨其原理和应用。

一、图像特征提取算法图像识别的第一步是提取图像特征,即从图像中提取出能够代表图像内容的信息。

常用的图像特征提取算法包括SIFT(Scale-Invariant Feature Transform)、SURF(Speeded-Up Robust Features)和HOG(Histogram of Oriented Gradients)等。

SIFT算法通过检测图像中的关键点,并计算这些关键点的描述子,从而表示图像的局部特征。

SURF算法是对SIFT算法的一种改进,它具有更快的运算速度和更好的鲁棒性。

HOG算法则通过统计图像中不同方向上的梯度信息来描述图像的纹理特征。

这些图像特征提取算法在图像识别任务中广泛应用,例如人脸识别、物体检测等。

它们的主要优势在于对图像的旋转、尺度和光照变化具有较好的不变性。

二、图像分类算法在提取了图像特征之后,接下来就是将提取到的特征应用于图像分类任务。

常用的图像分类算法有支持向量机(SVM)、K最近邻(KNN)和深度学习等。

支持向量机是一种经典的机器学习算法,在图像分类中有着广泛的应用。

它通过寻找一个最优的超平面来将不同类别的样本分开。

支持向量机具有较好的泛化能力,能够处理高维特征,对于非线性问题也能够通过核技巧进行处理。

K最近邻算法则是一种简单而有效的分类方法。

它基于样本的邻近性,将测试样本分类为最近邻居中的多数类别。

KNN算法的优势在于对于训练数据没有假设,但存在计算复杂度高和决策边界不平滑等问题。

深度学习是近年来兴起的一种机器学习方法,通过神经网络模型对图像进行表征学习和分类。

深度学习在图像识别领域取得了重大突破,其中卷积神经网络(CNN)是其重要的代表。

matlab sift特征提取代码

matlab sift特征提取代码

一、介绍SIFT特征提取算法SIFT(Scale-Invariant Feature Transform)是一种用于图像处理和计算机视觉领域的特征提取算法,由David Lowe在1999年提出。

SIFT算法能够在不同尺度、旋转和光照条件下检测和描述图像中的关键特征点。

二、SIFT特征提取的原理1. 尺度空间极值检测SIFT算法首先通过高斯滤波器构建图像的尺度空间金字塔,在不同尺度上检测图像中的极值点,用于定位关键特征点。

2. 关键点定位在尺度空间金字塔上定位极值点,并通过尺度空间的拟合插值定位关键点的位置和尺度。

3. 方向确定对关键点周围的梯度方向进行统计,选择主要梯度方向作为关键点的方向。

4. 关键点描述基于关键点周围的梯度幅值和方向构建特征向量,用于描述关键点的外观特征。

三、MATLAB实现SIFT特征提取代码MATLAB提供了丰富的图像处理工具包,其中也包括对SIFT算法的支持。

下面给出MATLAB实现SIFT特征提取的简单示例代码:```matlab读入图像I = imread('image.jpg');I = single(rgb2gray(I));提取SIFT特征点[f, d] = vl_sift(I);显示特征点imshow(I);h1 = vl_plotframe(f);h2 = vl_plotsiftdescriptor(d, f);set(h1,'color','k','linewidth',3);set(h2,'color','g');```上述代码中,首先使用`imread`读入一张图像,并将其转化为灰度图像。

然后使用`vl_sift`函数提取图像中的SIFT特征点,其中`f`为特征点的位置和尺度,`d`为特征点的描述子。

最后使用`vl_plotframe`和`vl_plotsiftdescriptor`函数将特征点和特征描述子可视化出来。

SIFT算法MATLAB

SIFT算法MATLAB

function [ SIFTFeatureVector, locationX, locationY ] = DenseSIFT( image, nPatchSize, nGridSp acing )image = double( image );image = mean( image, 3 );image = image / max( image( : ) );% parametersnAngleNums = 8;nBinNums = 4;nSampleNums = nBinNums * nBinNums;alpha = 9; %% parameter for attenuation of angles (must be odd)if nargin < 5sigmaGuassian = 1;endangleStep = 2 * pi / nAngleNums;angles = 0 : angleStep : 2 * pi;angles( nAngleNums + 1 ) = [ ]; % bin centers[ nRow nCol ] = size( image );[ gaussianX, gaussianY ] = genDeltaGaussian( sigmaGuassian );imageVerticalEdges = filter2( gaussianX, image, 'same' ); % vertical edges imageHorizontalEdges = filter2( gaussianY, image, 'same' ); % horizontal edges imageGradientMagnitude = sqrt( imageVerticalEdges.^2 + imageHorizontalEdges.^2 ); % gradient magnitudeimageTheta = atan2( imageHorizontalEdges, imageVerticalEdges );imageTheta( isnan( imageTheta ) ) = 0; % replace illegal result with 0% descriptor locationslocationX = nPatchSize / 2 : nGridSpacing : nCol - nPatchSize / 2 + 1;locationY = nPatchSize / 2 : nGridSpacing : nRow - nPatchSize / 2 + 1;% make orientation imagesimageOrientation = zeros( [ nRow, nCol, nAngleNums ], 'single' );% for each histogram angleimageCos = cos( imageTheta );imageSin = sin( imageTheta );for index = 1 : nAngleNums% compute each orientation channeltmp = ( imageCos * cos( angles( index ) ) + imageSin * sin( angles( index ) ) ).^ alpha; tmp = tmp .* ( tmp > 0 );% weight by magnitudeimageOrientation( :, :, index ) = tmp .* imageGradientMagnitude;end% Convolution formulation:nHalfPatchSize = nPatchSize / 2;nHalfPatchSizeMinusDotFive = nHalfPatchSize - 0.5;sampleResolution = nPatchSize / nBinNums;weightX = abs( ( 1 : nPatchSize ) - nHalfPatchSizeMinusDotFive ) / sampleResolution; weightX = ( 1 - weightX ) .* ( weightX <= 1 );for index = 1 : nAngleNumsimageOrientation( :, :, index ) = conv2( weightX, weightX', imageOrientation( :, :, inde x ), 'same' );end% Sample SIFT bins at valid locations (without boundary artifacts)% find coordinates of sample points (bin centers)[ samplePosX, samplePosY ] = meshgrid( linspace( 1, nPatchSize + 1, nBinNums + 1 ) ); samplePosX = samplePosX( 1 : nBinNums, 1 : nBinNums ); samplePosX = samplePosX( : ) - nPatch Size / 2;samplePosY = samplePosY( 1 : nBinNums, 1 : nBinNums ); samplePosY = samplePosY( : ) - nPatch Size / 2;SIFTFeatureVector = zeros( [ length( locationY ) length( locationX ) nAngleNums * nSampleNum s ] , 'single' );nOffset = 0;for n = 1 : nBinNums * nBinNumsSIFTFeatureVector( :, :, nOffset + 1 : nOffset + nAngleNums ) = imageOrientation( locati onY + samplePosY(n), locationX + samplePosX(n), : );nOffset = nOffset + nAngleNums;endclear imageOrientation% Outputs:[ locationX, locationY ] = meshgrid( locationX, locationY );[ nrows, ncols, cols ] = size( SIFTFeatureVector );% normalize SIFT descriptorsSIFTFeatureVector = reshape( SIFTFeatureVector, [nrows * ncols nAngleNums * nSampleNums ] );SIFTFeatureVector = SIFTNormalization( SIFTFeatureVector );SIFTFeatureVector = reshape( SIFTFeatureVector, [ nrows ncols nAngleNums * nSampleNums] ); function [ GX, GY ] = genDeltaGaussian( sigma )% laplacian of size sigmaG = genGaussian(sigma);[ GX, GY ] = gradient( G );GX = GX * 2 ./ sum( sum( abs( GX ) ) );GY = GY * 2 ./ sum( sum( abs( GY ) ) );function G = genGaussian( sigma )if all( size( sigma ) == [ 1, 1 ] )% isotropic gaussianfilterWindow = 4 * ceil( sigma ) + 1;G = fspecial( 'gaussian', filterWindow, sigma );else% anisotropic gaussianfilterWindowX = 2 * ceil( sigma( 1 ) ) + 1;filterWindowY = 2 * ceil( sigma( 2 ) ) + 1;GaussianX = normpdf( -filterWindowX: filterWindowX, 0, sigma( 1 ) );GaussianY = normpdf( -filterWindowY: filterWindowY, 0, sigma( 2 ) );G = GaussianY' * GaussianX;endfunction SIFTFeatureVector = SIFTNormalization( SIFTFeatureVector )% normalize SIFT descriptors (after Lowe)% find indices of descriptors to be normalized (those whose norm is larger than 1)tmp = sqrt( sum( SIFTFeatureVector.^2, 2 ) );normalizeIndex = find( tmp > 1 );SiftFeatureVectorNormed = SIFTFeatureVector( normalizeIndex, : );SiftFeatureVectorNormed = SiftFeatureVectorNormed ./ repmat( tmp( normalizeIndex, : ), [ 1 s ize( SIFTFeatureVector, 2 ) ] );% suppress large gradientsSiftFeatureVectorNormed( SiftFeatureVectorNormed > 0.2 ) = 0.2;% finally, renormalize to unit lengthtmp = sqrt( sum( SiftFeatureVectorNormed.^2, 2 ) );SiftFeatureVectorNormed = SiftFeatureVectorNormed ./ repmat( tmp, [ 1 size( SIFTFeatureVecto r, 2 ) ] );SIFTFeatureVector( normalizeIndex, : ) = SiftFeatureVectorNormed;$$$$$$$$$$$$$$$$$$$$$$$$$$$1.clc; clear all; close all;2.img = imread('c:\\ce.jpg');3.if ndims(img) == 34.img1 = rgb2gray(img);5.else6.img1 = img;7.end8.img1 = medfilt2(img1, [4, 4]);9.bw = im2bw(img1, graythresh(img1));10.bw = imclose(bw,strel('disk', 3));11.bw = bwareaopen(bw, 500);12.bw = imclearborder(bw);13.bw = imclose(bw,strel('disk', 5));14.L = bwlabel(bw);15.stats = regionprops(L,'all');16.imshow(bw);17.hold on;18.corn1 = stats(1).Extrema;19.t1 = 2 : 2 : size(corn1, 1)20.plot(corn1(t1, 1), corn1(t1, 2), 'r.', 'MarkerSize', 20);21.corn2 = stats(2).Extrema;22.t2 = 1 : 2 : size(corn2, 1)23.plot(corn2(t2, 1), corn2(t2, 2), 'r.', 'MarkerSize', 20);24.figure;25.imshow(img); hold on;26.plot(corn1(t1, 1), corn1(t1, 2), 'r.', 'MarkerSize', 20);27.plot(corn2(t2, 1), corn2(t2, 2), 'r.', 'MarkerSize', 20);28.plot(corn1(t1, 1), corn1(t1, 2), 'go', 'MarkerSize', 8);29.plot(corn2(t2, 1), corn2(t2, 2), 'go', 'MarkerSize', 8);。

基于SIFT特征的图像配准(Matlab源代码)

基于SIFT特征的图像配准(Matlab源代码)

基于SIFT特征的图像配准(附Matlab源代码)本文先给出了采用SIFT方法进行图像配准的实验原图以及实验结果,最后附上Matlab 源代码。

实验一:实验一的图像(见图1.1)是本人自己拍摄的,然后由软件裁剪成400×400像素而成,其中参考图像和待配准图像之间有重叠部分,且具有一定的旋转。

这是一般难度的图像配准。

(图1.1 参考图像(左图)和待配准图像(右图))经过筛选后的能作为配准控制点的SIFT匹配特征点对见下图1.2所示。

(图1.2 经过筛选后的能作为配准控制点的SIFT匹配特征点对)配准后的图像见下图1.3所示。

(1.3 配准后的图像)实验二:实验二的图像(见图2.1)是本人自己在同一地点不同角度拍摄的,然后由软件裁剪成600×450像素而成,其中参考图像和待配准图像之间有重叠部分,且具有一定的旋转。

这是具有一定难度的图像配准。

(图2.1 参考图像(左图)和待配准图像(右图))经过筛选后的能作为配准控制点的SIFT匹配特征点对见下图2.2所示。

(图2.2 经过筛选后的能作为配准控制点的SIFT匹配特征点对)配准后的图像见下图1.3所示。

(2.3 配准后的图像)实验三:实验三的图像(见图3.1)是两幅SAR图像,大小为400×400像素,其中参考图像和待配准图像之间有重叠部分,且具有一定的旋转。

这是具有难度的图像配准。

(图3.1 参考图像(左图)和待配准图像(右图))经过筛选后的能作为配准控制点的SIFT匹配特征点对见下图3.2所示。

(图3.2 经过筛选后的能作为配准控制点的SIFT匹配特征点对)配准后的图像见下图3.3所示。

(3.3 配准后的图像)要自行下载,下载链接为/s/1pJL4SB5,需要*.m格式的源代码的,到/download/destiny0321/9204877进行下载。

Zoo_main.mclose all;clear all;clc;im1=imread('image data\image3_1.jpg'); im2=imread('image data\image3_2.jpg');gray1=zoo_x2gray(im1);gray2=zoo_x2gray(im2);[des1,loc1]=zoo_sift(gray1);[des2,loc2]=zoo_sift(gray2);figure;zoo_drawPoints(im1,loc1,im2,loc2);Num=3;Thresh=0.85;match=zoo_BidirectionalMatch(des1,des2,Num ,Thresh);clear des1des2loc1=loc1(match(:,1),:);loc2=loc2(match(:,2),:);figure;zoo_linePoints(im1,loc1,im2,loc2);agl=zoo_getRotAgl(loc1,loc2);figure;zoo_drawRotAglHist(agl);opt=zoo_optIndex(agl);loc1=loc1(opt,:);loc2=loc2(opt,:);figure;zoo_linePoints(im1,loc1,im2,loc2);T=zoo_getTransMat(gray1,loc1,gray2,loc2); im=zoo_imRegist(im1,im2,T);figure,imshow(im);zoo_x2gray.mfunction gray=zoo_x2gray(im)if length(size(im))==3gray=rgb2gray(im);elsegray=im;endgray=uint8(medfilt2(double(gray)));zoo_sift.mfunction [des,loc]=zoo_sift(im)[row,col]=size(im);f=fopen('tmp.pgm','w');if f==-1error('Could not create file tmp.pgm.'); endfprintf(f, 'P5\n%d\n%d\n255\n', col, row); fwrite(f,im','uint8');fclose(f);if isunixcommand = '!./sift ';elsecommand = '!siftWin32 ';endcommand = [command ' <tmp.pgm >tmp.key']; eval(command);g=fopen('tmp.key','r');if g==-1error('Could not open file tmp.key.');end[header,cnt]=fscanf(g,'%d %d',[1 2]);if cnt~=2error('Invalid keypoint file beginning.'); endnum=header(1);len=header(2);if len~=128error('Keypoint descriptor length invalid (should be 128).');endloc=double(zeros(num,4));des=double(zeros(num,128));for k=1:num[vector,cnt]=fscanf(g, '%f %f %f %f', [1 4]);if cnt~=4error('Invalid keypoint file format');endloc(k,:)=vector(1,:);[descrip, count] = fscanf(g, '%d', [1 len]);if (count ~= 128)error('Invalid keypoint file value.');enddescrip = descrip / sqrt(sum(descrip.^2));des(k, :) = descrip(1, :);endfclose(g);for k=1:size(des,1)des(k,:)=des(k,:)/sum(des(k,:));enddelete tmp.key tmp.pgmzoo_drawPoints.mfunction zoo_drawPoints(im1,loc1,im2,loc2)im=zoo_appendingImages(im1,im2);imshow(im);hold onset(gcf,'Color','w');plot(loc1(:,2),loc1(:,1),'r*',loc2(:,2)+size(im1,2),l oc2(:,1),'b*');hold offzoo_BidirectionalMatch.mfunctionmatch=zoo_BidirectionalMatch(des1,des2,Num ,Thresh)X=sum(des1.^2,2);Y=sum(des2.^2,2);XY=des1*des2';zoo_BidirectionalMatchcorr=XY./sqrt(X*Y');[corr1,ix1]=sort(corr,2,'descend');corr1=corr1(:,1:Num);ix1=ix1(:,1:Num);[row1,col1]=find(corr1>Thresh);match12=zeros(length(row1),2);match12(:,1)=row1;match12(:,2)=ix1(size(corr1,1)*(col1-1)+row1); clear corr1ix1row1col1[corr2,ix2]=sort(corr,1,'descend');corr2=corr2(1:Num,:);ix2=ix2(1:Num,:);[row2,col2]=find(corr2>Thresh);match21=zeros(length(col2),2);match21(:,1)=ix2(Num*(col2-1)+row2);match21(:,2)=col2;clear corr2ix2row2col2m1=match12(:,1)*10000+match12(:,2);m2=match21(:,1)*10000+match21(:,2);clear match12match=[];for k=1:length(m1)re=m1(k)-m2;idx=find(re==0);if ~isempty(idx)match=[match;match21(idx,:)];endend zoo_linePoints.mfunction zoo_linePoints(im1,loc1,im2,loc2)im=zoo_appendingImages(im1,im2);imshow(im);hold onset(gcf,'Color','w');plot(loc1(:,2),loc1(:,1),'r*',loc2(:,2)+size(im1,2),l oc2(:,1),'b*');for k=1:size(loc1,1)text(loc1(k,2)-10,loc1(k,1),num2str(k),'Color','y',' FontSize',12);text(loc2(k,2)+size(im1,2)+5,loc2(k,1),num2str( k),'Color','y','FontSize',12);line([loc1(k,2) loc2(k,2)+size(im1,2)],...[loc1(k,1) loc2(k,1)],'Color','g');endhold offzoo_getRotAgl.mfunction agl=zoo_getRotAgl(loc1,loc2)ori1=loc1(:,4);ori2=loc2(:,4);agl=ori2-ori1;agl=agl*180/pi;zoo_drawRotAglHist.mfunction zoo_drawRotAglHist(agl)agl=agl(agl>-180);agl=agl(agl<180);hist(agl,180);hold onset(gcf,'Color','w');xlabel('Rotated Angle(¡ã)');ylabel('Number of Feature Point');hold offzoo_getTransMat.mfunctionT=zoo_getTransMat(gray1,loc1,gray2,loc2) gray1=double(gray1);gray2=double(gray2);N=size(loc1,1);iter=N*(N-1)*(N-2)/6;SEL=zeros(iter,3);count=1;for i=1:N-2for j=2:N-1for k=3:Nif i<j && j<kSEL(count,:)=[i j k];count=count+1;endendendendT=[];corr1=-1;for k=1:itersel=SEL(k,:);x1=loc1(sel,2);y1=loc1(sel,1);x2=loc2(sel,2);y2=loc2(sel,1);xy1=[x1';y1';ones(1,3)];xy2=[x2';y2';ones(1,3)];t=xy1/xy2;grayset=getMask(gray1,gray2,t);if isempty(grayset)continueendd1=grayset(1,:);d2=grayset(2,:);corr2=(d1*d2')/sqrt((d1*d1')*(d2*d2'));if corr2>corr1corr1=corr2;T=t;endendfunction grayset=getMask(im1,im2,T) [row1,col1]=size(im1);[row2,col2]=size(im2);T=T^(-1);grayset=[];for i=1:row1for j=1:col1xy1=[j;i;1];xy2=round(T*xy1);if xy2(1)>=1 && xy2(1)<=col2 &&xy2(2)>=1 && xy2(2)<=row2grayset=[grayset,[im1(i,j);im2(xy2(2),xy2(1))]];endendendzoo_imRegist.mfunction im=zoo_imRegist(im1,im2,T)sz=3*max(length(im1),length(im2));dim=length(size(im1));if dim==3[row1,col1,~]=size(im1);[row2,col2,~]=size(im2);im=zeros(sz,sz,3);else[row1,col1]=size(im1);[row2,col2]=size(im2);im=zeros(sz,sz);endcX=sz/3;cY=sz/3;if dim==3im(1+cY:row1+cY,1+cX:col1+cX,:)=im1; elseim(1+cY:row1+cY,1+cX:col1+cX)=im1; endT=T^(-1);for i=1:size(im,1)for j=1:size(im,2)xy1=[j-cX;i-cY;1];xy2=round(T*xy1);nx=xy2(1);ny=xy2(2);if nx>=1 && nx<=col2 && ny>=1 &&ny<=row2if i<=cY || i>=cY+row1 || j<=cX || j>=cX+col1if dim==3im(i,j,:)=im2(ny,nx,:);elseim(i,j)=im2(ny,nx);endendendendendim=imCrop(im);im=uint8(im);function im=imCrop(pic)if length(size(pic))==3gray=rgb2gray(pic);elsegray=pic;endSZ=length(gray);k=1;while k<SZif any(any(gray(k,:)))breakendk=k+1;endceil=k;k=SZ;while k>0if any(any(gray(k,:)))breakendk=k-1;endbottom=k;k=1;while k<SZif any(any(gray(:,k)))breakendk=k+1;endleft=k;k=SZ;while k>0if any(any(gray(:,k)))breakendk=k-1;endright=k;if length(size(pic))==3im=pic(ceil:bottom,left:right,:);elseim=pic(ceil:bottom,left:right);endzoo_appendingImages.mfunction im=zoo_appendingImages(im1,im2) if length(size(im1))==3[row1,col1,~]=size(im1);[row2,col2,~]=size(im2);if row1<=row2im1=[im1;zeros(row2-row1,col1,3)];elseim2=[im2;zeros(row1-row2,col2,3)];endelse[row1,col1]=size(im1);[row2,col2]=size(im2);if row1<=row2im1=[im1;zeros(row2-row1,col1)];elseim2=[im2;zeros(row1-row2,col2)];endendim=[im1,im2];zoo_optIndexfunction opt=zoo_optIndex(agl) [n,xout]=hist(agl,180);alpha=0.75;[~,IX]=find(n>alpha*max(n));n=n(IX);xout=xout(IX);theta=sum(xout.*n)/sum(n);rg=[theta-1,theta+1];opt=[];for k=1:length(agl)if agl(k)>=rg(1) && agl(k)<=rg(2) opt=[opt,k];endif length(opt)>=16breakendend。

sift的matlab实现

sift的matlab实现

sift的matlab实现SIFT(Scale-Invariant Feature Transform)是一种用于图像处理和计算机视觉的算法,能够提取出图像中的关键特征点,并且对图像的尺度、旋转和亮度变化具有较好的不变性。

SIFT算法的Matlab实现为我们提供了一种方便、高效的方式来应用这一算法。

SIFT算法的核心思想是通过检测图像中的局部特征点,并对这些特征点进行描述,从而实现图像的匹配、识别和检索等任务。

SIFT算法的具体步骤如下:1. 尺度空间极值检测(Scale Space Extrema Detection):在不同的尺度下,通过高斯平滑和采样操作构建图像的高斯金字塔,然后在金字塔中寻找局部极值点,这些极值点被认为是图像中的关键特征点。

2. 关键点定位(Keypoint Localization):对于检测到的局部极值点,通过对尺度空间的极值点进行精确定位,排除掉低对比度的点和边缘响应较大的点,从而得到更加稳定和可靠的关键点。

3. 方向分配(Orientation Assignment):对于每个关键点,根据其周围像素的梯度信息,计算出其主方向,并将关键点的描述子的方向与主方向对齐,以提高描述子的旋转不变性。

4. 关键点描述(Keypoint Description):在关键点的附近,构建一个局部的特征描述子,该描述子能够对关键点的周围图像区域进行描述,同时对图像的旋转、尺度和亮度变化具有不变性。

5. 特征点匹配(Feature Point Matching):通过对两幅图像的关键点描述子进行匹配,可以实现图像的匹配和识别。

常用的匹配算法包括暴力匹配和基于KD树的匹配。

SIFT算法的Matlab实现提供了一种方便的方式来使用这一算法。

通过调用SIFT函数,我们可以输入一张图像,然后得到该图像中的关键点和描述子。

这些关键点和描述子可以用于图像的匹配、识别和检索等任务。

在使用SIFT算法时,我们需要注意一些问题。

Matlab中的图像特征匹配方法

Matlab中的图像特征匹配方法

Matlab中的图像特征匹配方法引言在现代科技的发展中,图像处理技术被广泛应用于各个领域。

图像特征匹配作为图像处理中的重要技术,可以在图像中寻找相似的特征,以实现目标检测、图像配准等应用。

在Matlab这一强大的计算工具上,有许多图像特征匹配方法可以被使用。

本文将介绍几种常用的图像特征匹配方法,并对其原理和应用进行探讨。

一、SIFT特征匹配尺度不变特征转换(Scale-Invariant Feature Transform,SIFT)是一种用于图像特征检测与描述的算法。

该算法通过在空间尺度和方位角上寻找稳定的图像特征点,并对其进行描述,实现了对图像特征点的尺度与旋转不变性。

在Matlab中,可以使用VLFeat工具箱中的函数进行SIFT特征匹配。

SIFT特征匹配的基本步骤包括特征点检测、特征点描述和特征匹配。

首先,使用尺度空间极值检测算法寻找关键点。

然后,在每个关键点处计算图像的局部梯度,并根据梯度方向和幅值构建特征描述符。

最后,通过计算两个图像中特征描述符之间的欧氏距离,进行特征匹配。

SIFT特征匹配在计算机视觉领域有广泛的应用,在目标检测、图像配准等方面发挥着重要作用。

然而,由于其计算复杂度较高,在实际应用中可能存在一些限制。

二、SURF特征匹配速度加快的尺度不变特征转换(Speeded Up Robust Features,SURF)是对SIFT算法的改进,旨在提高特征提取和匹配的速度。

在Matlab中,可以使用SURF函数进行SURF特征匹配。

SURF特征匹配的关键是对图像中的关键点进行描述。

与SIFT算法类似,SURF算法也使用局部梯度来构建特征描述符。

但不同的是,SURF算法使用了积分图像来加速特征描述符的计算,并采用了一种更快的方法来计算特征点之间的欧氏距离。

SURF特征匹配相对于SIFT算法在速度上有明显的优势,同时也具有一定的旋转和尺度不变性。

在实际应用中,SURF特征匹配常被用于图像拼接、目标跟踪等方面。

matlab surfl用法

matlab surfl用法

matlabsurfl用法Surf是Matlab中的一个重要工具箱,用于处理图像和计算机视觉任务。

其中,Surf特征提取和匹配算法在许多实际应用中发挥着重要作用。

本文将介绍MatlabSurf的用法,包括SURF、SIFT等特征提取算法的实现。

一、SURF特征提取SURF(SpeededUpRobustFeatures)是一种快速稳健的特征提取算法,它能够在实时条件下对图像进行特征检测和描述。

使用SURF进行特征提取需要首先加载Matlab的SURF工具箱,然后使用SURF函数进行特征提取。

SURF函数的基本语法如下:[points,ids]=SURF(image)其中,points是提取的特征点坐标,ids是与特征点对应的匹配点编号。

image是要进行特征提取的图像。

如果需要进行二次特征匹配,需要指定useAffine=false。

在使用SURF函数时,需要指定算法版本,可以选择不同的版本以满足不同的性能和准确性要求。

可以使用detectors和extractors函数对SURF算法进行配置。

二、SIFT特征提取SIFT(Scale-InvariantFeatureTransform)是一种尺度不变的特征变换算法,它能够在不同尺度下对图像进行特征检测和描述。

使用SIFT进行特征提取需要首先加载Matlab的SIFT工具箱,然后使用SIFT函数进行特征提取。

SIFT函数的基本语法如下:[points,id]=SIFT(image)其中,points是提取的特征点坐标,id是与特征点对应的匹配点编号。

image是要进行特征提取的图像。

SIFT算法提供了许多可配置参数,可以根据需要进行调整。

此外,可以使用scale-space进行尺度空间的构建,从而更好地实现尺度不变性。

三、匹配算法特征匹配是计算机视觉中一个重要的任务,可以使用不同的匹配算法来比较特征点和特征描述子,以找出最佳匹配点对。

在Matlab 中,可以使用Hamming距离和欧几里得距离等距离度量方法进行匹配。

Matlab中的图像特征匹配技术

Matlab中的图像特征匹配技术

Matlab中的图像特征匹配技术图像特征匹配是计算机视觉领域中一项重要的技术,它在许多应用中都起到了关键作用。

在Matlab中,有许多强大的工具和算法可以用来进行图像特征匹配,能够帮助我们实现各种各样的图像处理和识别任务。

本文将介绍一些常见的Matlab图像特征匹配技术,并探讨它们的原理和应用。

一、SIFT算法SIFT (Scale-Invariant Feature Transform) 算法是一种经典的图像特征匹配算法,它可以在不同尺度下提取出图像中的关键点,并对这些关键点进行描述。

在Matlab中,我们可以使用VLFeat工具箱来实现SIFT算法。

VLFeat提供了一系列用于提取、描述和匹配SIFT特征的函数,可以帮助我们完成各种图像处理任务,比如目标识别、图像拼接等。

二、SURF算法SURF (Speeded-Up Robust Features) 算法是一种效率更高的图像特征匹配算法,它通过加速SIFT算法中的一些计算步骤,提高了特征提取和匹配的速度。

在Matlab中,我们可以使用SURF函数来进行SURF特征的提取和匹配。

它通常用于图像拼接、目标识别等方面。

三、ORB算法ORB (Oriented FAST and Rotated BRIEF) 算法是一种既快速又具有旋转不变性的图像特征匹配算法。

它结合了FAST关键点检测算法和BRIEF特征描述子算法,可以在保持高效率的同时,提供较好的旋转不变性和鲁棒性。

在Matlab中,我们可以使用ORB特征提取函数来完成ORB特征的提取和匹配。

ORB算法常被应用于图像跟踪、SLAM等领域。

四、基于自相关的特征匹配除了上述算法之外,Matlab中还提供了一系列基于自相关的特征匹配方法,比如基于相位相关的特征匹配、基于互相关的特征匹配等。

这些方法利用图像中的相似性和重复性信息,进行特征的匹配和识别。

在某些特定的场景中,这些方法可能会表现出更好的性能和鲁棒性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

% [image, descriptors, locs] = sift(imageFile)
%
% This function reads an image and returns its SIFT keypoints.
% Input parameters:
% imageFile: the file name for the image.
%
% Returned:
% image: the image array in double format
% descriptors: a K-by-128 matrix, where each row gives an invariant % descriptor for one of the K keypoints. The descriptor is a vector
% of 128 values normalized to unit length.
% locs: K-by-4 matrix, in which each row has the 4 values for a
% keypoint location (row, column, scale, orientation). The
% orientation is in the range [-PI, PI] radians.
%
% Credits: Thanks for initial version of this program to D. Alvaro and % J.J. Guerrero, Universidad de Zaragoza (modified by D. Lowe) function [image, descriptors, locs] = sift(imageFile)
% Load image
image = imread(imageFile);
% If you have the Image Processing Toolbox, you can uncomment the following
% lines to allow input of color images, which will be converted to grayscale.
% if isrgb(image)
% image = rgb2gray(image);
% end
[rows, cols] = size(image);
% Convert into PGM imagefile, readable by "keypoints" executable
f = fopen('tmp.pgm', 'w');
if f == -1
error('Could not create file tmp.pgm.');
end
fprintf(f, 'P5\n%d\n%d\n255\n', cols, rows);
fwrite(f, image', 'uint8');
fclose(f);
% Call keypoints executable
if isunix
command = '!./sift ';
else
command = '!siftWin32 ';
end
command = [command ' <tmp.pgm >tmp.key'];
eval(command);
% Open tmp.key and check its header
g = fopen('tmp.key', 'r');
if g == -1
error('Could not open file tmp.key.');
end
[header, count] = fscanf(g, '%d %d', [1 2]);
if count ~= 2
error('Invalid keypoint file beginning.');
end
num = header(1);
len = header(2);
if len ~= 128
error('Keypoint descriptor length invalid (should be 128).');
end
% Creates the two output matrices (use known size for efficiency)
locs = double(zeros(num, 4));
descriptors = double(zeros(num, 128));
% Parse tmp.key
for i = 1:num
[vector, count] = fscanf(g, '%f %f %f %f', [1 4]); %row col scale ori
if count ~= 4
error('Invalid keypoint file format');
end
locs(i, :) = vector(1, :);
[descrip, count] = fscanf(g, '%d', [1 len]);
if (count ~= 128)
error('Invalid keypoint file value.');
end
% Normalize each input vector to unit length
descrip = descrip / sqrt(sum(descrip.^2));
descriptors(i, :) = descrip(1, :);
end
fclose(g);。

相关文档
最新文档