详解在Python中把一个图像叠加在另一个图像上

在Python中把一个图像叠加在另一个图像上的过程中,可以用OpenCV库来实现。具体步骤如下:

1.读取原图和覆盖图

import cv2

# 读取原图和覆盖图
img1 = cv2.imread("image1.png")
img2 = cv2.imread("image2.png")

2.确定图像叠加的位置

# 确定图像叠加的位置
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]

这里img2的大小要小于img1,才能在img1的特定区域上叠加。rows, cols, channels = img2.shape得到img2的行、列和通道数,然后利用这些值,从img1中选取与img2大小相同的区域作为覆盖区域roi

3.制作蒙版

# 制作蒙版
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

在将图像叠加时,需要将覆盖区域进行蒙版处理。这里通过将img2转换为灰度图,然后利用阈值将非黑色部分变成白色(255),制作一个蒙版mask。用bitwise_notmask中的白色和黑色进行反转,获得mask_inv

4.图像叠加操作

# 图像叠加操作
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst

在进行图像叠加操作时,分别对roiimg2进行若干次的位运算,最后将它们加在一起得到叠加图像dst。然后将dst放回到原图中的roi位置,就完成了图像叠加的操作。

下面给出一个完整的代码示例:对于两幅图片A和B,将B的左上角位置放在A的中央位置,并将B图切出来的长宽分别缩小一半后叠加在A图中。

import cv2

# 读取A和B图片
img_A = cv2.imread("image_A.png")
img_B = cv2.imread("image_B.png")

# 获取B图片的大小信息
rows, cols, channels = img_B.shape

# 计算出将B图显示在A图中央的坐标点
center_x = img_A.shape[1] // 2 - cols // 4
center_y = img_A.shape[0] // 2 - rows // 4

# 抠出B图需要覆盖的区域
roi = img_A[center_y:center_y + rows // 2, center_x:center_x + cols // 2]

# 制作蒙版mask和mask_inv
img_B_gray = cv2.cvtColor(img_B, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img_B_gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

# 图像叠加
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
img2_fg = cv2.bitwise_and(img_B, img_B, mask=mask)
dst = cv2.add(img1_bg, img2_fg)

# 将叠加后的图像放回到A图
img_A[center_y:center_y + rows // 2, center_x:center_x + cols // 2] = dst

# 显示图片
cv2.imshow("result", img_A)
cv2.waitKey(0)
cv2.destroyAllWindows()

另一种示例,将两张图片按照一定的权值混合在一起。

import cv2

# 读取两张图片
img1 = cv2.imread("image1.png")
img2 = cv2.imread("image2.png")

# 设定混合比例
alpha = 0.7
beta = 1 - alpha

# 图像混合
result = cv2.addWeighted(img1, alpha, img2, beta, 0)

# 显示图片
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的示例中,利用cv2.addWeighted()函数对两张图片进行按权重混合,最后得到一个新的混合后的图像result,其中alpha表示第一张图片的权重,beta表示第二张图片的权重,0表示亮度权重。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解在Python中把一个图像叠加在另一个图像上 - Python技术站

(1)
上一篇 2023年3月25日
下一篇 2023年3月25日

相关文章

  • python基本语法练习实例

    首先我们需要明确一下“Python基本语法练习实例”的概念。这个概念指的是通过实际练习,掌握Python编程语言的基本语法知识。下面是一个Python基础语法练习的攻略。 1. 学习Python基本语法 首先,你需要了解Python编程语言的基本语法,包括Python注释、变量、数据类型、运算符、控制流等内容。可以通过阅读Python官方文档或者Python…

    python 2023年5月30日
    00
  • 在scrapy中使用phantomJS实现异步爬取的方法

    在Scrapy中使用PhantomJS实现异步爬取的方法 PhantomJS是一个基于WebKit的无界面浏览器,它可以模拟浏览器的行为,支持JavaScript、CSS、DOM等Web标准。在Scrapy中使用PhantomJS可以实现异步爬取,提高爬取效率。 以下是一个完整攻略包括两个示例。 步骤1:安装PhantomJS 首先,需要安装PhantomJ…

    python 2023年5月15日
    00
  • 浅谈python中的数字类型与处理工具

    浅谈Python中的数字类型与处理工具 Python 是一种解释型语言,通过该语言,我们可以使用多种数据类型来进行数字处理。在使用 Python 进行数字处理时,主要涉及到以下几个方面: 数字类型 数字处理工具 与数字类型相关的库 数字类型 Python中数字类型包括整数、浮点数、复数三种。 整数 Python 中的整数没有大小限制,可以处理任意大小的整数,…

    python 2023年5月13日
    00
  • python的格式化输出(format,%)实例详解

    Python的格式化输出(format, %)实例详解 在Python中,有两种方式可以进行格式化输出:format和%。 使用format进行格式化输出 使用字符串的format()函数,可以进行格式化输出。format()函数在字符串中插入参数,达到格式化输出的效果。 实例1:数字格式化输出 num = 123.456 print("数字格式化…

    python 2023年6月5日
    00
  • Python Cookie 读取和保存方法

    下面是关于“Python Cookie 读取和保存方法”的详细攻略。 Python Cookie简介 Cookie是网站发给用户浏览器并存储在本地的一个文本文件,一般用于记录用户登录状态等信息。在Python中,我们可以通过 http.cookiejar 模块来读取和保存Cookie信息。 Cookie的读取 要读取一个网站的Cookie信息,我们可以使用 …

    python 2023年6月3日
    00
  • Python实现FM算法解析

    下面是关于“Python实现FM算法解析”的完整攻略。 1. FM算法简介 FM(Factorization Machines)算法是一种基于矩阵分解的机器学习算法,主要用于推荐系统中的问题。FM算法可以对高维稀疏数据进行建模,并且可以处理缺失数据和非线性关系。 2. Python实现FM算法 2.1 算法流程 FM算法的流程下: 初始化模型参数,包括隐向量…

    python 2023年5月13日
    00
  • Python如何把Spark数据写入ElasticSearch

    Python可以使用ElasticSearch的Python客户端库(Elasticsearch-py)来将Spark数据写入Elasticsearch。下面我们来讲解一下具体的步骤。 1. 安装 Elasticsearch-py pip install elasticsearch 2. 在Spark中创建DataFrame 首先需要在Spark中加载要写入…

    python 2023年6月3日
    00
  • Python匿名函数详情

    下面是Python匿名函数的详细讲解攻略: 1. 什么是 Python 匿名函数 Python 匿名函数又叫 Lambda函数。Lambda函数是一种快速定义单行的最小函数形式。这种函数能够接收任意多个参数(包括可选参数)并且返回单个表达式的值。 下面是Lambda函数的一般形式: lambda [arg1 [,arg2,…..argn]]:expres…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部