Python实现多张图片横向与纵向拼接脚本
本文介绍利用Python的PIL库实现多张图片的自动化拼接。针对卷积神经网络实验结果整理需求,分别演示了单行横向拼接、多行纵向拼接以及二维网格(如2x5)的组合方法。通过调整UNIT_SIZE与目标尺寸参数,可灵活生成指定规格的拼接图像,适用于论文排版与数据集可视化。
近期在撰写关于卷积神经网络的学术论文时,涉及大量实验结果的可视化整理。以往使用美图秀秀进行手动拼接不仅操作繁琐、重复劳动多,且最终效果难以保证统一。为此,我编写了一个Python脚本以自动化处理图像拼接任务,下面通过一个具体示例展示其实现过程。

横向拼接
首先,我们需要将同一类别的多张变形图片水平排列成一行。具体实现代码如下:
import os
from PIL import Image
UNIT_SIZE = 229 # 单个图像的大小为229*229
TARGET_WIDTH = 6 * UNIT_SIZE # 拼接完后的横向长度为6*229
path = "C:/Users/zm/Desktop/FinalResult/Other-Reconstruction/2"
images = [] # 先存储所有的图像的名称
for root, dirs, files in os.walk(path):
for f in files :
images.append(f)
for i in range(len(images)/6): # 6个图像为一组
imagefile = []
j = 0
for j in range(6):
imagefile.append(Image.open(path+'/'+images[i*6+j]))
target = Image.new('RGB', (TARGET_WIDTH, UNIT_SIZE))
left = 0
right = UNIT_SIZE
for image in imagefile:
target.paste(image, (left, 0, right, UNIT_SIZE))# 将image复制到target的指定位置中
left += UNIT_SIZE # left是左上角的横坐标,依次递增
right += UNIT_SIZE # right是右下的横坐标,依次递增
quality_value = 100 # quality来指定生成图片的质量,范围是0~100
target.save(path+'/result/'+os.path.splitext(images[i*6+j])[0]+'.jpg', quality = quality_value)
imagefile = []
纵向拼接
在将各类别图片分别拼接为包含六张子图的一行后,需将这些行进一步垂直堆叠。假设共有3种图像类型,则最终结果将呈现为3行的布局。
import os
from PIL import Image
UNIT_SIZE = 229 # 图像的高
TARGET_WIDTH = 6 * UNIT_SIZE # 一行有6个图像,那么是6*229那么宽
path = "C:/Users/zm/Desktop/FinalResult/Other-Reconstruction/2/result"
imagefile = []
for root, dirs, files in os.walk(path):
for f in files :
imagefile.append(Image.open(path+'/'+f))
target = Image.new('RGB', (TARGET_WIDTH, UNIT_SIZE*3)) # 最终拼接的图像的大小为(229*3) * (229*6)
left = 0
right = UNIT_SIZE
for image in imagefile:
target.paste(image, (0, left, TARGET_WIDTH, right))
left += UNIT_SIZE # 从上往下拼接,左上角的纵坐标递增
right += UNIT_SIZE #左下角的纵坐标也递增
quality_value = 100
target.save(path+'/result.jpg', quality = quality_value)
同时横向纵向拼接
本次需要处理的图片目录结构如下:左侧为图片所在的文件夹列表,每个文件夹内的图片示例如→_→右侧所示。目标是将这些数据拼接为2行5列(2*5)的网格图像。

实现该功能的脚本代码如下:
import os
from PIL import Image
UNIT_SIZE = 229 # the size of image
def pinjie(images,num):
target = Image.new('RGB', (UNIT_SIZE*5, UNIT_SIZE*2)) # result is 2*5
leftone = 0
lefttwo = 0
rightone = UNIT_SIZE
righttwo = UNIT_SIZE
for i in range(len(images)):
if(i%2==0):
target.paste(images[i], (leftone, 0, rightone, UNIT_SIZE))
leftone += UNIT_SIZE #第一行左上角右移
rightone += UNIT_SIZE #右下角右移
else:
target.paste(images[i], (lefttwo, UNIT_SIZE, righttwo, UNIT_SIZE*2))
lefttwo += UNIT_SIZE #第二行左上角右移
righttwo += UNIT_SIZE #右下角右移
quality_value = 100
target.save(path+dirlist[num]+'.jpg', quality = quality_value)
path = "C:/Users/laojbdao/Desktop/FinalResult/result4/different_distribution/"
dirlist = [] # all dir name
for root, dirs, files in os.walk(path):
for dir in dirs :
dirlist.append(dir)
num = 0
for dir in dirlist:
images = [] # images in each folder
for root, dirs, files in os.walk(path+dir): # traverse each folder
print path+dir+''
for file in files:
images.append(Image.open(path+dir+'/'+file))
pinjie(images,num)
num +=1
images = []

本文内容已收录至《python图片处理操作》专题,欢迎点击阅读更多相关技术文章。
以上就是本文的全部内容,希望能为各位的学习与工作提供便利,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









