基于MATLAB的图像拼接技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MATLAB的图像拼接技术
基于MATLAB的图像拼接技术实验报告
学院:数信学院
专业班级: 12级信息工程1班
姓名学号:
一、实验名称:基于MATLAB的图像拼接技术
二、实验目的:利用图像拼接技术得到超宽视角的图像,用来虚拟实际场景。
三、实验原理:
基于相位相关的图像拼接技术是一种基于频域的方法,通过求得图像在频
域上是相位相关特点来找到特征位置,从而进行图像拼接。其基本原理是
基于傅氏功率谱的相关技术。该方法仅利用互功率谱中的相位信息进行图
像配准,对图像间的亮度变化不敏感,而且所获得的相关峰尖突出,具有
一定的鲁棒性和较高的配准精度。
基于相位相关法进行图像拼接的基本原理如下:假设f(x,y)表示尺寸为MN的图像,该函数的二维离散傅里叶变换(DFT)为: ,
MN,,111,,,juxMvyN2(//) Fuvfxye,(,)(,),,MN,xy,,00
其中,F(u,v)是复变函数;u、v是频率变量,u=0,1,…,M-1,v=0,1,…,N-1;x、y是空间或图像变量。
二维离散傅里叶逆变换(IDFT)为:
N,1M,1,,juxMvyN2(//),fuve(,) Fxy(,),,,y,0x,0
,…,M-1;y=0,1,…,N-1。其中,x=0,1
设两幅图像、的重叠位置为(,),则图像、的互功率谱为:IIxyII112002
*II(,)(,),,,,,,,jxy,,,2()1200 ,eII(,)(,),,,,,12
其中,*为共轭符号,对上式两边进行傅里叶逆变换将在(x,y)处产生一00个函数。因此,只要检测上式傅里叶逆变换结果最大值的位置,就可以获得两xy幅图像间的评议量(,。具体算法步骤如下: 00
II?读入两幅图片、(函数输入),并转换为灰度图像; 12
II?分别对、做二维傅里叶变换,即: 12
fftIfftI A=() B=() 1222
C则通过A、B的简单的矩阵运算得到另一矩阵,即: 3
C =B*.conj(A)/norm(B*.conj(A),1) 3
矩阵的二维傅里叶逆变换C在(,)处取得最大,可通过遍历比较C(i,Cxy300 j)大小即可找到该位置,并作为函数返回值。
四实验程序
tic
x=[1 2;0 1];
a=imread('7.jpg'); %读取图片 b=imread('8.jpg');
figure
imshow(a);
figure
imshow(b);
imwrite(b,'160.jpg');
IMG={a,b}; %将图片存为元胞结构
num=size(IMG,2); %计算图片个数 move_ht=0; %累计平移量初值 move_wd=0; for count=1:num-1
input1=IMG{count}; %读取图象
input11=imresize(rgb2gray(input1),[300,200]);
%将图象转为灰度图像
input2=IMG{count+1};
input12=imresize(rgb2gray(input2),[300,200]);
F1=fft2(double(input11)); %
二维傅里叶变换
F2=fft2(double(input12));
pdm=exp(1i*(angle(F1)-angle(F2))); %求互功率谱
cps=real(ifft2(pdm)); %傅里叶反变换,取冲激函数的实部[i1,j1]=find(cps==max(max(cps))); %需找峰值点
HtTrans=i1-1; %得到平移量
WdTrans=j1-1;
if(i1>size(input2,1)/2)
HtTrans=HtTrans-size(cps,1);
end
if(j1>size(input2,2)/2)
WdTrans=WdTrans-size(cps,2);
end
move_ht=HtTrans; %最终平移量
move_wd=WdTrans;
ht=move_ht;wd=move_wd;
move_ht=move_ht+ht; %计算累计平移量
move_wd=move_wd+wd;
if count==1 %拼接图像
coimage=my_move(input11,input12,move_ht,move_wd);
else
coimage=my_move(coimage,imput12,move_ht,move_wd);
end
end
coimage1=coimage(15:size(coimage,1)-12,:); %切割图像
figure
imshow(uint8(coimage));
toc
time=toc
imwrite(uint8(coimage),'161.jpg');
function coimage=my_move(input1,input2,move_ht,move_wd) %根据平移量拼接图像
total_ht=max(size(input1,1),(abs(move_ht)+size(input2,1)));
total_wd=max(size(input1,2),(abs(move_wd)+size(input2,2)));
combImage=zeros(total_ht,total_wd); %按照总大小建立矩阵
regimg1=zeros(total_ht,total_wd); %配准模板1
regimg2=zeros(total_ht,total_wd); %配准模板2
%根据平移量选择配准方式即选择拼接图像的位置
if((move_ht>=0)&(move_wd>=0))
regimg1(1:size(input1,1),1:size(input1,2))=input1;
regimg2((1+move_ht):(move_ht+size(input2,1)),(1+move_wd):(move_wd+size(i nput2,2)))=input2;
elseif((move_ht<0)&(move_wd<0))