基于SIFT算法的图像匹配

这篇具有很好参考价值的文章主要介绍了基于SIFT算法的图像匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本概念

尺度不变特征转换(Scale-invariant feature transform,简称SIFT) ,是一种用来侦测与描述影像中的局部性特征的算法,它在空间尺度中寻找极值点,提取位置、尺度、旋转不变量,生成特征描述子。 SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。

计算步骤 

SIFT算法主要分以下步骤:

1尺度空间极值点检测:搜索所有尺度上的图像位置,通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

2筛选出稳定的关键点:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。

3确定关键点方向:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

4生成特征点描述子:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

5特征点匹配

Matlab代码

%该函数读取图像并返回其SIFT“关键点”
function [image, descriptors, locs] = sift(imageFile)
image = imread(imageFile);               % 读图
[rows, cols] = size(image); 
% 转换为PGM格式,便于“关键点”可执行文件的读取
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);
%调用“关键点”可执行文件
if isunix
    command = '!./sift ';
else
    command = '!siftWin32 ';
end
command = [command ' <tmp.pgm >tmp.key'];
eval(command);
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
% x1, y1; 起始点
% x2, y2; 终止点
function TransformLine(imsize, keypoint, x1, y1, x2, y2)
len = 6 * keypoint(3);
s = sin(keypoint(4));
c = cos(keypoint(4));
% 变换
r1 = keypoint(1) - len * (c * y1 + s * x1);
c1 = keypoint(2) + len * (- s * y1 + c * x1);
r2 = keypoint(1) - len * (c * y2 + s * x2);
c2 = keypoint(2) + len * (- s * y2 + c * x2);
line([c1 c2], [r1 r2], 'Color', 'c');
%% 该函数读取两张图像,并找到它们的SIFT特征
function num = match(image1, image2)
[im1, des1, loc1] = sift(image1);    %找出每张图的SIFT关键点
[im2, des2, loc2] = sift(image2);
distRatio = 0.6;   
des2t = des2';            %预计算矩阵转置
for i = 1 : size(des1,1)
   dotprods = des1(i,:) * des2t;        % 点积向量
   [vals,indx] = sort(acos(dotprods));  %取反余弦并对结果进行排序 
   %检查最近邻的角度是否小于2*distRatio.
   if (vals(1) < distRatio * vals(2))
      match(i) = indx(1);
   else
      match(i) = 0;
   end
end
% 显示匹配点连接的图像
newImg = cat(2,im1,im2);  %将两张图像放在一张图中
figure; imshow(newImg)
hold on
plot(loc1(:,2),loc1(:,1), 'ro','MarkerSize',5,'LineWidth',0.7)
plot(loc2(:,2)+size(im1,1),loc2(:,1), 'm*','MarkerSize',5,'LineWidth',0.7)
cols1 = size(im1,2);
for i = 1: size(des1,1)
  if (match(i) > 0)
    line([loc1(i,2) loc2(match(i),2)+cols1], ...
         [loc1(i,1) loc2(match(i),1)], 'Color', 'c');
  end
end
hold off;
num = sum(match > 0);
fprintf('Found %d matches.\n', num);
% 保存结果
frame=getframe(gcf);
im=frame2im(frame);
imwrite(im,'S图像匹配结果.jpg'); 
%% 主程序
img1=imread('baby1.JPG');
img2=imread('baby2.JPG');
img1_gray=rgb2gray(img1);
img2_gray=rgb2gray(img2);
match('img1_gray.jpg',' img2_gray.jpg ');

匹配结果

基于SIFT算法的图像匹配,Matlab,机器视觉,算法,人工智能,深度学习文章来源地址https://www.toymoban.com/news/detail-805045.html

到了这里,关于基于SIFT算法的图像匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB算法实战应用案例精讲-【人工智能】机器视觉(概念篇)(最终篇)

    目录 前言 几个高频面试题目 如何评价一个光源的好坏?

    2024年02月02日
    浏览(66)
  • 基于SIFT图像特征识别的匹配方法比较与实现

    目前常用的匹配器有 BFMatcher and FlannBasedMatcher 1.1 BFMatcher BFMatcher 全称是 Brute-Force Matcher (直译即为暴力匹配器) 大致原理: 对于 img1 中的每个描述符, BFMatcher 将其与 img2 中的所有描述符进行比较;它计算两个描述符之间的距离度量(例如,欧几里得距离或汉明距离,默认使

    2024年02月09日
    浏览(41)
  • 【教程】Autojs使用OpenCV进行SIFT/BRISK等算法进行图像匹配

    转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]         此代码可以替代内置的images.findImage函数使用,但可能会误匹配,如果是对匹配结果要求比较高的,还是得谨慎使用。

    2024年02月07日
    浏览(47)
  • MATLAB算法实战应用案例精讲-【图像处理】机器视觉(基础篇)(七)

    目录  几个高频面试题目 工业检测中黑白相机为什么比彩色工业相机更受青睐 机器视觉的发展历程 算法原理

    2024年02月06日
    浏览(56)
  • 基于SIFT的图像Matlab拼接教程

    图像拼接技术,将普通图像或视频图像进行无缝拼接,得到超宽视角甚至360度的全景图,这样就可以用普通数码相机实现场面宏大的景物拍摄。利用计算机进行匹配,将多幅具有重叠关系的图像拼合成为一幅具有更大视野范围的图像,这就是图像拼接的目的。 图1 基于SIFT图像

    2024年02月02日
    浏览(33)
  • 计算机竞赛 - 基于机器视觉的图像拼接算法

    图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,你用你的手机对某一场景拍照,但是你没有办法一次将所有你

    2024年02月13日
    浏览(66)
  • 【图像处理】基于双目视觉的物体体积测量算法研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 本文运用

    2024年02月11日
    浏览(37)
  • 【计算机视觉课程设计】基于暗通道先验单幅图像去雾算法的实现(MATLAB)

           随着信息化时代的到来,计算机视觉得以迅速发展,在社会生活中的各个领域发挥了重要作用。然而,近年来大气污染逐渐加重,雾霾天气出现的频率越来越高,导致户外成像设备不能捕捉到高质量的清晰图像,无法正常运用于计算机视觉系统。因此,对雾天图像进

    2024年02月05日
    浏览(44)
  • SIFT算法 特征匹配

    一、SIFT算法 参考链接 【OpenCV】SIFT原理与源码分析 DOG尺度空间构造(Difference of Gaussian) 首先是对原特征图下采样可以得到金字塔形状的多分辨率空间,作为特征金字塔,该特征金字塔可以方便提取出不同尺度的特征(感觉这里也可以叫多尺度空间) 多尺度空间:利用高斯

    2024年02月04日
    浏览(30)
  • 计算机视觉项目实战-基于特征点匹配的图像拼接

    😊😊😊 欢迎来到本博客 😊😊😊 本次博客内容将继续讲解关于OpenCV的相关知识 🎉 作者简介 : ⭐️⭐️⭐️ 目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉深度学习(keras、pytorch、yolo),python网页爬虫、机器学习、计算机视觉(OpenCV)、

    2024年02月02日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包