大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
基于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 配准后的图像)
下面是Matlab源代码,共计13个*.m文件和1个*.exe文件,其中siftWin32 .exe文件需要自行下载,下载链接为http://pan.baidu.com/s/1pJL4SB5;需要*.m格式的源代码的,到http://download.csdn.net/download/destiny0321/9204877进行下载;仿真使用的图像到http://download.csdn.net/detail/destiny0321/9379319进行下载
zoo_main.m
close 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 des1 des2
loc1=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.m
function gray=zoo_x2gray(im)
if length(size(im))==3
gray=rgb2gray(im);
else
gray=im;
end
gray=uint8(medfilt2(double(gray)));
zoo_sift.m
function [des,loc]=zoo_sift(im)
[row,col]=size(im);
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', col, row);
fwrite(f,im','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,cnt]=fscanf(g,'%d %d',[1 2]);
if cnt~=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
loc=double(zeros(num,4));
des=double(zeros(num,128));
for k=1:num
[vector,cnt]=fscanf(g, '%f %f %f %f', [14]);
if cnt~=4
error('Invalid keypoint file format');
end
loc(k,:)=vector(1,:);
[descrip, count] = fscanf(g, '%d', [1 len]);
if (count ~= 128)
error('Invalid keypoint file value.');
end
descrip = descrip / sqrt(sum(descrip.^2));
des(k, :) = descrip(1, :);
end
fclose(g);
for k=1:size(des,1)
des(k,:)=des(k,:)/sum(des(k,:));
end
delete tmp.key tmp.pgm
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
<span style="font-family: Arial, Helvetica, sans-serif;">zoo_drawPoints.</span><span style="font-family: Arial, Helvetica, sans-serif;">m</span>
function zoo_drawPoints(im1,loc1,im2,loc2)
im=zoo_appendingImages(im1,im2);
imshow(im);
hold on
set(gcf,'Color','w');
plot(loc1(:,2),loc1(:,1),'r*',loc2(:,2)+size(im1,2),loc2(:,1),'b*');
hold off
zoo_BidirectionalMatch.m
function match=zoo_BidirectionalMatch(des1,des2,Num,Thresh)
X=sum(des1.^2,2);
Y=sum(des2.^2,2);
XY=des1*des2';zoo_BidirectionalMatch
corr=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 corr1 ix1 row1 col1
[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 corr2 ix2 row2 col2
m1=match12(:,1)*10000+match12(:,2);
m2=match21(:,1)*10000+match21(:,2);
clear match12
match=[];
for k=1:length(m1)
re=m1(k)-m2;
idx=find(re==0);
if ~isempty(idx)
match=[match;match21(idx,:)];
end
end
zoo_linePoints.m
function zoo_linePoints(im1,loc1,im2,loc2)
im=zoo_appendingImages(im1,im2);
imshow(im);
hold on
set(gcf,'Color','w');
plot(loc1(:,2),loc1(:,1),'r*',loc2(:,2)+size(im1,2),loc2(:,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');
end
hold off
zoo_getRotAgl.m
function agl=zoo_getRotAgl(loc1,loc2)
ori1=loc1(:,4);
ori2=loc2(:,4);
agl=ori2-ori1;
agl=agl*180/pi;
zoo_drawRotAglHist.m
function zoo_drawRotAglHist(agl)
agl=agl(agl>-180);
agl=agl(agl<180);
hist(agl,180);
hold on
set(gcf,'Color','w');
xlabel('Rotated Angle(¡ã)');
ylabel('Number of Feature Point');
hold off
zoo_getTransMat.m
function T=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-2
for j=2:N-1
for k=3:N
if i<j && j<k
SEL(count,:)=[i j k];
count=count+1;
end
end
end
end
T=[];
corr1=-1;
for k=1:iter
sel=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)
continue
end
d1=grayset(1,:);
d2=grayset(2,:);
corr2=(d1*d2')/sqrt((d1*d1')*(d2*d2'));
if corr2>corr1
corr1=corr2;
T=t;
end
end
function grayset=getMask(im1,im2,T)
[row1,col1]=size(im1);
[row2,col2]=size(im2);
T=T^(-1);
grayset=[];
for i=1:row1
for j=1:col1
xy1=[j;i;1];
xy2=round(T*xy1);
if xy2(1)>=1 && xy2(1)<=col2&& xy2(2)>=1 && xy2(2)<=row2
grayset=[grayset,[im1(i,j);im2(xy2(2),xy2(1))]];
end
end
end
zoo_imRegist.m
function 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);
end
cX=sz/3;
cY=sz/3;
if dim==3
im(1+cY:row1+cY,1+cX:col1+cX,:)=im1;
else
im(1+cY:row1+cY,1+cX:col1+cX)=im1;
end
T=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<=row2
if i<=cY || i>=cY+row1 || j<=cX ||j>=cX+col1
if dim==3
im(i,j,:)=im2(ny,nx,:);
else
im(i,j)=im2(ny,nx);
end
end
end
end
end
im=imCrop(im);
im=uint8(im);
function im=imCrop(pic)
if length(size(pic))==3
gray=rgb2gray(pic);
else
gray=pic;
end
SZ=length(gray);
k=1;
while k<SZ
if any(any(gray(k,:)))
break
end
k=k+1;
end
ceil=k;
k=SZ;
while k>0
if any(any(gray(k,:)))
break
end
k=k-1;
end
bottom=k;
k=1;
while k<SZ
if any(any(gray(:,k)))
break
end
k=k+1;
end
left=k;
k=SZ;
while k>0
if any(any(gray(:,k)))
break
end
k=k-1;
end
right=k;
if length(size(pic))==3
im=pic(ceil:bottom,left:right,:);
else
im=pic(ceil:bottom,left:right);
end
zoo_appendingImages.m
function im=zoo_appendingImages(im1,im2)
if length(size(im1))==3
[row1,col1,~]=size(im1);
[row2,col2,~]=size(im2);
if row1<=row2
im1=[im1;zeros(row2-row1,col1,3)];
else
im2=[im2;zeros(row1-row2,col2,3)];
end
else
[row1,col1]=size(im1);
[row2,col2]=size(im2);
if row1<=row2
im1=[im1;zeros(row2-row1,col1)];
else
im2=[im2;zeros(row1-row2,col2)];
end
end
im=[im1,im2];
zoo_optIndex
function 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];
end
if length(opt)>=16
break
end
end
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234658.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...