RIFT Multi-Modal Image Matching Based on Radiation-Variation Insensitive Feature Transform
RIFT:radiation-variation insensitive feature transform
introduction
3个贡献:
1.使用时相一致性而不是像素强度做特征检测,更鲁棒;只检测角点和边缘点
2.提出 maximum index map来做特征描述
3.支持旋转不变性
要实现通用的鲁棒图像匹配,需要解决三个难题:(1)几何变换不变性,辐射不变性 (2)外点的去除 (3)非刚性的配准问题
RIFT主要用来解决辐射不变性,尤其是NRD(nonlinear radiation distortiion).
目前,如果不知道图像的几何信息,没有任何一个方法可以同时用于optical-optical,sar-optial,day-night等多模态的配准。
在PC map的角点和边缘点检测特征,这些点的鲁棒性较好
使用log-Gabor构建maximum index map.
构建multiple MIM来解决旋转不变性。
HOPC的不足:(1)需要提前知道图像的地理信息,利用地理信息做粗匹配。但地理信息有可能本身差异很大(2)HOPC依赖模板匹配来寻找对应点,对于旋转和尺度变换不适用(3)HOPC使用Harris寻找关键点,关键点可能找的不好
RIFT不依赖地理信息,具有旋转不变性
method
在两张图上检测关键点;关键点的特征提取;通过特征匹配来匹配关键点;外点过滤;homograpy计算
所以,关键点的鲁棒性很重要(即同一个关键点可以在不同的图像中都被检测到)。
1.角点和边缘点检测:
输入一对图像(光学图和雷达图)(a),直接使用FAST算法检测两张图像的角点和边缘点(d),效果不好(两张图的角点并不对应,雷达图中很多角点和边缘都没有检测到)。因此,我们利用PC来检测角点。其过程为:
首先,利用小波变换得到光学图和雷达图的PC图。小波变换可以获得 freq-time图,PC图即计算各个波间相位的一致性。
然后,根据PC图计算moment,得到minimum moment和maximum moment.。minimum moment大的地方对应角点(minimum moment经过极大值检测和非极大值抑制后得到的点,记作角点,图b,e)。然后用FAST算法对maximum moment做边缘检测,得到边缘点(图ef).
对应的代码为:
[des_m1,des_m2] = RIFT_no_rotation_invariance(im1,im2,4,6,96);#在两张图像中都就检测关键点,并且将这些关键点的特征提取出来[m1,~,~,~,~,eo1,~] = phasecong3(im1,s,o,3,'mult',1.6,'sigmaOnf',0.75,'g', 3, 'k',1);#m1是maximum moment[m2,~,~,~,~,eo2,~] = phasecong3(im2,s,o,3,'mult',1.6,'sigmaOnf',0.75,'g', 3, 'k',1);#m2是另一张图的maximum momenta=max(m1(:)); b=min(m1(:)); m1=(m1-b)/(a-b);#根据最大最小值做归一化a=max(m2(:)); b=min(m2(:)); m2=(m2-b)/(a-b);% FAST detector on the maximum moment maps to extract edge feature points. 使用FAST算法在m1,m2图中检测边缘点,找出5000个点m1_points = detectFASTFeatures(m1,'MinContrast',0.05);m2_points = detectFASTFeatures(m2,'MinContrast',0.05);m1_points=m1_points.selectStrongest(5000); %number of keypoints can be set by usersm2_points=m2_points.selectStrongest(5000);
2.特征提取
先构造MIM图,然后在MIM图中,按照SIFT的特征提取算法来提取特征。
先当与先将两幅图转为同一种图,然后在该图中提取特征做配准。
(1) MIM的构造:
代码:
RIFT_no_rotation_invariance(im1,im2,4,6,96);
RIFT_descriptor_no_rotation_invariance(im1, m1_points.Location,eo1, patch_size, s,o)
其中s=4,o=6,eo1是一个4x6的cell,每个元素是HxW(与图像尺寸一致)的数组,表示该scale,该orientation下对应的小波变换与原图做卷积的结果。
关键:
CS(:,:,j)=CS(:,:,j)+abs(eo{i,j});#将各个scale的变换结果的幅度相加(一张图的一个尺度一个角度的小波变换结果是复数平面,abs取复数的幅度)
[~, MIM] = max(CS,[],3); % MIM maximum index map 在6个角度中,查看哪个角度的幅度最大;MIM为幅度最大的角度的索引
function des = RIFT_descriptor_no_rotation_invariance(im, kps,eo, patch_size, s,o)KPS=kps'; %keypoints
[yim,xim,~] = size(im);CS = zeros(yim, xim, o); %convolution sequence
#将各个scale的变换结果图相加,其中scale对应频率。
for j=1:ofor i=1:sCS(:,:,j)=CS(:,:,j)+abs(eo{i,j});end
end
#CS的shape为[H,W,6],6表示6个方向,max(CS,[],3)表示返回CS中第3个维度的最大值。所以MIM的shape为H,W
[~, MIM] = max(CS,[],3); % MIM maximum index map
(2)采用类似于SIFT的方法,使用MIM图构造特征
SIFT构造特征的方法:先把16x16的区域分为16个4x4的小区域,每个小区域中汇总16个像素的梯度方向(每个像素的梯度强度根据其方向分配到8个方向中)作为该区域的特征向量。
RIFT的patchsize是96x96,分为了6x6个小区域(每个小区域的尺寸为16x16),然后在每个小区域内统计值的直方图(每个像素的的值按照其方向分配到6个方向中,这里没有计算梯度的步骤,因为此时的值本身有梯度和方向的信息),每个小区域的特征向量长度为6.所以,一个patch的特征向量长度为6x6x6.
代码为:
des = zeros(36*o, size(KPS,2)); %descriptor (size: 6×6×o) 每个patch的特征向量的长度为36*6
kps_to_ignore = zeros(1,size(KPS,2)); #size(KPS,2)表示KPS的个数,即关键点的个数for k = 1: size(KPS,2)x = round(KPS(1, k));y = round(KPS(2, k));#x1,y1,x2,y2表示以该特征点为中心的patch的左上,右下角坐标x1 = max(1,x-floor(patch_size/2));y1 = max(1,y-floor(patch_size/2));x2 = min(x+floor(patch_size/2),size(im,2));y2 = min(y+floor(patch_size/2),size(im,1)); patch = MIM(y1:y2,x1:x2); %local MIM patch for feature description#将patch分为6*6的区域,每个区域单独提取特征ns=6;RIFT_des = zeros(ns,ns,o); %descriptor vector% histogram vectorsfor j = 1:nsfor i = 1:nsclip = patch(round((j-1)*ys/ns+1):round(j*ys/ns),round((i-1)*xs/ns+1):round(i*xs/ns));RIFT_des(j,i,:) = permute(hist(clip(:), 1:o), [1 3 2]); #hist是对每个小区域提取特征,hist是统计值的分布,permute是改变array的shapeendendRIFT_des=RIFT_des(:);#特征做归一化if norm(RIFT_des) ~= 0RIFT_des = RIFT_des /norm(RIFT_des);enddes(:,k)=RIFT_des;
end
des = struct('kps', KPS(:,kps_to_ignore ==0)', 'des', des(:,kps_to_ignore==0)');
(2) 特征点匹配,与sift的方法一致(特征距离最小的认为匹配)
#matlab的matchFeatures中的默认匹配方法是Exhaustive,会一一计算输入特征组1和输入特征组2的两两指尖的特征距离,默认特征间的距离计算方式为SSD。
[indexPairs,matchmetric] = matchFeatures(des_m1.des,des_m2.des,'MaxRatio',1,'MatchThreshold', 100);
matchedPoints1 = des_m1.kps(indexPairs(:, 1), :);
matchedPoints2 = des_m2.kps(indexPairs(:, 2), :);
[matchedPoints2,IA]=unique(matchedPoints2,'rows'); #unique类似python的set,去掉重复的。rows表示每一行作为一个元素;返回结果为去重复的matchedPoints2和对应的索引
matchedPoints1=matchedPoints1(IA,:);
(3) 外点去除
先计算出Homography,然后根据该hoography判断已经配准的点哪些是inliners,从而在显示配准结果时将inliears和outliers分开显示
H=FCS(matchedPoints1,matchedPoints2,'affine',2);
Y_=H*[matchedPoints1';ones(1,size(matchedPoints1,1))];
Y_(1,:)=Y_(1,:)./Y_(3,:);
Y_(2,:)=Y_(2,:)./Y_(3,:);
E=sqrt(sum((Y_(1:2,:)-matchedPoints2').^2));
inliersIndex=E<3;
cleanedPoints1 = matchedPoints1(inliersIndex, :);
cleanedPoints2 = matchedPoints2(inliersIndex, :);
经过特征点匹配后得到的配准关系(cor1,cor2)有很多的outliears,不能直接计算homography,需要先判定哪些是outliers,哪些是inliears。这里采用的方法是:
(1)每次选择3个点,计算affine homography的6个参数
(2)根据计算得到的affine homograpy,判断内点的个数。
(3)不断迭代过程1和过程2,内点个数最多时的homography就是最优解
注意:这里的outliears和inliears判断时,文章中说采用NBSC方法,代码中说采用FSC方法;但实际的代码却与NBSC,FSC方法都不同。代码的思想与FSC,NBSC相似,都是遍历所有可能的affine model,内点最多的affine model为最优解。
function [solution,rmse,cor1_new,cor2_new]=FSC(cor1,cor2,change_form,error_t)
[M,N]=size(cor1); %M=1389,N=2,其中N=2表示坐标n=3; #表示计算affine homograpy只需要3对配准点iterations=10000; #表示最多迭代计算10000次
most_consensus_number=0; #初始化most_consensus_number为0,most_consensus_number表示inlieras个数的最大值
cor1_new=zeros(M,N); %(1389,2)
cor2_new=zeros(M,N);%(1389,2)for i=1:1:iterationsa=floor(1+(M-1)*rand(1,n)); #rand(1,n)随机得到0-1之间的数字n次;所以floor(1+(M-1)*rand(1,n))随机获得n次(1,M-1)之间的数#随机挑选了n个匹配点(n=3)cor11=cor1(a,1:2); cor22=cor2(a,1:2);#根据挑选的点计算affine的参数 [parameters,~]=LSM(cor11,cor22,change_form);solution=[parameters(1),parameters(2),parameters(5);parameters(3),parameters(4),parameters(6);parameters(7),parameters(8),1];#根据affine model来计算当前配准点的误差diff_match2_xymatch1_xy=cor1(:,1:2)';match1_xy=[match1_xy;ones(1,M)];t_match1_xy=solution*match1_xy;match2_xy=cor2(:,1:2)';match2_xy=[match2_xy;ones(1,M)];diff_match2_xy=t_match1_xy-match2_xy;diff_match2_xy=sqrt(sum(diff_match2_xy.^2));#误差小于阈值的记inliears,inliears的个数记作consensus_numindex_in=find(diff_match2_xy<error_t);consensus_num=size(index_in,2);#私用内点个数最多的情况,来计算affine homographyif(consensus_num>most_consensus_number)most_consensus_number=consensus_num;cor1_new=cor1(index_in,:);cor2_new=cor2(index_in,:);end
end
[parameters,rmse]=LSM(cor1_new(:,1:2),cor2_new(:,1:2),change_form);
solution=[parameters(1),parameters(2),parameters(5);parameters(3),parameters(4),parameters(6);parameters(7),parameters(8),1];
end
注:
NBSC算法过程(对应文章ROBUST FEATURE MATCHING FOR GEOSPATIAL IMAGES VIA AN AFFINE-INVARIANT COORDINATE):
NBCS也是通过循环来遍历一个个可能的homography,然后inliears个数最多的homograpy对应最终的解。
其中NBCs表示在affine变换时,4个点构成的4个三角形,其面积比保持不变。如果不满足这个性质,则说明这4点的对应关系有误。
FSC算法过程:
result
关键点检测
检测到的关键点的可重复性:即同名点在两幅图中都作为关键点被检测到的能力。RIFT方法的效果最好
RIFT Multi-Modal Image Matching Based on Radiation-Variation Insensitive Feature Transform相关推荐
- AspectJ Join Point Matching based on Annotations
为什么80%的码农都做不了架构师?>>> Annotation Patterns For any kind of annotated element (type, method ...
- VideoMatch: Matching based Video Object Segmentation
Abstract: 1.视频目标分割是一个很重要的挑战,对于各种各样的视频分析任务.最近视频目标分割任务基于深度网络取得了state-of-the-art的结果. 2.由于作为预测任务的表述,这些方法 ...
- Optic Disc Detection using Template Matching based on Color Plane Histograms
Optic Disc Detection using Template Matching based on Color Plane Histograms 论文翻译:基于彩色平面直方图的模板匹配的视盘检 ...
- Gated Mechanism for Attention Based Multi Modal Sentiment Analysis 阅读笔记
GATED MECHANISM FOR ATTENTION BASED MULTIMODAL SENTIMENT ANALYSIS 阅读笔记 最近在跟进多模态的情感分析发现多模态榜一又被刷下来了,这篇 ...
- Hierarchical line matching based on Line–Junction–Line structure
一.简介 一般的线匹配的方法分为两种:基于个体的和基于小组的.简单来说就是一次匹配一个还是一次匹配一组. 对于基于个体的匹配方法,主要是光度信息,这种方法主要都是基于匹配的线段之间都会存在一定的重叠部 ...
- Model Pruning Based on Quantified Similarity of Feature Maps-基于特征图量化相似度的模型修剪
高精度的CNN模型往往具有巨大的参数,这些参数通常存储在高维张量中. 然而,很少有方法能够计算出存储在高维张量中的参数的冗余信息,这导致缺乏对CNN压缩的理论指导.本文提出了一种在三维张量中发现冗余信 ...
- 38动感菜单 38 jQuery And CSS Drop Down Multi Level Menu Solutions
参看: http://www.1stwebdesigner.com/freebies/38-jquery-and-css-drop-down-multi-level-menu-solutions/ 3 ...
- Python+OpenCV:特征匹配(Feature Matching)
Python+OpenCV:特征匹配(Feature Matching) Basics of Brute-Force Matcher Brute-Force matcher is simple. It ...
- 图匹配(Graph Matching)入门学习笔记——以《Factorized Graph Matching》为例(一)
这篇文章本身是图匹配经典论文<Factorized Graph Matching>的阅读笔记,后来发现该文介绍并串联了许多图匹配相关的知识,甚至可以看作一个小小的综述性文章,因此就作为图匹 ...
- 论文 Matching Article Pairs with Graphical Decomposition and Convolutions 阅读笔记
论文 Matching Article Pairs with Graphical Decomposition and Convolutions 详细流程 论文发表在2019 ACL上,论文地址:htt ...
最新文章
- Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for i
- Boost 编译链接
- linux 下的 rsync 文件同步
- 深度学习框架的介绍与比较(Caffe, TensorFlow, MXNet, Torch, Theano)
- UVALive 4254 	Processor(二分)
- 基于物品的协同过滤ItemCF的mapreduce实现
- hub设备_外设再多也不怕,ORICO 7口HUB测评
- Science报道新研究:同行评审后的研究仅比预印本研究质量提高4%
- 神州八号利用计算机,说到科技,我想大部分的人想到的是神州八号
- sql 单表/多表查询去除重复记录
- 执行的输出结果保存到文件夹_元素实测点自动保存
- 华硕主板固态硬盘不识别_主板启动设置无法识别固态硬盘 - 卡饭网
- win10 应用商店打不开解决
- Win7缺失dll文件如何修复?Win7计算机丢失dll文件怎么办
- 三维实景建模如何进行?有哪些作用
- android自定义rx库,Android下载库(OkHttp3+Retrofit2+RxJava2)
- Groundhog Looking Dowdy
- 微信 8.0.22 内测版:6 大更新第 1 个最实用
- 人脸识别和人脸检测的区别
- WebView调用微信H5支付
热门文章
- 禁止spotlight索引外置硬盘或者网络硬盘
- 双稳态电路的两个稳定状态是什么_数字电路学习笔记(九):初识锁存器
- html5 video断点续播,Vue中集成vue-video-player及相关api/vue视频播放插件/支持断点续播...
- 英国留学生论文introduction部分怎么写比较好?
- 图论-生成树-黑暗城堡
- IE浏览器打开github点击code无响应
- hadoop-bigdata-v2.2 版本shell脚本一键部署 master、slaver1、slaver2三个节点源代码.
- Fresco之强大之余的痛楚
- .NetCore异常:Could not load file or assembly ‘Microsoft.AI.Web‘ or one of its dependencies. The system
- android 5.1一键root工具箱,最新的安卓5.1.1 ROOT教程(不需要刷第三方内核)