【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合

OpenCV 例程200篇 总目录-202205更新


【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合


图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通常,上层图像的宽度和高度是相邻的下层图像的 1/2。

在计算高斯金字塔时,不断进行高斯滤波和下采样,丢失了高频信息。为了描述这些高频信息,将通过原图像减去先缩小后放大的图像的一系列差分图像,定义为拉普拉斯金字塔(Laplacian Pyramid)。


6.3 基于拉普拉斯金字塔的图像融合

由于图像噪声、光照、曝光度、模型匹配误差等因素,图像直接拼接合成会在图像重叠区域的拼接处出现明显的痕迹 。图像融合的目的就是使两幅图像的重叠区域过渡自然且平滑。

拉普拉斯金字塔将源图像分解到不同的频带,越高频的图像信息越到上层。在相同显示尺寸下比较不同分辨率的拉普拉斯图像,可以发现不同尺度下关注的细节是不同的,低分辨率下关注的是较大尺度的基本纹理,而高分辨率下关注的是更精细的纹理。

因此,可以针对不同分解层的频带特征与细节,采用不同的融合算子以突出特定频带上特征与细节,也就可以将不同图像的特征与细节融合在一起。

金字塔图像融合过程,是在不同尺度、不同空间分辨率和不同分解层上分别进行的,也称为多波段融合(Multi-band Blending)。多波段融合的思想,是先对多幅图像分别构建拉普拉斯金字塔,然后对同一层图像(相同频段)按一定规则融合,对融合后的图像金字塔重建得到融合图像。

在这里插入图片描述

基于拉普拉斯金字塔的图像融合的基本步骤为:
1、对左图、右图分别构建高斯金字塔;
2、对左图、右图分别构建拉普拉斯金字塔;
3、在每个尺度(分辨率)下,根据当前尺度拼接左、右图的拉普拉斯图像 ,得到拼接图像的拉普拉斯金字塔;
4、由最低分辨率的高斯图像生成最低分辨率的起始图,通过拼接图像的拉普拉斯金字塔,逐层(逐个分辨率)重建拼接图像,直到得到最高分辨率的拼接图像。


例程:1.88 拉普拉斯金字塔图像融合

    # 1.88:拉普拉斯金字塔图像融合img1 = cv2.imread("../images/buddha01.png")img2 = cv2.imread("../images/buddha03.png")img1 = cv2.resize(img1, (512, 512), interpolation=cv2.INTER_CUBIC)  # 将图片大小调整到 2**levels 的整数倍img2 = cv2.resize(img2, (512, 512), interpolation=cv2.INTER_CUBIC)# 直接左右拼接图像 (用于对比)rows, cols, channel = img1.shapestack = np.hstack((img1[:,:int(cols/2)], img2[:,int(cols/2):]))# 图像向下取样, 构造高斯金字塔: [原图,下取样1次,下取样2次,下取样3次,下取样4次]levels = 5  # 高斯金字塔层数gaussPyr1, gaussPyr2 = [img1], [img2]  # 原始图像为高斯金字塔第 0 层, (512, 512)for i in range(1, levels):  # 高斯金字塔共 5 层: 0,1,2,3,4gaussPyr1.append(cv2.pyrDown(gaussPyr1[i-1]))  # 计算第 i 层高斯金字塔gaussPyr2.append(cv2.pyrDown(gaussPyr2[i-1]))# 图像向上取样, 构造拉普拉斯金字塔 [第1层残差,第2层残差,第3层残差,第4层残差]lapPyr1, lapPyr2 = [], []  # 从最顶层开始恢复for i in range(levels-1):  # 拉普拉斯金字塔有 4 层: 0,1,2,3lapPyr1.append(gaussPyr1[i] - cv2.pyrUp(gaussPyr1[i+1]))lapPyr2.append(gaussPyr2[i] - cv2.pyrUp(gaussPyr2[i+1]))# 拉普拉斯金字塔左右拼接lapStack = []for i in range(levels-1):  # 拉普拉斯金字塔共 4 层: 0,1,2,3rows, cols, channel = lapPyr1[i].shapesplicing = np.hstack((lapPyr1[i][:, 0:int(cols/2)], lapPyr2[i][:, int(cols/2):]))lapStack.append(splicing)print("lapStack", i, lapStack[i].shape)# 由拼接后的Laplace金字塔恢复原图像rows, cols, channel = gaussPyr1[-1].shape  # 高斯金字塔顶层 G4:(32,32)stackG4 = np.hstack((gaussPyr1[-1][:,:int(cols/2)], gaussPyr2[-1][:,int(cols/2):]))  # 拼接高斯金字塔顶层stackG3 = lapStack[3] + cv2.pyrUp(stackG4)  # stackG3:(64,64)stackG2 = lapStack[2] + cv2.pyrUp(stackG3)  # stackG2:(128,128)stackG1 = lapStack[1] + cv2.pyrUp(stackG2)  # stackG1:(256,256)stackG0 = lapStack[0] + cv2.pyrUp(stackG1)  # stackG0:(512,512)plt.figure(figsize=(9, 7))plt.subplot(221), plt.axis('off'), plt.title("BuddhaFace A")plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))plt.subplot(222), plt.axis('off'), plt.title("BuddhaFace B")plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))plt.subplot(223), plt.axis('off'), plt.title("BuddhaFace stacked")plt.imshow(cv2.cvtColor(stack, cv2.COLOR_BGR2RGB))plt.subplot(224), plt.axis('off'), plt.title("Laplacian blended")plt.imshow(cv2.cvtColor(stackG0, cv2.COLOR_BGR2RGB))plt.tight_layout()plt.show()   

程序说明:

左下图是基于拉普拉斯金字塔的图像融合,右下图是图像直接进行拼接的结果。直接拼接时,在左右拼接处可以看到非常明显、锐利的拼接缝,称为截断现象(Seams)。基于拉普拉斯金字塔的图像拼接,通过多频带融合,使两幅图像的重叠区域过渡自然且平滑。

在这里插入图片描述



(本节完)


版权声明:

OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124866268)

Copyright 2022 youcans, XUPT
Crated:2022-5-20


欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔
【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔
【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像
【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合
【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合
【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合
【youcans 的 OpenCV 例程200篇】191.基于图像分割的金字塔图像融合
【youcans 的 OpenCV 例程200篇】192.Gabor 滤波器组的形状
【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode combinations java_[LeetCode][Java] Combinations

题目:Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.For example,If n 4 and k 2, a solution is:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]题意:给定两个整数 n 和 k,返回1 ...n中k个数字的全部的组合。…

【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征…

中奖程序

使用Java做了一个中奖程序,程序中已经设置中奖的号码,根据文本提示会让你输入四个数字,当你输入你的四个数字之后程序会给出你是否中奖的结果显示。 结果演示 代码演示 package com.ten; import java.util.Scanner; public class ZhongJi…

java search 不能使用方法_java – 无法使用TERMS QUERY从ELASTIC SEARCH查询字母数字字段...

我试图使用TERMS QUERY从索引查询字母数字值,但它没有给我输出.查询:{"size" : 10000,"query" : {"bool" : {"must" : {"terms" : {"caid" : [ "A100945","A100896" ]}}}},"…

【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合 两张图像直接进行加法运算后图像的颜色会改变,通过加权加法实现图像混合后图像的透明度会改变,都不能实现图像的叠加。 实现图像的叠加,需要…

【youcans 的 OpenCV 例程200篇】191.基于图像分割的金字塔图像融合

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】191.基于图像分割的金字塔图像融合 拉普拉斯金字塔将源图像分解到不同的频带,越高频的图像信息越到上层。在相同显示尺寸下比较不同分辨率的拉普拉斯图像,可以发现不同尺度下关注的细…

java103 101 104 101_编写一个java程序将100,101,102,103,104,105这6个数以数组的形式写入到D:\\test.t...

展开全部你问的不明白,我在代码里给你写了,你自己看吧import java.io.FileWriter;import java.io.IOException;import java.util.Date;import java.util.Scanner;public class Test {public static void main(String[] args) {// 100,101,102,103,104,10…

IDEA快捷生成代码

在开发中我们常用到了许多如for循环,输入输出,if语句等,那么我们如何使用IDEA开发工具自动生成能让我们快速的编写的模板代码呢??? psvm //生成main方法:public static void main(String[] args) {}sout /…

【youcans 的 OpenCV 例程200篇】192.Gabor 滤波器组的形状

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】192.Gabor 滤波器组的形状 6.5 Gabor 滤波器 Gabor 变换是一种加窗短时傅里叶变换,以高斯函数作为短时傅里叶变换的窗函数,因此可以在频域不同尺度、不同方向上提取特征。 Gabor 函…

悬浮窗java_Java制作一个简易的悬浮窗/PPT悬浮窗

电脑日常使用过程中,我们常常可以看到许多软件有悬浮窗,方便快捷,甚至有的还可以在PPT里面使用。这是怎么实现的呢?今天我就来分享一下Java制作一个简单悬浮窗的方法,可以在PPT里面使用。运行效果:其实悬浮…

【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取 6.5 Gabor 滤波器 Gabor 变换是一种加窗短时傅里叶变换,以高斯函数作为短时傅里叶变换的窗函数,因此可以在频域不同尺度、不同方向上提取特征。 G…

java设置行显示复选框_java spring cheakbox复选框怎么行或者列删除添加

展开全部你好!使用原62616964757a686964616fe78988e69d8331333431353366生js实现,还是可以使用其他框架?我这里有个基于jquery的实现:$(document).ready(function(){function Info(id, name, birthday, workDate, skill, experien…

MyEclipse生成常用方法

我们使用Eclipse工具开发的时候,有很多的代码我们是不用写的,我们可以直接生成我们想要的方法,那么怎么生成我们经常使用的方法呢??? 首先打开我们的MyEclipse工具 到代码编辑页面,在已经定义好…

【youcans 的 OpenCV 例程200篇】194.寻找图像轮廓(cv.findContours)

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】194.寻找图像轮廓(cv.findContours) 1. 轮廓 轮廓是一系列相连的像素点组成的曲线,代表了物体的基本外形。轮廓常用于形状分析和物体的检测和识别。 边缘检测根据灰度的…

java线程池执行器_Java线程池ThreadPoolExecutor的使用

Java线程池ThreadPoolExecutor的使用ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口。Excutor接口只定义了一个方法就是execute用来执行任务。ExecutorService继承于Excutor并添加了一些其他的执行任务的方法和管理线程…

密码强度显示

使用HTML,CSS及JS实现注册功能中密码强度的显示&#xff0c;根据输入的密码判断并显示用户输入密码的强度等级是高还是低等。 效果演示 代码演示 html内容 <div class"container"><div class"userName-wrapper"><label for"userN…

【youcans 的 OpenCV 例程200篇】195.绘制图像轮廓(cv.drawContours)

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】195.绘制图像轮廓&#xff08;cv.drawContours&#xff09; 1. 轮廓 轮廓是一系列相连的像素点组成的曲线&#xff0c;代表了物体的基本外形。轮廓常用于形状分析和物体的检测和识别。 边缘检测根据灰度的…

java终结方法_Java终结任务:Callable和Future

在这里首先介绍下Callable和Future&#xff0c;我们知道通常创建线程的2种方式&#xff0c;一种是直接继承Thread&#xff0c;另外一种就是实现Runnable接口&#xff0c;但是这两种方式创建的线程不返回结果&#xff0c;而Callable是和Runnable类似的接口定义&#xff0c;但是通…

【youcans 的 OpenCV 例程200篇】196.图像的矩和不变矩(cv.moments)

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】196.图像的矩和不变矩&#xff08;cv.moments&#xff09; 2. 轮廓的特征描述 在对实际图像进行轮廓查找时&#xff0c;得到的轮廓数量很多。获取轮廓后&#xff0c;通常基于轮廓的特征进行筛选、识别和处…

Spring boot 项目目录结构详解

对SpringBoot项目目录进行分层显示能够使我们的开发思路更加的明确&#xff0c;代码内容更加清晰易懂&#xff0c;下面向大家讲解一下项目目录结构。 代码层的结构 根目录&#xff1a;com.springboot 1.工程启动类(ApplicationServer.java)置于com.springboot.build包下 2.实…