本代码只适合两个图片合并,如果出现三个图片合并,就将第三个图删除,先合并一次,然后再将图片加入,再合并一次
1. 问题背景
有的时候标签有多个,需要将两张或者是多张图象叠加在一起,成为以下情况
2. 解决思路
- 遍历文件夹中所有图片
- 寻找具有相同文件名(前多少字相同)的图片
- 使用Image读取,转化为Numpy格式,进行数值相加
- 将Numpy格式转化为Image格式,然后保存
- 删除原始合并图象
3. 代码
'''
Descripttion:
Result:
Author: Philo
Date: 2023-10-10 15:24:46
LastEditors: Philo
LastEditTime: 2023-10-10 21:36:05
'''
from PIL import Image
import os
import numpy as np
# 设置图片文件夹路径
folder_path = 'Your_flod'
# 获取文件夹中的所有图片文件名
image_names = os.listdir(folder_path)
# image_files.sort() # 确保文件按名称排序
def merge(first_img, second_img):
fir_np = np.array(first_img)
sec_np = np.array(second_img)
# print(np.unique(fir_np), np.unique(sec_np))
if len(fir_np.shape)==3:
fir_np = np.array(first_img)[:,:,0]
if len(sec_np.shape)==3:
sec_np = np.array(second_img)[:,:,0]
merge_np = fir_np + sec_np
merge_img = Image.fromarray(merge_np.astype("uint8"), mode="L")
return merge_img
current_name = image_names[0]
for next_name in image_names[1:]:
current_path = os.path.join(folder_path, current_name)
next_path = os.path.join(folder_path, next_name)
# 如果前一张图片为空或者当前图片名称的前..个字符与前一张不同,则跳过
if current_name[:18] == next_name[:18]:
# 打开前一张图片和当前图片
current_img = Image.open(current_path).convert('L')
next_img = Image.open(next_path).convert('L')
# 将两张图片进行数值相加
save_img = merge(current_img, next_img)
# 保存合并后的图片并删除当前图片
# save_img.save("result/"+current_name) # 解开注释,将合并图象单独拎出来看
save_img.save(current_path)
os.remove(next_path)
current_name = next_name
本代码只适合两个图片合并,如果出现三个图片合并,就将第三个图删除,先合并一次,然后再将图片加入,再合并一次