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

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


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


两张图像直接进行加法运算后图像的颜色会改变,通过加权加法实现图像混合后图像的透明度会改变,都不能实现图像的叠加。

实现图像的叠加,需要综合运用图像分割、图像掩模、位操作和图像加法的操作。

  1. 确定图像叠加位置,将 Lena 图像中的叠加位置裁剪出来,使叠加图像的尺寸相同;
  2. 对前景图像进行二值化处理,生成黑白掩模图像 mask(LOGO区域黑色遮盖)及其反转掩模图像 maskInv (LOGO区域白色开窗);
  3. 以黑白掩模 mask(LOGO区域黑色遮盖)作为掩模,对背景图像(Lena裁剪图)进行位操作,LOGO区域遮盖为黑色,其它区域保持不变,得到叠加背景图像 img1BG;
  4. 以反转掩模 maskInv(LOGO区域白色开窗)作为掩模,对前景图像(CVlogo)进行位操作,LOGO区域保持不变,其它区域遮盖为黑色,得到叠加前景图像 img2FG;
  5. 背景图像 img1BG 和 前景图像 img2FG 通过 cv2.add 加法运算,得到裁剪部分的叠加图像;
  6. 用叠加图像替换Lena 图像中的叠加位置,得到Lena 叠加 CVlogo 的图像。

算法原理:


例程:1.90 基于图像分割的图像融合

通过图像分割,获得前景目标的掩模图像 mask,将前景图像叠加到背景图像的指定位置,直接进行图像拼接。


    # 1.90:基于图像分割的图像融合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, (5, 5))  # (5, 5) 结构元dilate = cv2.dilate(cv2.bitwise_not(binary), kernel=kernel, iterations=2)  # 图像膨胀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=(9, 6))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("Resized mask")plt.imshow(mask0, "gray")plt.subplot(235), plt.axis('off'), plt.title("Resized front")plt.imshow(cv2.cvtColor(imgFront, cv2.COLOR_BGR2RGB))plt.subplot(236), plt.axis('off'), plt.title("Stacked")plt.imshow(cv2.cvtColor(stack, cv2.COLOR_BGR2RGB))plt.tight_layout()plt.show()

在这里插入图片描述



(本节完)


版权声明:

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

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/565478.shtml

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

相关文章

【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.实…

【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 轮廓的最小外接圆…