【Python】合并多张图片为一行/一列,且子图之间含有间隔

拼接图片方法网上博客有很多,没找到带有间隔(padding),自己改造了一下,效果如下,另外还加了列标题。需要的同学可以直接使用,改好路径,对应好行列大小,程序不难看懂。

在这里插入图片描述

import PIL.Image as Image
from PIL import ImageDraw, ImageFont

import os

IMAGES_PATH = 'D:/field/show_images_paper/ceshi/'  # 图片集地址
IMAGES_FORMAT = ['.jpg', '.JPG','.png']  # 图片格式
IMAGE_SIZE = 256  # 每张小图片的大小
IMAGE_ROW = 3  # 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_COLUMN = 6  # 图片间隔,也就是合并成一张图后,一共有几列
IMAGE_SAVE_PATH = 'D:/field/show_images_paper/results/final.jpg'  # 图片转换后的地址

# 获取图片集地址下的所有图片名称
image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if
               os.path.splitext(name)[1] == item]


#排序,这里需要根据自己的图片名称切割,得到数字
image_names.sort(key=lambda x:int(x.split(("."),2)[1]))
#image_names.sort(key=lambda x:int(x[:-4]))

# 简单的对于参数的设定和实际图片集的大小进行数量判断
if len(image_names) != IMAGE_ROW * IMAGE_COLUMN:
    raise ValueError("合成图片的参数和要求的数量不能匹配!")

padding=5
head_padding=50
# 定义图像拼接函数
def image_compose():
    to_image = Image.new('RGB',(IMAGE_COLUMN * IMAGE_SIZE+padding*(IMAGE_COLUMN-1), head_padding+IMAGE_ROW * IMAGE_SIZE+padding*(IMAGE_ROW-1)),'white' )  # 创建一个新图
    # 循环遍历,把每张图片按顺序粘贴到对应位置上
    for y in range(1, IMAGE_ROW + 1):
        for x in range(1, IMAGE_COLUMN + 1):
            from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize(
                (IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS)
            to_image.paste(from_image, ((x - 1) * IMAGE_SIZE+padding* (x - 1), head_padding+(y - 1) * IMAGE_SIZE+padding* (y - 1)))

    draw = ImageDraw.Draw(to_image)
    text = ['Original','Cat','Cat2','Cat3','Cat4','Original-Cat']
    text_offset = [80,90,90,90,90,50]
    font = ImageFont.truetype(r'C:\Windows\Fonts\timesbd.ttf', 32)

    for i in range(1, IMAGE_COLUMN + 1):
        draw.text((text_offset[i-1]+256*(i-1), 10), text[i-1], fill='#666', font=font)

    return to_image.save(IMAGE_SAVE_PATH)  # 保存新图


image_compose()  # 调用函数
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 答:下面是一个将某列值相同的行合并一行python示例:import pandas as pd# 创建一个数据框 df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C': np.random.randn(8), 'D': np.random.randn(8)})# 将某列值相同的行合并一行 df.groupby('A').sum() ### 回答2: 在Python中,可以通过使用pandas库来将某列值相同的行合并一行。下面以一个示例来说明: 假设我们有一个包含姓名、年龄和城市的数据集,现在我们希望将所有城市相同的行合并一行,并计算每个城市的平均年龄。 首先,我们需要导入pandas库: ```python import pandas as pd ``` 接下来,我们创建一个包含数据的DataFrame: ```python data = {'姓名': ['张三', '李四', '王五', '赵六', '小明', '小红'], '年龄': [21, 30, 25, 35, 28, 22], '城市': ['北京', '上海', '北京', '上海', '北京', '上海']} df = pd.DataFrame(data) ``` DataFrame的内容如下: ``` 姓名 年龄 城市 0 张三 21 北京 1 李四 30 上海 2 王五 25 北京 3 赵六 35 上海 4 小明 28 北京 5 小红 22 上海 ``` 使用`groupby`函数将城市相同的行分组,并使用`agg`函数计算每个分组的平均年龄: ```python result = df.groupby('城市').agg({'年龄': 'mean'}).reset_index() ``` `reset_index()`函数用于重新设置索引,得到的结果如下: ``` 城市 年龄 0 上海 29.0 1 北京 24.6 ``` 结果中的每一行代表一个城市和该城市的平均年龄。可以看到,上海的平均年龄为29岁,北京的平均年龄为24.6岁。 这样,我们就成功地将某列值相同的行合并一行,并计算了每个城市的平均年龄。 ### 回答3: 假设我们有如下的示例数据集: | 序号 | 名字 | 年龄 | 性别 | | --- | --- | --- | --- | | 1 | 小明 | 18 | 男 | | 2 | 小红 | 20 | 女 | | 3 | 小刚 | 18 | 男 | | 4 | 小丽 | 20 | 女 | 现在我们想将年龄相同的行合并一行。使用Python中的pandas库可以轻松完成这个任务。 首先,我们需要导入pandas库并读取数据集: ``` import pandas as pd data = pd.read_csv("data.csv") # 读取数据集 ``` 读取之后,我们可以使用`groupby`函数根据某一列进行分组,并使用`agg`函数对其他列应用聚合函数。在这个例子中,我们使用`agg`函数对"名字"和"性别"列应用`" ".join`函数来将相同年龄的行合并为一个字符串: ``` result = data.groupby("年龄").agg({"名字": " ".join, "性别": " ".join}).reset_index() ``` 最后,我们可以使用`reset_index`函数重置索引,并将结果保存为一个新的数据集: ``` result.to_csv("result.csv", index=False) # 保存结果数据集 ``` 运行以上代码后,我们得到了如下的结果数据集: | 年龄 | 名字 | 性别 | | --- | --- | --- | | 18 | 小明 小刚 | 男 男 | | 20 | 小红 小丽 | 女 女 | 可以看到,年龄相同的行已经被成功合并为了一行
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值