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.mzph.cn/news/641856.shtml

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

相关文章

JoyRL Actor-Critic算法

策略梯度算法的缺点 这里策略梯度算法特指蒙特卡洛策略梯度算法,即 REINFORCE 算法。 相比于 DQN 之类的基于价值的算法,策略梯度算法有以下优点。 适配连续动作空间。在将策略函数设计的时候我们已经展开过,这里不再赘述。适配随机策略。由…

MATLAB数据处理: 每种样本类型随机抽样

tn5;% 每种类型随机抽样数 indextrain[];% 训练样本序号集 for i1:typenumber index301 find(typemat i); n2length(index301); index302randperm(n2); index401index301(index302(1:tn)); indextrain[indextrain; index401]; end 该代码可以对大样…

java进阶

文章目录 一、Java进阶1.注解(Annotation)a.内置注解b.元注解c.自定义注解 2.对象克隆3. Java设计模式(Java design patterns)a.软件设计模式概念b.建模语言(UML)c.面向对象设计原则d.设计模式 总结面向对象…

项目工程下载与XML配置文件下载:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十)

XPCIE1032H功能简介 XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。 XPCIE1032H集成了强大的运动控制功能,结合MotionRT7运动…

深度解析Oladance、韶音、南卡开放式耳机:选购指南与天花板级推荐

​随着开放式耳机在日常生活中越来越受欢迎,许多品牌纷纷降低材料品质以迎合大众需求,导致耳机的性能和音质严重下滑。这让消费者在选择优质开放式耳机时感到困惑。作为一名专业的耳机评测人员,我近期对多款热门开放式耳机进行了深入的测评&a…

Leetcode—92.反转链表II【中等】

2023每日刷题(八十一) Leetcode—92.反转链表II 算法思想 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), n…

kubernetes Pod 异常排查步骤

kubernetes Pod 异常排查步骤 详细排查图查看容器状态查看容器列表容器未启动成功排查容器启动成功排查pod状态对应原因 详细排查图 查看容器状态 查看容器列表 查看容器列表,最好在后面跟上命名空间,不跟上查询出来是默认的 kubectl get pods -n kubesphere-system单独查看某…

【Spring 篇】深入探讨MyBatis映射文件中的动态SQL

MyBatis,这个名字在Java开发者的世界中犹如一道光芒,照亮着持久层操作的道路。而在MyBatis的映射文件中,动态SQL则是一个让人爱-hate的存在。有时候,你感叹它的灵活性,有时候,你可能会为它的繁琐而头痛。但…

windows 11安装VMware 17 ,VMware安装Ubuntu 20.4

一、下载安装激活VMware 17 下载与激活:Vmware 17 下载地址、最新激活码 2024 _ 注意:安装路径自己选择,路径中尽可能避免中文或空格 二、下载Ubuntu 镜像 下载镜像地址:清华大学开源软件镜像站 点开下载镜像地址,找…

中科星图——Sentinel-2_MSI_L2A数据集

数据名称: Sentinel-2_MSI_L2A 数据来源: Copernicus 时空范围: 2022年10月-2023年1月 空间范围: 全国 数据简介: 哨兵2号(Sentinel-2)卫星是高分辨率多光谱成像卫星,携带一…

分布式一致性算法---Raft初探

读Raft论文也有一段时间了,但是自己总是以目前并没有完全掌握为由拖着这篇博客。今天先以目前的理解程度(做了6.824的lab2A和lab2B)对这篇论文做一个初步总结,之后有了更深入的理解之后再进行迭代,关于本文有任何疑问欢…

苹果眼镜(Vision Pro)的开发者指南(3)-【3D UI SwiftUI和RealityKit】介绍

为了更深入地理解SwiftUI和RealityKit,建议你参加专注于SwiftUI场景类型的系列会议。这些会议将帮助你掌握如何在窗口、卷和空间中构建出色的用户界面。同时,了解Model 3D API将为你提供更多关于如何为应用添加深度和维度的知识。此外,通过学习RealityView渲染3D内容,你将能…

【Java数据结构 -- 队列:队列有关面试oj算法题】

队列、循环队列、用队列模拟栈、用栈模拟队列 1.队列1.1 什么是队列1.2 创建队列1.3 队列是否为空和获取队头元素 empty()peek()1.4 入队offer()1.5 出队(头删)poll() 2. 循环队列2.1 创建循环队列2.2 判断是否为空isEmpty()和满isFull()2.3 入队enQueue…

JAVA的面试题四

1.电商行业特点 (1)分布式: ①垂直拆分:根据功能模块进行拆分 ②水平拆分:根据业务层级进行拆分 (2)高并发: 用户单位时间内访问服务器数量,是电商行业中面临的主要问题 (3)集群&…

python数据分析——numpy基本用法

numpy数据类型 在NumPy中,有多种数据类型可用于表示数组的元素。以下是一些常见的NumPy数据类型: int - 整数类型,如int8、int16、int32、int64等。uint -无符号整数类型,如uint8、uint16、uint32、uint64等。float -浮点数类型…

PaddleNLP 如何打包成Windows环境可执行的exe?

当我们使用paddleNLP完成业务开发后,需要将PaddleNLP打包成在Windows操作系统上可执行的exe程序。操作流程: 1.环境准备: python环境:3.7.4 2.安装Pyinstaller pip install pyinstaller 3.目录结构,main.py为可执…

测试开发基础 | 计算机网络篇(二):物理层与数据链路层

【摘要】 计算机网络知识是自动化测试等技术基础,也是测试面试必考题目。霍格沃兹测试学院特别策划了本系列文章,将带大家一步步夯实计算机网络的基础知识。由于物理层知识在互联网软件研发工作中用到的并不多,所以可以仅做一个简单的了解。物…

jQuery语法知识(DOM操作)

一、class 属性: .addClass()、.hasClass().removeClass()、.toggleClass() 二、DOM 插入并包裹现有内容 1、.wrap( wrappingElement): 在每个配的元素外层包上一个html元素。 …

Buildroot显示kernel logo

buildroot开机时DSI屏幕变成跟uart一样输出log,现在想显示logo 1、failed to show loader logo [ 2.467479] mmcblk1: p1 p2 p3 p4 p5 p6 p7 p8 p9 [ 2.468827] rockchip-drm display-subsystem: cant not find any loader display [ 2.468859] rockc…

Windows Service 2008 r2的安装

创建虚拟机–(操作非常简单,跟着图片的数据下一步即可) 选择自己要安装的虚拟机版本 在这里可以更改虚拟机存放的位置 这里的40个G并不会马上占用,当虚拟机里的东西到40个G的大小就不会再存储东西了 选择和自己虚拟…