MATLAB图像识别_多模态图像配准

MATLAB图像识别_多模态图像配准基于SIFT特征的图像配准(附Matlab源代码) 本文先给出了采用SIFT方法进行图像配准的实验原图以及实验结果,最后附上Matlab源代码。 实验一:      实验一的图像(见图1.1)是本人自己拍摄的,然后由软件裁剪成400×400像素而成,其中参考图像和待配准图像之间有重叠部分,且具有一定的旋转。这是一般难度的图像配准。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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

 

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

 

实验一:

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

            MATLAB图像识别_多模态图像配准                MATLAB图像识别_多模态图像配准

(图1.1 参考图像(左图)和待配准图像(右图))

 

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

MATLAB图像识别_多模态图像配准

(图1.2  经过筛选后的能作为配准控制点的SIFT匹配特征点对)

配准后的图像见下图1.3所示。

MATLAB图像识别_多模态图像配准

(图1.3  配准后的图像)

 

实验二:

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

        MATLAB图像识别_多模态图像配准      MATLAB图像识别_多模态图像配准

(图2.1  参考图像(左图)和待配准图像(右图))


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

MATLAB图像识别_多模态图像配准

(图2.2  经过筛选后的能作为配准控制点的SIFT匹配特征点对)

 

  配准后的图像见下图1.3所示。

MATLAB图像识别_多模态图像配准

(图2.3  配准后的图像)


实验三:

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

      MATLAB图像识别_多模态图像配准        MATLAB图像识别_多模态图像配准

(图3.1  参考图像(左图)和待配准图像(右图))

 

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

MATLAB图像识别_多模态图像配准

(图3.2 经过筛选后的能作为配准控制点的SIFT匹配特征点对)


 配准后的图像见下图3.3所示。

MATLAB图像识别_多模态图像配准

(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);

Jetbrains全家桶1年46,售后保障稳定

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账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号