当前位置: 首页 > news >正文

基于MATLAB的图像拼接技术

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

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

      基于相位相关法进行图像拼接的基本原理如下:假设f(x,y)表示尺寸      为M*N的图像,该函数的二维离散傅里叶变换(DFT)为:

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

五 运行结果

http://www.lryc.cn/news/477000.html

相关文章:

  • ComfyUI 快速入门(环境搭建)
  • 将HTML项目上传至Gitee仓库(详细教程)
  • 如何应对Oracle SQL语句的数据去重问题,应该考虑哪几个方面?
  • 论负载均衡技术在Web系统中的应用论文
  • NumPy 数据类型
  • JavaScript——(4)
  • 每日一练 | DHCP Relay(DHCP 中继)
  • `psdparse`:解锁Photoshop PSD文件的Python密钥
  • 考研要求掌握的C语言程度(插入排序)
  • mybatis源码解析-sql执行流程
  • Golang | Leetcode Golang题解之第538题把二叉搜索树转换为累加树
  • 【linux】HTTPS 协议原理
  • 安利一款开源企业级的报表系统SpringReport
  • 数据安全-接口数据混合加密笔记
  • JeecgBoot入门
  • 用 Vue.js 打造炫酷的动态数字画廊:展示学生作品的创意之旅
  • 【YOLO学习】YOLOv8改进举例
  • 文心一言 VS 讯飞星火 VS chatgpt (383)-- 算法导论24.5 3题
  • 【AIGC】如何通过ChatGPT轻松制作个性化GPTs应用
  • gulp入门教程2:gulp发展历史
  • 【实验八】前馈神经网络(4)优化问题
  • 【深度学习】论文笔记:空间变换网络(Spatial Transformer Networks)
  • Charles抓包_Android
  • 【MATLAB源码-第204期】基于matlab的语音降噪算法对比仿真,谱减法、维纳滤波法、自适应滤波法;参数可调。
  • Scala的包及其导入
  • deepfm模型实现招聘职位推荐算法
  • 编程之路:蓝桥杯备赛指南
  • Android 15 在状态栏时间中显示秒数
  • Flutter 鸿蒙next版本:自定义对话框与表单验证的动态反馈与错误处理
  • Unreal Engine5中使用 Lyra框架