当前位置: 首页 > news >正文

基于affine+sift特征提取的图像配准算法matlab仿真

目录

一、理论基础

二、核心程序

三、仿真测试结果


一、理论基础

       由于相机正面拍摄物体时,相机的光轴方向可能发生变化,带来扭曲,所以第一步是对每张图片进行变换,模拟所有可能的仿射扭曲。这些扭曲由两个参量决定:水平角度φ 和垂直角度θ 。将图像旋转φ 度由倾斜度参数 t 完成:t  = 1 cosθ。设原始图像为 u ( x , y ),原始图像在 X 轴上倾斜度为 t 的变换由 u ( x , y ) → u (t x , y)得到。对数字图像来说,倾斜图像由具有方向性的 t 倍二次采样(t-subsampling)得到。它要求之前在 X 轴上有一次抗走样处理(antialiasing filter),最大限度的减少图像失真。该滤波由标准差为c的高斯卷积完成。在文献[1]中 Lowe 建议该值取c = 0.8。文献[15]中证明了该取值图像失真度较小。对图像进行旋转变换和倾斜变换可以模拟有限的一些不同水平角度,垂直角度拍摄图像。对这些参数进行采样能保证模拟图像在不同的φ 和θ 引起的视角变换下保持近似。所有模拟倾斜后的图像将由 SIFT 算法进行匹配比较。

 

         图显示了 ASIFT 算法概貌:正方形 A,B 分别代表被比较的图像 u 和 v。ASIFT 算法模拟了所有相机视轴坐标方向变化引起的扭曲。图中的平行四边形代表模拟扭曲后的图像,该图像将运用 SIFT 进行后续的匹配计算。

采样范围

     倾斜度参数 t 的采样范围非常关键。只有当目标是一个完美的二维平面,或者是个反射光强弱完全相同的物体时,才有可能在任何倾斜视角下做到目标识别。现实中找不到这样的物体。因此,需要通过实验比较室内外拍摄的图片对,并找出可行的 t 的上界。每对图片由正面视角拍摄的图片和倾斜角度拍摄的图片组成。

采样步骤:

     为使 ASIFT 算法对任何仿射变换具有不变性,倾斜度t和角度φ 必须具有较高精度。采样间隔由自然图像的多次实验得到。

二、​​​​​​​核心程序

clc;
clear;
close all;
warning off;
addpath 'func\'
% RandStream.setDefaultStream(RandStream('mt19937ar','seed',1));


FIG           = 1;



%1的话设置连线,0的话这对你的问题一,显示特征点
Feature_point = 1;
%是否需要重新特征提取,%1:对以一组新的图片,需要选择1,对于同一组图片,直接设置0
sel     = 1;
t       = sqrt(2).^([0]);%选择不同的角度t,arccos(1/t);

%读取图片
img1 = imread('a.jpg');
img2 = imread('b3.jpg');

%转换为灰度图
[R,C,K] = size(img1);
if K == 3
    img1s = rgb2gray(img1);
else
    img1s = img1;
end

[R,C,K] = size(img2);
if K == 3
    img2s = rgb2gray(img2);
else 
    img2s = img2;
end


figure;
subplot(121);imshow(img1s);title('原始图片1');
subplot(122);imshow(img2s);title('原始图片2');
%计算图片的大小
[m1,n1] = size(img1s);
[m2,n2] = size(img2s);

%对两个图片分别进行角度选择和不同角度的特征提取
if sel == 1
     tic;
     disp('对图片1进行处理');
     [Hrl_feature1,Hr_pointl_feature1,cnt1]=func_sift_angle(img1s,m1,n1,t);
     Time = toc;
     disp('对图片2进行处理');
     [Hrl_feature2,Hr_pointl_feature2,cnt2]=func_sift_angle(img2s,m2,n2,t);
     save feature_data_B1.mat  Hrl_feature1 Hr_pointl_feature1 Hrl_feature2 Hr_pointl_feature2 cnt1 cnt2 Time
else
     load feature_data_B1.mat     
end

%进行配准
pp           = 0;
level        = 0.6; 
image_match1 = []; 
image_match2 = []; 
for i = 1:(cnt1 - 1)
    for j = 1:(cnt2 -1)
    pp = pp + 1;
    fprintf('处理进度:');fprintf('%3.2f',100*pp/(cnt1*cnt2));fprintf('%%\n\n');  
    NF1(i)       = size(Hrl_feature1{i},1);
    NF2(j)       = size(Hrl_feature2{j},1);
    same_feature = func_feature_match(Hrl_feature1{i},Hrl_feature2{j},level);            
    ind1         = find(same_feature);
    ind2         = same_feature(ind1);
    %根据门限来选择一定区域内的配准点
    ind          = find(sqrt(sum(((Hrl_feature1{i}(ind1,:)-Hrl_feature2{j}(ind2,:)).^2),2)) <= level);
    
    ind1         = ind1(ind);
    ind2         = ind2(ind);
    Match1Tmp    = Hr_pointl_feature1{i}(ind1,[ 1 2 3 end ]);
    Match2Tmp    = Hr_pointl_feature2{j}(ind2,[ 1 2 3 end ]);
    image_match1 = [image_match1;Match1Tmp]; 
    image_match2 = [image_match2;Match2Tmp]; 
    end
end
close all;
%显示最后处理的效果
[LineCoordX,LineCoordY,N] = func_figure(img1s,image_match1,img2s,image_match2,Feature_point);

三、仿真测试结果

我们分别对三种不同情况进行讨论:

即平移,缩放和旋转情况进行讨论。

传统的SIFT原理就不做介绍了,

我们首先对传统的SIFT进行仿真,仿真效果如下所示:

缩放:

平移

旋转:

从上面的仿真结果可知,传统的SIFT,存在很多错误的匹配点,而且当旋转的时候,直接无法进行匹配识别了。

改进后的SIFT,我们考虑加入空间旋转,使得SIFT的性能得到提升:

缩放:

平移

旋转:

改进后的方法,可以对不同旋转角度的图像进行匹配,而且基本没有错误的匹配点:

A09-42 

相关文章:

  • 【DLY-310端子排型电流继电器】
  • STM32:GPIO输入(硬件部分)(内含实验现象+按键介绍+传感器模块介绍+硬件电路)
  • 【XGBoost】第 5 章:XGBoost 揭幕
  • Spring声明式基于注解的缓存(3-精进篇)
  • 怎么入门网络安全,学这两类证书就够了NISP或CISP
  • 探究MYSQL之索引
  • Linux环境搭建与登陆
  • WEB自动化测试(5)—— Cypress-元素交互
  • 图片速览 Deep Clustering for Unsupervised Learning of Visual Features
  • HCIA网络基础9-VRP文件系统管理
  • springboot整合mycat实现读写分离
  • iOS 16 SwiftUI 4.0 列表(List)项分隔线变短的原因及解决
  • 创邻科技入选Gartner全球《图数据库管理系统市场指南》代表厂商
  • OpenHarmony如何控制屏幕亮度
  • jenkins 2.346.1 从git拉取后自动构建部署springboot maven项目
  • AWS实战 - 利用IAM对S3做访问控制
  • JavaScript学习总结——原型
  • Nacos系列:Nacos的Java SDK使用
  • Redis的resp协议
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • spring + angular 实现导出excel
  • 飞驰在Mesos的涡轮引擎上
  • 实战|智能家居行业移动应用性能分析
  • 使用 @font-face
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 推荐一个React的管理后台框架
  • 原生Ajax
  • mysql面试题分组并合并列
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #Linux(Source Insight安装及工程建立)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Oracle)SQL优化技巧(一):分页查询
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)linux下的时间函数使用
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [51nod1610]路径计数
  • [Android] Android ActivityManager
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [BZOJ1053][HAOI2007]反素数ant
  • [BZOJ1060][ZJOI2007]时态同步 树形dp