赞
踩
我这里有如下两张图片,需要把他们叠加在一起,进行查看。这两张图片的大小都是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 Image
-
- t1 = datetime.datetime.now()
-
- #PIL图片保存为base64编码
- def PIL_base64(img, coding='utf-8'):
- img_format = img.format
- if 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()
-
最终识别拼接效果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。