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)


相关推荐

  • android实现点餐功能「建议收藏」

    android实现点餐功能「建议收藏」近期项目中有点餐功能要求中午和晚上一起点餐,中午和晚上的餐品加载的都是一样的有炒菜和面点废话不多说直接上代码activity页面代码:publicclassAnimationActivityextendsBaseActivityimplementsView.OnClickListener{privateListViewrecyclerView;privateImag…

  • git clone与git pull区别

    git clone与git pull区别原地址最近一直焦虑换工作与面试,自然面试过程中也被问到了很多问题,在一家公司中,被问到了git相关的知识。面试官提出了gitclone与gitpull有什么区别。由于自己对git的掌握情况不是特别深入,感觉瞬间被问蒙圈一样。后来,查了相关的文档,看了一些文章,自己有了一丁点的理解,觉得应该…

  • datagrip 激活码最新2021破解方法

    datagrip 激活码最新2021破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 虚拟机安装xp要多久_虚拟机vmware安装教程

    虚拟机安装xp要多久_虚拟机vmware安装教程    最近使用VMware虚拟机安装XP3时老是弹出找不到A:/GHOSTERR.TXT的错误提示信息,开始以为是下载的ISO镜像文件有问题,就又重新下载了一个雨林木风版本的,可是安装时还是遇到同样的问题,说明镜像ISO问题不大。于是上网google了上述提示信息,发现很多人安装XP都遇到过,大致是磁盘或光盘的问题,有人建议对磁盘进行分区或格式化。    于是,利用雨林木风自带的工具将分

  • plt.scatter()

    plt.scatter()总是去别人的博客里面找关于scatter散点图相关用法,想想还是自己写一个吧,下次看自己的就行。函数的原型:matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,verts=No…

  • 修改select下拉菜单样式(input下拉框select)

    自带的select下拉菜单美观度实在不怎么样,并且不容易美化,当然我们可以模拟实现select下拉菜单,但是代码稍显复杂,不过也可以通过简单的CSS实现此效果,下面通过实例简单作一下介绍。代码如下:<!DOCTYPEhtml><html><head><metacharset=”utf-8″><metaname=”autho…

发表回复

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

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