基于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
五 运行结果

相关文章:
基于MATLAB的图像拼接技术
实验名称:基于MATLAB的图像拼接技术实验目的:利用图像拼接技术得到超宽视角的图像,用来虚拟实际场景。实验原理: 基于相位相关的图像拼接技术是一种基于频域的方法,通过求得图像在频域上是相位相关特点来找到特征位置…...
ComfyUI 快速入门(环境搭建)
ComfyUI 是一个现代化、灵活的用户界面(UI)工具,专为 AI 模型和深度学习框架设计,能够快速实现可视化操作和定制化界面。在本教程中,我们将介绍如何在本地机器上快速搭建 ComfyUI 环境,帮助你开始使用这一工…...
将HTML项目上传至Gitee仓库(详细教程)
1.登录giett giett地址链接:Gitee - 基于 Git 的代码托管和研发协作平台 2.新建一个giett仓库 创建后得到远程仓库: 3、在本地项目文件夹右击鼠标点击 Open Git Bash Here 4、输入命令 命令:git init,这个目录变成git可以管理的仓库,会出…...
如何应对Oracle SQL语句的数据去重问题,应该考虑哪几个方面?
引言 在数据管理和数据库设计中,数据去重是一个重要的课题。随着信息技术的快速发展,数据的产生速度和数量都在急剧增加,如何有效地管理和维护这些数据成为了一个亟待解决的问题。 数据去重不仅可以减少存储空间的占用,还可以提高数据查询的效率,确保数据的准确性和一致…...
论负载均衡技术在Web系统中的应用论文
一、概要叙述软件项目及其主要工作 在2023年,我有幸参与了某公司电子商务平台的研发项目,担任系统架构设计师一职。该项目旨在构建一个高性能、高可用性的电子商务平台,以支撑公司日益增长的在线业务需求。作为系统架构设计的核心成员&#…...
NumPy 数据类型
1.常用 NumPy 基本类型 (1)bool_:布尔型数据类型(True 或者 False) (2)int_:默认的整数类型(类似C 语言long,int32 或 int64) (3&a…...
JavaScript——(4)
【DOM】 一、DOM基本概念 DOM(Document Object Model,文档对象模型)是 JavaScript 操作 HTML 文档的接口,使文档操作变得非常优雅、简便。 DOM 最大的特点就是将 HTML 文档表示为 “节点树”。 DOM 元素/节点:就是…...
每日一练 | DHCP Relay(DHCP 中继)
01 真题题目 DHCP Relay 又称为 DHCP 中继,下列关于 DHCP Relay 的说法正确的是(多选): A. DHCP 协议多采用广播报文,如果出现多个子网则无法穿越,所以需要 DHCP Relay 设备。 B. DHCP Relay 一定是一台交…...
`psdparse`:解锁Photoshop PSD文件的Python密钥
文章目录 psdparse:解锁Photoshop PSD文件的Python密钥背景:为何选择psdparse?psdparse是什么?如何安装psdparse?简单函数使用方法应用场景常见Bug及解决方案总结 psdparse:解锁Photoshop PSD文件的Python密…...
考研要求掌握的C语言程度(插入排序)
插入排序是啥类型的排序 插入类型的 插入排序经常用在啥类型场景下 用在有序序列下的基础上插入新数据 时间复杂度分析 如果是有序的基础下,最好的时间复杂度是O(n); 普通情况下是O(n^2) 插入排序的原理是啥&am…...
mybatis源码解析-sql执行流程
1 执行器的创建 1. SimpleExecutor 描述:最基本的执行器,每次查询都会创建新的语句对象,并且不会缓存任何结果。 特点: 每次查询都会创建新的 PreparedStatement 对象。 不支持一级缓存。 适用于简单的查询操作,不…...
Golang | Leetcode Golang题解之第538题把二叉搜索树转换为累加树
题目: 题解: func getSuccessor(node *TreeNode) *TreeNode {succ : node.Rightfor succ.Left ! nil && succ.Left ! node {succ succ.Left}return succ }func convertBST(root *TreeNode) *TreeNode {sum : 0node : rootfor node ! nil {if n…...
【linux】HTTPS 协议原理
1. 了解 HTTPS 协议原理 (一)认识 HTTPS HTTPS 也是一种应用层协议,是在 HTTP 协议的基础上引入了一个加密层 因为 HTTP协议的内容都是按照文本的方式进行传输的,这个过程中,可能会出现一些篡改的情况 (…...
安利一款开源企业级的报表系统SpringReport
SpringReport是一款企业级的报表系统,支持在线设计报表,并绑定动态数据源,无需写代码即可快速生成想要的报表,可以支持excel报表和word报表两种格式,同时还可以支持excel多人协同编辑,后续考虑实现大屏设计…...
数据安全-接口数据混合加密笔记
接口数据传输安全设计方案 采用非对称加密对称加密混合方式,接口混合加、解密过程梳理: 后端准备sm2公钥和私钥后端将SM2公钥传输到前端前端生成SM4密钥前端使用SM2公钥加密SM4秘钥,获得密文使用SM4秘钥加密数据将密文和加密数据传输至后端…...
JeecgBoot入门
最近在了解低代码平台,其中关注到gitee上开源项目JeecgBoot,JeecgBoot官方也有比较完整的入门教学文档,这里我们将耕者官方教程学习,并将其记录下来。 一、项目简介 JeecgBoot 是一款基于代码生成器的低代码开发平台拥有零代码能力…...
用 Vue.js 打造炫酷的动态数字画廊:展示学生作品的创意之旅
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
【YOLO学习】YOLOv8改进举例
文章目录 1. ODConv1.1 修改1.2 原yaml文件1.3 修改yaml文件样式11.4 修改yaml文件样式2 2. DAT3. 在train下修改模型 1. ODConv 1.1 修改 1. 在ultralytics/nn/models里创建ODConv.py文件。 2. 在ultralytics/nn/task.py中导入from .modules.ODConv import C2f_ODConv,ODConv…...
文心一言 VS 讯飞星火 VS chatgpt (383)-- 算法导论24.5 3题
三、对引理 24.10 的证明进行改善,使其可以处理最短路径权重为 ∞ ∞ ∞ 和 − ∞ -∞ −∞ 的情况。引理 24.10(三角不等式)的内容是:设 G ( V , E ) G(V,E) G(V,E) 为一个带权重的有向图,其权重函数由 w : E → R w:E→R w:E→R 给出&…...
【AIGC】如何通过ChatGPT轻松制作个性化GPTs应用
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 💯前言💯什么是GPTsGPTs的工作原理GPTs的优势GPTs的应用前景总结 💯创建GPTS应用的基本流程进入GPTs创建界面方式一:按照引导完成生成创建GPTs方式二…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...
