Python如何叠加两张图片

我这里有如下两张图片,需要把他们叠加在一起,进行查看。这两张图片的大小都是300 × 300。不拼接在一起就不方便查看。需要把左边的小图,放到右边大图的中间。

一、拼接两个图片的代码

要解决这个问题,你可以使用fromarray()方法将NumPy数组转换回PIL图像对象,然后再进行alpha_composite操作。

from PIL import Image  
import numpy as np  # 打开两张图片  
img1 = Image.open('image1.png')  
img2 = Image.open('image2.png')  # 确保两张图片的大小相同  
assert img1.size == img2.size, "两张图片的大小必须相同"  # 将两张图片转换为NumPy数组  
img1_array = np.array(img1)  
img2_array = np.array(img2)  # 将NumPy数组转换回PIL图像对象  
img1_pil = Image.fromarray(img1_array)  
img2_pil = Image.fromarray(img2_array)  # 使用alpha_composite方法合并两张图片  
result_img = Image.alpha_composite(img1_pil, img2_pil)  # 保存合并后的图片  
result_img.save('merged_image.png')

二、旋转图像识别代码

这里我们对接了图像识别接口,可以识别出图像的旋转角度,最后把图片按照正确角度进行旋转,然后拼接在一起查看角度识别是否正确。

代码如下:


import base64
import requests
import datetime
import numpy as np
from io import BytesIO
from PIL import Imaget1 = datetime.datetime.now()#PIL图片保存为base64编码
def PIL_base64(img, coding='utf-8'):img_format = img.formatif img_format == None:img_format = 'JPEG'format_str = 'JPEG'if 'png' == img_format.lower():format_str = 'PNG'if 'gif' == img_format.lower():format_str = 'gif'if img.mode == "P":img = img.convert('RGB')if img.mode == "RGBA":format_str = 'PNG'img_format = 'PNG'output_buffer = BytesIO()# img.save(output_buffer, format=format_str)img.save(output_buffer, quality=100, format=format_str)byte_data = output_buffer.getvalue()base64_str = 'data:image/' + img_format.lower() + ';base64,' + base64.b64encode(byte_data).decode(coding)return base64_str# 旋转图片
def rotate_img(img, angle):# 转换为有alpha层temp_img2 = img.convert('RGBA')# 旋转rot = temp_img2.rotate(-angle)# 创建一个与旋转图像大小相同的白色图像fff = Image.new('RGBA', rot.size, (255, 255, 255, 0))# 使用alpha层的rot作为掩码创建一个复合图像out = Image.composite(rot, fff, rot)# 将临时图片转换为元素图片颜色模式temp_img2 = out.convert(img.mode)return temp_img2# 加载外圈大图
img1 = Image.open(r'E:\Python\lixin_project\OpenAPI接口测试\test_img\39号模型测试图片_1.png')
# 图片转base64
img1_base64 = PIL_base64(img1)
# 加载内圈小图
img2 = Image.open(r'E:\Python\lixin_project\OpenAPI接口测试\test_img\39号模型测试图片_2.png')
# 图片转base64
img2_base64 = PIL_base64(img2)# 验证码识别接口
url = "http://www.detayun.cn/openapi/verify_code_identify/"
data = {# 用户的key"key":"Yrebvsf3hz73ZGqles5D",# 验证码类型"verify_idf_id":"39",# 外圈大图"img1":img1_base64,# 内圈小图"img2":img2_base64,
}
header = {"Content-Type": "application/json"}# 发送请求调用接口
response = requests.post(url=url, json=data, headers=header)# 获取响应数据,识别结果
print(response.text)
print("耗时:", datetime.datetime.now() - t1)
angle = response.json()['data']['angle']
# 旋转图片
img1 = rotate_img(img1, -angle)
img2 = rotate_img(img2, angle)# 将两张图片转换为NumPy数组
img1_array = np.array(img1)
img2_array = np.array(img2)# 将NumPy数组转换回PIL图像对象
img1_pil = Image.fromarray(img1_array)
img2_pil = Image.fromarray(img2_array)# 使用alpha_composite方法合并两张图片
new_img = Image.alpha_composite(img1_pil, img2_pil)
# 保存合并后的图片
new_img.show()

最终识别拼接效果如下:

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

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

相关文章

初识汇编指令

1. ARM汇编指令 目的 认识汇编, 从而更好的进行C语言编程 RAM指令格式: 了解 4字节宽度 地址4字节对齐 方便寻址 1.1 指令码组成部分 : condition: 高4bit[31:28] 条件码 0-15 (16个值 ) 条件码: 用于指令的 条件执行 , ARM指定绝大部分 都可…

Java/Python/Go不同开发语言在进程、线程和协程的设计差异

Java/Python/Go不同开发语言在进程、线程和协程的设计差异 1. 进程、线程和协程上的差异1.1 进程、线程、协程的定义1.2 进程、线程、协程的差异1.3 进程、线程、协程的内存成本1.4 进程、线程、协程的切换成本 2. 线程、协程之间的通信和协作方式2.1 python如何实现线程通信&a…

websocket服务端本地部署

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

栈--顺序栈的基本操作(对小白友好)

文章目录 栈的基本操作栈的定义栈的初始化栈的判空进栈出栈读取栈顶元素销毁栈全部源码 栈的基本操作 以下代码中,默认初始化的top为-1。 栈的定义 #define MaxSize 50 //定义栈中元素最大个数typedef struct {int data[MaxSize]; //存放栈中元素int top; //栈顶指针…

C++多态语法剖析

C的三大特性:封装,继承,多态。这三个特性中,我认为最难理解和最难学习的就是多态。这篇文章总结下多态的一些概念和语法。 多态顾名思义就是多种形态的表现手法。也就是让我们的功能能够因人而异的变化。 一.多态的两种类型 多态…

TortoiseSVN源码安装与迁移全攻略

一、前言 随着版本控制系统的普及,越来越多的开发者和团队开始使用SVN(Subversion)来管理代码。本文将详细介绍TortoiseSVN的源码安装及迁移过程,帮助您轻松掌握这一版本控制工具。 二、TortoiseSVN源码安装 依赖环境安装&…

【C语言进阶】预处理详解

引言 对预处理的相关知识进行详细的介绍 ✨ 猪巴戒:个人主页✨ 所属专栏:《C语言进阶》 🎈跟着猪巴戒,一起学习C语言🎈 目录 引言 预定义符号 #define定义常量 #define定义宏 带有副作用的宏参数 宏替换的规则 …

京东数据分析:2023年度厨房小电行业分析(厨房小电市场未来发展趋势)

酸奶机、煮蛋器、豆浆机、空气炸锅、养生壶……这些外观小巧、功能丰富、价格相对便宜的小家电,在过去几年间一度掀起一股“种草”风潮,很多年轻人认为这是精致“懒人生活”的代名词。 而在后疫情时代,人们的各类消费明显渐趋理性&#xff0…

深入理解多线程编程和 JVM 内存模型

目录 一、什么是多线程编程 二、JVM介绍 三、 JVM 内存模型 一、什么是多线程编程 多线程编程是一种编程方式,它允许程序在同一时间内执行多个线程或任务。线程是程序执行的最小单位,多线程编程可以将任务拆分为多个线程,每个线程独立执行…

如何查找设备的公共IP地址?这里提供三种方法

每个以某种方式连接到互联网的设备都有一个IP地址。这是你的设备使用的唯一标识符,可以被互联网或本地网络上的其他设备识别。 如果你使用的是直接连接到互联网的智能手机或平板电脑等设备,你的公共IP地址将由你的移动运营商直接分配。 另一方面,如果你使用的是连接到本地…

C++: vector

目录 1.vector的介绍 2.vector常用的接口 1.vector构造 2.迭代器iterator的使用 3.vector空间增长 4.vector的增删改查 3.vector模拟实现 如果在reverse时使用memcpy会怎么样? 1.vector的介绍 C中的vector是一个动态数组容器,可以存储任意类型的…

数据库安装

数据库相关概念 在这一部分,我们先来讲解三个概念:数据库、数据库管理系统、SQL。 数据库存储数据的仓库,数据是有组织的进行存储DataBase(DB)数据库管 理系统操纵和管理数据库的大型软件DataBase Management System…