【OpenCV 例程200篇】21. 图像的叠加

『youcans 的 OpenCV 例程200篇 - 总目录』


【OpenCV 例程200篇】21. 图像的叠加

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

实现图像的叠加,需要综合运用图像阈值处理、图像掩模、位操作和图像加法的操作。

我们以 Lena 图像叠加 CVlogo 为例,讨论图像叠加的思路和步骤:

  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.30 图像的叠加

    # 1.30 图像的叠加img1 = cv2.imread("../images/imgLena.tif")  # 读取彩色图像(BGR)img2 = cv2.imread("../images/logoCV.png")  # 读取 CV Logox, y = (0, 10)  # 图像叠加位置W1, H1 = img1.shape[1::-1]W2, H2 = img2.shape[1::-1]if (x + W2) > W1: x = W1 - W2if (y + H2) > H1: y = H1 - H2print(W1,H1,W2,H2,x,y)imgROI = img1[y:y+H2, x:x+W2]  # 从背景图像裁剪出叠加区域图像img2Gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  # img2: 转换为灰度图像ret, mask = cv2.threshold(img2Gray, 175, 255, cv2.THRESH_BINARY)  # 转换为二值图像,生成遮罩,LOGO 区域黑色遮盖maskInv = cv2.bitwise_not(mask)  # 按位非(黑白转置),生成逆遮罩,LOGO 区域白色开窗,LOGO 以外区域黑色# mask 黑色遮盖区域输出为黑色,mask 白色开窗区域与运算(原图像素不变)img1Bg = cv2.bitwise_and(imgROI, imgROI, mask=mask)  # 生成背景,imgROI 的遮罩区域输出黑色img2Fg = cv2.bitwise_and(img2, img2, mask=maskInv)  # 生成前景,LOGO 的逆遮罩区域输出黑色# img1Bg = cv2.bitwise_or(imgROI, imgROI, mask=mask)  # 生成背景,与 cv2.bitwise_and 效果相同# img2Fg = cv2.bitwise_or(img2, img2, mask=maskInv)  # 生成前景,与 cv2.bitwise_and 效果相同# img1Bg = cv2.add(imgROI, np.zeros(np.shape(img2), dtype=np.uint8), mask=mask)  # 生成背景,与 cv2.bitwise 效果相同# img2Fg = cv2.add(img2, np.zeros(np.shape(img2), dtype=np.uint8), mask=maskInv)  # 生成背景,与 cv2.bitwise 效果相同imgROIAdd = cv2.add(img1Bg, img2Fg)  # 前景与背景合成,得到裁剪部分的叠加图像imgAdd = img1.copy()imgAdd[y:y+H2, x:x+W2] = imgROIAdd  # 用叠加图像替换背景图像中的叠加位置,得到叠加 Logo 合成图像plt.figure(figsize=(9,6))titleList = ["1. imgGray", "2. imgMask", "3. MaskInv", "4. img2FG", "5. img1BG", "6. imgROIAdd"]imageList = [img2Gray, mask, maskInv, img2Fg, img1Bg, imgROIAdd]for i in range(6):plt.subplot(2,3,i+1), plt.title(titleList[i]), plt.axis('off')if (imageList[i].ndim==3):  # 彩色图像 ndim=3plt.imshow(cv2.cvtColor(imageList[i], cv2.COLOR_BGR2RGB))  # 彩色图像需要转换为 RGB 格式else:  # 灰度图像 ndim=2plt.imshow(imageList[i], 'gray')plt.show()cv2.imshow("imgAdd", imgAdd)  # 显示叠加图像 imgAddkey = cv2.waitKey(0)  # 等待按键命令

例程说明 1.30:

  • 本例程实现图像的叠加,中间过程图像如上图所示,最终的叠加图像如下图所示。
  • 图像叠加所涉及的操作步骤较多,建议将上文的步骤说明与程序、中间过程图像相互对照进行阅读。
  • 使用位操作生成前景 img1Bg 时,使用掩模图像 mask 对 imgROI 与 imgROI 进行 “与操作”,而不是直接对 mask 与 imgROI 进行操作,是因为 mask 为灰度图像而 imgROI 为彩色图像,不能直接进行加法或位操作。
  • 使用位操作生成前景、背景图像时,遮罩区域以外 imgROI 与 imgROI 进行 “自与操作”,如果用 “自或操作” (参见程序注释语句)的效果也是相同的。此处甚至也可以用加法操作 cv2.add 实现(参见程序注释语句),但位操作的运算速度更快。
  • 函数 threshold() 将灰度图像转换为二值图像(Binarization),只有黑白两色。该方法通过固定阈值 thresh 处理图像,将像素点的灰度值设为 0 或 255。

在这里插入图片描述


(本节完)


版权声明:

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/121265151)
Copyright 2022 youcans, XUPT
Crated:2021-11-18

【第2章:图像的数值运算】
18. 图像的掩模加法
20. 图像的按位运算
21. 图像的叠加

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

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

相关文章

微调多层自编码算法

微调多层自编码算法 Contents [hide]1 介绍2 一般策略3 使用反向传播法进行微调4 中英文对照5 中文译者 介绍 微调是深度学习中的常用策略,可以大幅提升一个栈式自编码神经网络的性能表现。从更高的视角来讲,微调将栈式自编码神经网络的所有层视为一个…

【OpenCV 例程200篇】22. 图像添加非中文文字(cv2.putText)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】22. 图像添加非中文文字 函数 cv2.putText() 用于在图像上绘制文本字符串,即添加文字。 OpenCV 不支持显示中文字符,使用 cv2.putText() 时添加的文本字符串不能包含中文字符…

自我学习

自我学习 今天让我们来完成自我学习的代码。完成这个代码需要结合稀疏自编码和softmax分类器,具体的可以看我以前的博客。依赖MNIST DatasetSupport functions for loading MNIST in MatlabStarter Code (stl_exercise.zip) 第一步:生成相应的输入和测试数据集这需要…

【OpenCV 例程200篇】23. 图像添加中文文字(ImageDraw.Draw)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】23. 图像添加中文文字 OpenCV 不支持显示中文字符,使用 cv2.putText() 时添加的文本字符串不能包含中文字符(包括中文标点符号)。在图像中添加中文字符&#xff0…

【OpenCV 例程200篇】24. 图像的仿射变换(cv2.warpAffine)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】24. 图像的仿射变换 几何变换的可以分为等距变换、相似变换、仿射变换和投影变换。在很多书籍中把等距变换、相似变换都称为仿射变换,常见的仿射变换包括平移、旋转、缩放、翻转、斜切等…

从自我学习到深层网络

从自我学习到深层网络 在前一节中,我们利用自编码器来学习输入至 softmax 或 logistic 回归分类器的特征。这些特征仅利用未标注数据学习获得。在本节中,我们描述如何利用已标注数据进行微调,从而进一步优化这些特征。如果有大量已标注数据&a…

【OpenCV 例程200篇】25. 图像的平移(cv2.warpAffine)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】25. 图像的平移 平移是物体位置在水平和垂直方向的移动。 像素点 (x,y) 沿 x 轴平移 dx、沿 y 轴平移 dy,可以由以下公式描述: [x~y~1]MAT[xy1],MAT[10dx01dy001]\begin{bmat…

JavaScript 灯泡暗亮

程序解说:点击灯泡之后切换灯泡明暗; 点击暗的灯泡的时候灯泡会随之发亮,并且下方会输出灯泡打开时间, 点击亮的灯泡的时候灯泡会随之熄灭,并且下方会输出灯泡关闭时间. 点击图片亮暗发生变化(准备两张图片…

【OpenCV 例程200篇】26. 图像的旋转(以原点为中心)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】26. 图像的旋转(以原点为中心) 图像以原点 (0, 0) 为中心、顺时针旋转角度 θ 进行旋转操作,可以由以下公式描述: [x~y~1]MAR[xy1],MAR[cosθ−sinθ0s…

电脑滑动关机

如何让你的电脑可以像手机一样滑动关机 只需点击下拉,让你享用更快更炫酷的关机方法(滑动关机) 新建一个记事本(滑动关机.txt) 打开滑动关机.txt文件,在该文件中写入 slidetoshutdown 代码段并保存文件。…

php里面的MySql

php里面的MySql SQL 是一种标准 - 但是... SQL是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL语句用于取回和更新数据库中的数据。SQL可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase以及其他数据…

【OpenCV 例程200篇】27. 图像的旋转(以任意点为中心)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】27. 图像的旋转(以任意点为中心) 图像以任意点 (x0, y0) 为旋转中心、顺时针旋转角度 θ 的旋转操作,可以先将原点平移到旋转中心 (x0, y0) ,然后按照原…

OC里面的类

OC里面的类 类的定义 不指定方法的返回值 -(id)initWithObject:(id)obj; - initWithObject:obj; 省略返回值时,默认的类型是id,也就是上面两条等价,在c语言中默认是int 接口 类公开给外部的,关于使用这个类的消息叫接口。 类的定…

人员信息管理

使用Jsp Servlet Tomcat 实现对sqlServer数据库中人员信息的管理:(MVC架构) 准备相应的数据库 链接数据库 实现对数据库中人员信息的增删改查 页面总体效果如下所示: 点击删除之后会删除掉选中的这一行只显示剩下几行内容&a…

【OpenCV 例程200篇】28. 图像的旋转(直角旋转)cv2.rotate

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】28. 图像的旋转(直角旋转) 旋转角度为 90,180,270 度时,可以用 cv2.rotate(src, rotateCode) 函数实现,该方法实际上是通过矩阵…

爱心表白

程序员并不是没有一点乐趣整天枯燥无味的游走在代码中的,在这里给大家提供了一个表白代码 功能描述: 1:能够计算任意两个时间的之间相隔的天数,2:在相隔天数下面输出心形并且心形里面还有英文我爱你字样。相信你已经迫…

OC与C混合编程

OC与C混合编程 oc中使用c语言函数 类的实现文件中可以定义c语言风格的函数,但仅限于implementation的前面,implementation和end之间,end之后 如果函数的作用域仅限于这个文件,那么给函数加上static修饰符比较好。 函数不能之间调用…

2021爱智先行者—(1)开箱点评

【本文正在参与"2021爱智先行者-征文大赛"活动】,活动链接:https://bbs.csdn.net/topics/602601454 2021爱智先行者—(1)开箱点评 欢迎关注 『Python小白的项目实战』 系列,持续更新 2021爱智先行者—&…

随机抽取

随机抽取程序是对数字字母的随机抽取,可用作抽奖程序中中奖号码的选择也可用于老师在课堂上随机点名随机抽人回答问题。 请大家先欣赏效果: 程序解读: 定义数组存储需要抽取的数据设置相应按键,继续或者结束的按钮输出提示文字…

OC里面的类类型

OC里面的类类型 类类型 比如说Volume *v1,*v2 v1和v2都是Volume类型,实际上就是一个指针,如果把v1赋值给v2后,那么v2和v1有相同的属性 空指针nil 返回值为id的类型的方法中,如果出错的话,一般会返回nil 调用端会采用如…