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

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


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


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

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

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

基于图像分割的拉普拉斯金字塔的图像融合的基本步骤为:
1、对前景图片进行图像分割。如果前景图片的背景颜色比较简单,可以将图片转换到 HSV 色彩空间,用 cv.inRange() 进行色彩图像分割;
2、调整尺寸,将背景图片调整到 power(2,levels) 的整数倍,将前景图像调整到指定大小;
3、图像向下取样, 构造高斯金字塔;
4、图像向上取样, 构造拉普拉斯金字塔;
5、基于掩模图像的拉普拉斯加权融合;
6、由最低分辨率的高斯图像生成最低分辨率的起始图,拼接背景图像和前景的高斯金字塔顶层;
7、通过拼接图像的拉普拉斯金字塔,逐层(逐个分辨率)重建拼接图像,直到得到最高分辨率的拼接图像。


例程:1.91 基于图像分割的金字塔图像融合

    # 1.91:基于图像分割的金字塔图像融合img1 = cv2.imread("../images/seaside02.png")  # 背景图像img2 = cv2.imread("../images/seagull01.png")  # 添加的前景图像xmin, ymin, w, h = 160, 64, 256, 256  # 矩形 ROI 位置: (ymin:ymin+h, xmin:xmin+w)print(img1.shape, img2.shape)levels = 3# HSV 色彩空间图像分割hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)  # 将图片转换到 HSV 色彩空间lowerColor = np.array([100, 43, 46])  # 蓝色阈值下限:  100/43/46upperColor = np.array([124, 255, 255])  # 蓝色阈值上限: 蓝色124/255/255binary = cv2.inRange(hsv, lowerColor, upperColor)  # 背景色彩图像分割kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 9))  # (5, 5) 结构元dilate = cv2.dilate(cv2.bitwise_not(binary), kernel=kernel, iterations=3)  # 图像膨胀segment = cv2.bitwise_and(img2, img2, mask=dilate)  # 前景分割图像,前景以外区域黑色# 调整尺寸,将背景图片调整到 power(2,levels) 的整数倍imgBack = cv2.resize(img1, (512, 512), interpolation=cv2.INTER_CUBIC)front = cv2.resize(segment, (w, h))  # 将前景图像调整到指定大小 (w,h)imgFront = np.zeros(imgBack.shape, dtype=np.uint8)  # 与 imgback 尺寸相同的黑色图像imgFront[ymin:ymin+h, xmin:xmin+w] = frontgrayFront = cv2.cvtColor(imgFront, cv2.COLOR_BGR2GRAY)_, mask0 = cv2.threshold(grayFront, 1, 255, cv2.THRESH_BINARY_INV)  # 二值化处理bg = cv2.bitwise_and(imgBack, imgBack, mask=mask0)  # 生成背景,mask 遮罩区域黑色fg = imgFront  # 生成前景,前景以外区域黑色stack = cv2.add(bg, fg)  # 直接合成前景与背景plt.figure(figsize=(10, 7))plt.subplot(231), plt.axis('off'), plt.title("Original back")plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))plt.subplot(232), plt.axis('off'), plt.title("Original front")plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))plt.subplot(233), plt.axis('off'), plt.title("Segmentation ")plt.imshow(cv2.cvtColor(segment, cv2.COLOR_BGR2RGB))plt.subplot(234), plt.axis('off'), plt.title("Stacked")plt.imshow(cv2.cvtColor(stack, cv2.COLOR_BGR2RGB))# 图像向下取样, 构造高斯金字塔: [原图,下取样1次,下取样2次,下取样3次,下取样4次]gaussPyrB, gaussPyrF, maskLPyr = [imgBack], [imgFront], [mask0]print(img1.shape, img2.shape, mask0.shape)for i in range(1, levels):  # 计算第 i 层高斯金字塔gaussPyrB.append(cv2.pyrDown(gaussPyrB[i-1]))gaussPyrF.append(cv2.pyrDown(gaussPyrF[i-1]))maskLPyr.append(cv2.resize(maskLPyr[i-1], dsize=None, fx=0.5, fy=0.5))# 图像向上取样, 构造拉普拉斯金字塔 [第1层残差,第2层残差,第3层残差,第4层残差]lapPyrB, lapPyrF = [], []  # 从最顶层开始恢复for i in range(levels-1):  # 拉普拉斯金字塔有 4 层: 0,1,2,3lapB = gaussPyrB[i] - cv2.pyrUp(gaussPyrB[i+1])  # 残差lapPyrB.append(lapB)lapF = gaussPyrF[i] - cv2.pyrUp(gaussPyrF[i+1])  # 残差lapPyrF.append(lapF)# 基于掩模图像的拉普拉斯加权融合lapFusion = []for i in range(levels-1):  # 拉普拉斯金字塔共 4 层: 0,1,2,3mask = maskLPyr[i]  # 当前分辨率的掩模遮罩,前景区域黑色遮罩maskInv = 1 - mask  # 生成逆遮罩,前景区域白色开窗,前景以外区域黑色bg = cv2.bitwise_and(lapPyrB[i], lapPyrB[i], mask=mask)  # 生成背景,mask 遮罩区域黑色fg = cv2.bitwise_and(lapPyrF[i], lapPyrF[i], mask=maskInv)  # 生成前景,前景以外区域黑色lapStack = cv2.add(bg, fg)  # 前景与背景合成,得到当前分辨率的拉普拉斯融合图像lapFusion.append(lapStack)print("lapFusion", i, maskLPyr[i].shape, lapPyrB[i].shape, lapFusion[i].shape)# 拼接高斯金字塔顶层 G4: (32,32)mask = maskLPyr[levels-1]  # 当前分辨率的掩模遮罩,前景区域黑色遮罩maskInv = 1 - mask  # 生成逆遮罩,前景区域白色开窗,前景以外区域黑色bg = cv2.bitwise_and(gaussPyrB[levels-1], gaussPyrB[levels-1], mask=mask)  # 生成背景,mask 遮罩区域黑色fg = cv2.bitwise_and(gaussPyrF[levels-1], gaussPyrF[levels-1], mask=maskInv)  # 生成前景,前景以外区域黑色gaussStack = cv2.add(bg, fg)  # 前景与背景合成,得到叠加图像 (32,32)print("gaussStack", gaussStack.shape, gaussPyrB[levels-1].shape, maskLPyr[levels-1].shape)  # (32,32)fusion = gaussStack  # 从高斯金字塔顶层 G4:(32,32) 开始逐层复原for i in range(levels-1, 0, -1):  # 拉普拉斯金字塔有 4 层: 3,2,1,0pyrG = cv2.pyrUp(fusion)  # # 上采样,图像尺寸加倍fusion = lapFusion[i-1] + cv2.pyrUp(fusion)# plt.subplot(2,3,levels-i+2), plt.axis('off'), plt.title("G{}: {}".format(i-1,fusion.shape[:2]))# plt.imshow(cv2.cvtColor(fusion, cv2.COLOR_BGR2RGB))plt.subplot(235), plt.axis('off'), plt.title("GaussStack {}".format(gaussStack.shape[:2]))plt.imshow(cv2.cvtColor(gaussStack, cv2.COLOR_BGR2RGB))plt.subplot(236), plt.axis('off'), plt.title("fusion")plt.imshow(cv2.cvtColor(fusion, cv2.COLOR_BGR2RGB))plt.tight_layout()plt.show()

在这里插入图片描述



(本节完)


版权声明:

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

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


欢迎关注 『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/565477.shtml

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

相关文章

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

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

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

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

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;代表了物体的基本外形。轮廓常用于形状分析和物体的检测和识别。 边缘检测根据灰度的…

【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征

OpenCV 例程200篇 总目录-202205更新 文章目录【youcans 的 OpenCV 例程200篇】197.轮廓的基本特征2. 轮廓的特征描述2.2 轮廓的面积、周长、质心和近似多边形2.2.1 轮廓的面积2.2.2 轮廓的周长2.2.3 轮廓的质心2.2.4 轮廓的近似2.2.5 轮廓的凸包&#xff08;凸壳&#xff09;例…

Idea 项目导入

我们在刚开始使用新的开发工具IDEA的时候会遇到我们想要导入一个外部项目却不知从何下手&#xff0c;下面我就教给大家如何使用IDEA导入一个外部的项目。 Idea 导入 外部项目 1.点击 file — new 2.打开路径地址&#xff0c;选择需要导入的项目 3.选择创建—next 4.默认—…

【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测

OpenCV 例程200篇 总目录-202206更新 【youcans 的 OpenCV 例程200篇】198.基于不变矩的形状相似性检测 3. 基于不变矩检测的图像识别 形状匹配也称为形状相似度检测&#xff0c;用于比较两个形状或两个轮廓。 函数 cv2.matchShapes() 基于 Hu 不变矩检测两个形状之间的相似度…

spring boot 如何修改默认端口号和context path

创建了SpringBoot项目之后进行运行&#xff0c;当我们需要使用游览器进行访问的时候要输入端口号&#xff0c;那麽我们如何来修改这个端口号呢&#xff1f;&#xff1f;&#xff1f; 1.在src/main/resources目录下新建文件application.properties&#xff0c;并进行配置,来重写…

【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框

OpenCV 例程200篇 总目录-202206更新 【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框 文章目录【youcans 的 OpenCV 例程200篇】199.轮廓的外接边界框2. 轮廓的特征描述2.3 轮廓的外接边界框2.3.1 轮廓的垂直矩形边界框2.3.2 轮廓的最小矩形边界框2.3.3 轮廓的最小外接圆…

单级联动

想要实现联动的效果首先我们要知道什么是单机联动&#xff0c;所谓的单级联动就是点击输入框的时候&#xff0c;下面会出现多个单级联动的列表供你选择自己所要选择的数据。 我们使用html写主题内容&#xff0c;使用CSS添加样式&#xff0c;使用Jquery实现联动等相关的事件和效…

【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性

OpenCV 例程200篇 总目录-202206更新 文章目录【youcans 的 OpenCV 例程200篇】200.轮廓的基本属性2.4 轮廓的基本属性2.4.1 轮廓的宽高比&#xff08;Aspect Ratio&#xff09;2.4.2 轮廓的面积比&#xff08;Extent&#xff09;2.4.3 轮廓的坚实度&#xff08;Solidity&#…

智能家居(1)行业发展分析

1 智能家居系统 智能家居是基于物联网技术&#xff0c;由硬件系统、软件系统、云计算平台构成一个家庭生态圈&#xff0c;为用户提供安全、便利、舒适的家居生活环境。 具体而言&#xff0c;智能家居以住宅为单位、以家庭生活为背景&#xff0c;以综合布线技术、网络通信技术…

redis 高级实用教程

一、设置redis外网访问 更改redis.conf 文件 # vim redis.conf bind 127.0.0.1 # 注释掉改行 protected-mode yes # 更改模式为no&#xff08;redis3.2后&#xff09;二、设置密码验证 更改redis.conf配置文件 requirepass redhat或者通过set设置 127.0.0.1:6284>…

LaTex实战笔记 4-插入 Python 程序代码块

LaTex插入 Python 程序代码块1. 需求描述和解决方案2. minted 包的安装与配置2.1 安装 Python 第三方库 Pygments2.2 下载和安装 minted 宏包2.3 配置 LaTeX 编译环境3. minted 包的使用3.1 基本使用3.2 扩展使用3.2.1 \mint 命令行3.2.2 \mintinline 行内使用3.2.3 \inputmint…

Redis 安装与配置

Redis 安装与配置 Window 下安装 下载地址&#xff1a;https://github.com/MSOpenTech/redis/releases。 这里我们下载 Redis-x64-xxx.zip 解压到指定目录&#xff1a;  打开命令行&#xff08;cmd&#xff09;跳转至解压路径,并运行安装命令&#xff0c;结果如图 C:\U…

智能家居(2)智能体验与智能交互

1. 智能体验的分析与讨论 随着信息和网络技术的发展&#xff0c;可以网络连接的电子电器产品越来越丰富&#xff0c;智能家居、智慧园区、智能汽车等智能控制系统和产品应用越来越广泛。 智能交互终端是智能控制系统的人机交互接口&#xff0c;既是实现智能功能的重要载体&am…

netbeans java9_Java 开发新选择?Apache NetBeans IDE 9.0 备受好评

Apache NetBeans 9.0 目前已发布 Beta 版本&#xff0c;离正式版本越来越近。9.0 版本的主要目标囊括 Oracle 捐赠的大量代码&#xff0c;以及提供 Java 9 和 10 支持。Apache NetBeans 近期在社区上发起了一项满意度调查&#xff0c;用于验收用户如何对 9.0 版本的看法&#x…