原文地址:http://blog.csdn.net/smallflyingpig/article/details/61200497

图像拼接一般包括warp(映射), compensation(光照补偿)和blend(融合)三部分。 
warp部分主要取决于相机参数估计的准确性,光照补偿主要用于解决不同图像曝光不同所带来的输出图像的不同局部的光照差异,而blend则用于融合不同图像之间的重叠部分,一般使用线性加权的方式来得到最终的输出图像。 


多波段融合(multi blend)

多波段融合的基本思想是图像可以分解为不同频率的图像的叠加(类似于傅里叶变换),在不同的频率上,应该使用不同的权重来进行融合,在低频部分应该使用波长较宽的加权信号(例如高斯核函数中sigma比较大),在高频部分应该使用较窄的加权信号(例如高斯核函数的sigma比较小),其算法如下:

  1. 计算输入图像的高斯金字塔。如果输入图像是 A,B ,则计算 GA0,GA1,GA2,GA3,… 和 GB0,GB1,GB2,GB3,… (如何计算高斯金字塔?)
  2. 计算输入图像的拉普拉斯金字塔。记为 LA0,LA1,LA2,LA3,… 和 LB0,LB1,LB2,LB3,… (如何计算拉普拉斯金字塔?)
  3. 将处于同一级的拉普拉斯金字塔进行融合。例如在拼接缝两侧使用简单的线性融合。记输出图像为 C ,则这里得到 LC0,LC1…
  4. 将高层的拉普拉斯金字塔依次扩展直至和 LC0 相同分辨率。我们记做 LC00,LC11,LC22…
  5. 将4中得到的图像依次叠加,则得到最终的输出图像 C 。

代码实现

使用matlab实现多波段算法如下:

function C = multi_blend(A, B);%resize A,B,C to the same size
A_size = size(A);
B_size = size(B);
C_size = [512,512];
if(A_size ~= C_size)A = imresize(A,C_size);
end
if(B_size ~= C_size)B = imresize(B,C_size);
end%gaussian kernel
kernel=fspecial('gaussian',[5 5],1);%obtain the Gauss Pyramid
G_A0 = A;
G_A1 = conv2(G_A0,kernel,'same');
G_A1 = G_A1(2:2:size(G_A1,1),2:2:size(G_A1,2));
G_A2 = conv2(G_A1,kernel,'same');
G_A2 = G_A2(2:2:size(G_A2,1),2:2:size(G_A2,2));
G_A3 = conv2(G_A2,kernel,'same');
G_A3 = G_A3(2:2:size(G_A3,1),2:2:size(G_A3,2));
G_A4 = conv2(G_A3,kernel,'same');
G_A4 = G_A4(2:2:size(G_A4,1),2:2:size(G_A4,2));
G_A5 = conv2(G_A4,kernel,'same');
G_A5 = G_A5(2:2:size(G_A5,1),2:2:size(G_A5,2));G_B0 = B;
G_B1 = conv2(G_B0,kernel,'same');
G_B1 = G_B1(2:2:size(G_B1,1),2:2:size(G_B1,2));
G_B2 = conv2(G_B1,kernel,'same');
G_B2 = G_B2(2:2:size(G_B2,1),2:2:size(G_B2,2));
G_B3 = conv2(G_B2,kernel,'same');
G_B3 = G_B3(2:2:size(G_B3,1),2:2:size(G_B3,2));
G_B4 = conv2(G_B3,kernel,'same');
G_B4 = G_B4(2:2:size(G_B4,1),2:2:size(G_B4,2));
G_B5 = conv2(G_B4,kernel,'same');
G_B5 = G_B5(2:2:size(G_B5,1),2:2:size(G_B5,2));%get Laplacian Pyramid
L_A0 = double(G_A0)-imresize(G_A1,size(G_A0));
L_A1 = double(G_A1)-imresize(G_A2,size(G_A1));
L_A2 = double(G_A2)-imresize(G_A3,size(G_A2));
L_A3 = double(G_A3)-imresize(G_A4,size(G_A3));
L_A4 = double(G_A4)-imresize(G_A5,size(G_A4));
L_A5 = double(G_A5);L_B0 = double(G_B0)-imresize(G_B1,size(G_B0));
L_B1 = double(G_B1)-imresize(G_B2,size(G_B1));
L_B2 = double(G_B2)-imresize(G_B3,size(G_B2));
L_B3 = double(G_B3)-imresize(G_B4,size(G_B3));
L_B4 = double(G_B4)-imresize(G_B5,size(G_B4));
L_B5 = double(G_B5);%construct the mask
size0 = size(L_A0);
mask0 = zeros(size0);
mask0(:,1:size0(2)/2)=1;
mask0(:,size0(2)/2-5:1:size0(2)/2+5)=repmat(1:-0.1:0,[size0(1) 1]);
size1 = size(L_A1);
mask1 = zeros(size1);
mask1(:,1:size1(2)/2)=1;
mask1(:,size1(2)/2-5:1:size1(2)/2+5)=repmat(1:-0.1:0,[size1(1) 1]);
size2 = size(L_A2);
mask2 = zeros(size2);
mask2(:,1:size2(2)/2)=1;
mask2(:,size2(2)/2-5:1:size2(2)/2+5)=repmat(1:-0.1:0,[size2(1) 1]);
size3 = size(L_A3);
mask3 = zeros(size3);
mask3(:,1:size3(2)/2)=1;
mask3(:,size3(2)/2-5:1:size3(2)/2+5)=repmat(1:-0.1:0,[size3(1) 1]);
size4 = size(L_A4);
mask4 = zeros(size4);
mask4(:,1:size4(2)/2)=1;
mask4(:,size4(2)/2-5:1:size4(2)/2+5)=repmat(1:-0.1:0,[size4(1) 1]);
size5 = size(L_A5);
mask5 = zeros(size5);
mask5(:,1:size5(2)/2)=1;
mask5(:,size5(2)/2-5:1:size5(2)/2+5)=repmat(1:-0.1:0,[size5(1) 1]);%obtain the output
L_C0 = L_A0 .* mask0 + L_B0 .* (1-mask0);
L_C1 = L_A1 .* mask1 + L_B1 .* (1-mask1);
L_C2 = L_A2 .* mask2 + L_B2 .* (1-mask2);
L_C3 = L_A3 .* mask3 + L_B3 .* (1-mask3);
L_C4 = L_A4 .* mask4 + L_B4 .* (1-mask4);
L_C5 = L_A5 .* mask5 + L_B5 .* (1-mask5);
C = L_C0+imresize(L_C1,size0)+imresize(L_C2,size0)+imresize(L_C3,size0)+imresize(L_C4,size0)+imresize(L_C5,size0);figure(1);
imshow(A);
figure(2);
imshow(B);
figure(3);
imshow(uint8(C));end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100

实验效果:

输入两张光照差别很大的图像: 
 
左半部分使用左图,右半部分使用右图,进行多波段融合得到如下: 


每个波段融合使用的掩膜如下(白色代表左图成分,黑色代表右图成分): 
 
 
 
 
 

其中前四幅图为显示方便做了偏移处理。

参考

  1. P. Burt and E. Adelson. A multiresolution spline with application to image mosaics. ACM Transactions on Graphics, 2(4):217–236, 1983.
  2. Matthew Brown and David G. Lowe. Automatic Panoramic Image Stitching using Invariant Features.

多频段融合方法——图像拼接相关推荐

  1. 领域最全!多传感器融合方法综述!(Camera/Lidar/Radar等多源异构数据)

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[ECCV2022]获取ECCV2022所有自动驾驶方向论文! 自动 ...

  2. 模型融合方法最全总结!

    本文是模型融合的经验方法总结.包含了投票法.平均法.排序法.Stacking 和 Blending. 一.背景 之前有段时间打数据挖掘类比赛,看到很多选手用模型融合的技巧,特别是比赛后期的时候,很多选 ...

  3. 图像点云数据融合方法汇总

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨eyesighting@知乎 来源丨https://zhuanlan.zhihu.com/p/4 ...

  4. 加权平均融合消除图像拼接的拼缝(Python 代码)

    这里提供一种采用加权平均融合消除图像拼缝的算法,供大家使用. https://blog.csdn.net/xiaoxifei/article/details/103045958 如下图所示,如果两张图 ...

  5. 【机器学习】集成学习与模型融合方法举例

    [机器学习]集成学习与模型融合方法举例 文章目录 1 概述1.1 什么是集成学习 2 CrossValidation 交叉验证 3 stacking 4 Voting投票器 5 Bagging 1 概 ...

  6. python 导入模型h20_【机器学习】模型融合方法概述

    我理解的Kaggle比赛中提高成绩主要有3个地方 特征工程 调参 模型融合 之前每次打比赛都只做了前两部分,最后的模型融合就是简单的加权平均,对于进阶的Stacking方法一直没尝试,这几天摸索了一下 ...

  7. tensorflow打印模型结构_钢结构模型3D打印与有限元网格的融合方法

    作者:魏鲁双 刘尚蔚 王 颖 魏 群 华北水利水电大学钢结构与工程研究院 中国科学院大学人工智能学院 摘 要 薄壁结构的3D打印STL文件是单侧外表面三角面网络,而钢结构模型体系的3D打印数据图形是由 ...

  8. 机器学习模型融合方法综述

    最近我发现读者群里很多同学都对算法竞赛产生了兴趣,不少人已经开始自发组队,准备打榜Kaggle了.于是我邀请了Kaggle Master贝塔同学,对竞赛中常用的模型融合方法做了一个总体介绍.看完你会对 ...

  9. 金字塔图像融合方法总结(一)

    一.高斯金字塔和下采样 为了获取层级为 G_i+1 的金字塔图像,我们采用如下方法: <1>对图像G_i进行高斯内核卷积 <2>将所有偶数行和列去除 得到的图像即为G_i+1的 ...

最新文章

  1. 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
  2. 查找nginx安装的路径以及相关安装操作命令
  3. 大数据实时计算工程师/Hadoop工程师/数据分析师职业路线图
  4. 华为云严选上新啦!高效准确的数据同步方案来了
  5. My97DatePicker 演示和文档
  6. 传输速率和传播速率的理解
  7. 【爬虫教程】吐血整理,最详细的爬虫入门教程~
  8. 当租房成为一种生活方式
  9. 我赢助手手把手教您挖掘用户痛点、做到独一无二的定位
  10. CSGO控制台与常用指令
  11. 利用window.location实现下载文档
  12. sketch怎么转换成html,手稿秒变html的Sketch 2 Code
  13. gpa计算器java代码_GP中的GPA计算器帮助
  14. 酷我音乐mp3歌曲URL地址提取(作背景音乐)
  15. SAP发送邮件作为附件
  16. 密码打码就安全了吗?这款星标 20K 的去 『马赛克』 开源神器,用 AI 一秒还原高清原图!...
  17. SMDK2440A 5.0BSP之eboot流程(作者:wogoyixikexie@gliet)
  18. sumproduct 公式
  19. EXCEL下拉列表选项设置
  20. 贵州移动落实工业“百千万”工程 助力大数据发展

热门文章

  1. KL散度(Divergence)
  2. linux防火墙禁用445端口,启用iptables防火墙,要求INPUT方向允许任意主机访问ICMP、TCP的21、22、80、139、445端口,INPUT其他默认禁止访问。...
  3. 使基于CentOS8的Docker镜像支持中文
  4. 【转】CT辐射量如何计算?
  5. 用scratch编程画心形线
  6. bash脚本编程之算术运算:加减乘除
  7. sklearn学习之:(7)sklearn 自动生成数据集用法:make_hastie_10_2, make_circles, make_moons
  8. 【C语言】打字程序。在屏幕上输出一行英文字符串(带空格),然后提示用户原样输入这行字符串,并给出用户输入的正确率。
  9. 如何查找EI 及SCI 索引
  10. 方案解析丨如何在ARM平台搭建超声波无损探伤系统