基于MATLAB的图像拼接技术实验报告

基于MATLAB的图像拼接技术实验报告

  • 实验名称:基于MATLAB的图像拼接技术
  • 实验目的:利用图像拼接技术得到超宽视角的图像,用来虚拟实际场景。
  • 实验原理:

基于相位相关的图像拼接技术是一种基于频域的方法,通过求得图像在频域上是相位相关特点来找到特征位置,从而进行图像拼接。其基本原理是基于傅氏功率谱的相关技术。该方法仅利用互功率谱中的相位信息进行图像配准,对图像间的亮度变化不敏感,而且所获得的相关峰尖突出,具有一定的鲁棒性和较高的配准精度。

      基于相位相关法进行图像拼接的基本原理如下:假设f(x,y)表示尺寸      为M

N的图像,该函数的二维离散傅里叶变换(DFT)为:

其中,F(u,v)是复变函数;u、v是频率变量,u=0,1,…,M-1,v=0,1,…,N-1;x、y是空间或图像变量。

二维离散傅里叶逆变换(IDFT)为:

其中,x=0,1,…,M-1;y=0,1,…,N-1。

设两幅图像

的重叠位置为(

),则图像

的互功率谱为:

其中,*为共轭符号,对上式两边进行傅里叶逆变换将在(

处产生一个 函数。因此,只要检测上式傅里叶逆变换结果最大值的位置,就可以获得两幅图像间的评议量(

。具体算法步骤如下:

①读入两幅图片

(函数输入),并转换为灰度图像;

②分别对

做二维傅里叶变换,即:

   A=

)   B=

则通过A、B的简单的矩阵运算得到另一矩阵

,即:

 

  =B*.conj(A)/norm(B*.conj(A),1)

矩阵

的二维傅里叶逆变换C在(

)处取得最大,可通过遍历比较C(i,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(input2,2)))=input2;

elseif((move_ht<0)&(move_wd<0))

regimg2(1:size(input2,1),1:size(input2,2))=input2;

regimg1((1+abs(move_ht)):(abs(move_ht)+size(input1,1)),(1+abs(move_wd)):(abs(move_wd)+size(input1,2)))=input1;

elseif((move_ht>=0)&(move_wd<0))

regimg2((move_ht+1):(move_ht+size(input2,1)),1:size(input2,2))=input2;

regimg1(1:size(input1,1),(abs(move_wd)+1):(abs(move_wd)+size(input1,2)))=input1;

elseif((move_ht<0)&(move_wd>=0))

regimg1((abs(move_ht)+1):(abs(move_ht)+size(input1,1)),1:size(input1,2))=input1;

regimg2(1:size(input2,1),(move_wd+1):(move_wd+size(input2,2)))=input2;

end

if sum(sum(regimg1==0))>sum(sum(regimg2==0)) %选择零点较多的配准图像为拼接图像

plant=regimg1;  bleed=regimg2;

else

plant=regimg2;  bleed=regimg1;

end

combImage=plant;      %得到拼接图像

for p=1:total_ht

for q=1:total_wd

if(combImage(p,q)==0)

combImage(p,q)=bleed(p,q);  %将拼接图像的零点用另一幅图覆盖

end

end

end

%%

function [move_ht,move_wd]=my_trans(input1,input2)           %计算两幅图像平移量

F1=fft2(input1);                                          %二维傅里叶变换

F2=fft2(input2);

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;

end

五 运行结果

六 实验总结

1、图像拼接技术是数字图像处理技术的一个重要的研究分支,它是将一组相互间存在重叠部分的图像序列进行匹配对准经重采样融合后形成一幅包含各图像序列信息的、宽视角场景的、完整的、高清晰的新图像。通过图像拼接技术,可以剔除冗余信息,压缩信息存储量。

2、该实验通过读入两幅图片,并把其改成灰度图,然后分别对两幅图做二维傅里叶变换A=

)   B=

)则通过A、B的简单的矩阵运算得到另一矩阵C3,即:

  =B*.conj(A)/norm(B*.conj(A),1)矩阵

的二维傅里叶逆变换C在(

)处取得最大,可通过遍历比较C(i,j)大小即可找到该位置,并作为函数返回值。来实现图像的拼接。

3、在同组的学习中我们复习了傅里叶变换以及互功率谱的计算及应用。

4、随着计算机和图像处理技术的发展,图像拼接技术为得到超宽视角图像提供了很好的解决方案。它可将一系列有重叠边界的普通图像或视频图像进行无缝拼接,从而得到超宽视角图像。图像拼接技术的出现使采集图像的设备更普通化,利用普通的数码照相机即可得到满足要求的图像。

5、、通过这次的实验,增强了我们的团队团队合作精神,虽然在实验中我们遇到了不少困难,但是通过我们的努力,克服了困难,完成了实验,使我们更有信心面对更大的困难。

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现图片拼接需要使用图像处理中的仿射变换或投影变换,这些变换可以用变换矩阵来描述。以下是一个基于变换矩阵的图片拼接Matlab代码示例: 1. 读入两幅待拼接图片 ```matlab img1 = imread('image1.jpg'); img2 = imread('image2.jpg'); ``` 2. 提取图片特征点 使用SURF算法提取两幅图片的特征点。 ```matlab points1 = detectSURFFeatures(rgb2gray(img1)); points2 = detectSURFFeatures(rgb2gray(img2)); [features1, valid_points1] = extractFeatures(rgb2gray(img1), points1); [features2, valid_points2] = extractFeatures(rgb2gray(img2), points2); ``` 3. 匹配特征点 使用knn匹配算法匹配两幅图片的特征点。 ```matlab indexPairs = matchFeatures(features1, features2); matchedPoints1 = valid_points1(indexPairs(:, 1), :); matchedPoints2 = valid_points2(indexPairs(:, 2), :); ``` 4. 估计变换矩阵 使用RANSAC算法估计两幅图片的变换矩阵。 ```matlab [tform, inlierPoints1, inlierPoints2] = estimateGeometricTransform(matchedPoints1, matchedPoints2, 'affine'); ``` 其中,'affine'表示使用仿射变换。 5. 图片拼接 使用变换矩阵将两幅图片拼接在一起。 ```matlab outputView = imref2d(size(img1)); panorama = imwarp(img2, tform, 'OutputView', outputView); panorama = max(img1, panorama); ``` 其中,imref2d函数创建一个参考图像对象,max函数将两幅图片叠加起来。 需要注意的是,此算法适用于两幅有重叠区域的图片,对于没有重叠区域的图片可能会产生不理想的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值