python图形缝隙填充,在python中将图像缝合在一起

作者分享了在Python中尝试将50张287x287尺寸的图片分为25行25列并保持间距的挑战,遇到的两个问题包括文件名格式不同和代码导致的列式输出。他们寻求如何正确排列图片,避免文件名冲突,并形成所需的网格布局。解决方案提供了一个代码示例,用于合并图片并按行组织。
摘要由CSDN通过智能技术生成

I am trying to stitch about 50 images(all in the same 287x287 size) together. Specifically, there should be 25 images on the top row and 25 images on the bottom row, and there also exists a small distance between each two images.

I met two difficulties during my attempts:

First problem is that there are 25 images in a folder with their name 'prefix-70',...,'prefix-94' while other 25 images in another folder with the same name 'prefix-70',...,'prefix-94'. I do not know how to them in Python without conflicts.

Second problem is that I wrote the following code to read one folder images to form a row but it outputs a column.

#!/usr/bin/python3.0

#encoding=utf-8

import numpy as np

from PIL import Image

import glob,os

if __name__=='__main__':

#prefix=input('Input the prefix of images:')

prefix = 'prefix'

files=glob.glob(prefix+'-*')

num=len(files)

filename_lens=[len(x) for x in files] #length of the files

min_len=min(filename_lens) #minimal length of filenames

max_len=max(filename_lens) #maximal length of filenames

if min_len==max_len:#the last number of each filename has the same length

files=sorted(files) #sort the files in ascending order

else:

index=[0 for x in range(num)]

for i in range(num):

filename=files[i]

start=filename.rfind('-')+1

end=filename.rfind('.')

file_no=int(filename[start:end])

index[i]=file_no

index=sorted(index)

files=[prefix+'-'+str(x)+'.png' for x in index]

print(files[0])

baseimg=Image.open(files[0])

sz=baseimg.size

basemat=np.atleast_2d(baseimg)

for i in range(1,num):

file=files[i]

im=Image.open(file)

im=im.resize(sz,Image.ANTIALIAS)

mat=np.atleast_2d(im)

print(file)

basemat=np.append(basemat,mat,axis=0)

final_img=Image.fromarray(basemat)

final_img.save('merged.png')

I guess i have got into a wrong way...

How can i stitch them properly? Any suggestion is appreciated.

解决方案

Try this (explanation in comments):

from PIL import Image

from os import listdir, path

space_between_row = 10

new_image_path = 'result.jpg'

im_dirs = ['images/1', 'images/2']

# get sorted list of images

im_path_list = [[path.join(p, f) for f in sorted(listdir(p))] for p in im_dirs]

# open images and calculate total widths and heights

im_list = []

total_width = 0

total_height = 0

for path_list in im_path_list:

images = list(map(Image.open, path_list))

widths, heights = zip(*(i.size for i in images))

total_width = max(total_width, sum(widths))

total_height += max(heights)

im_list.append(images)

# concat images

new_im = Image.new('RGB', (total_width, total_height))

y_offset = 0

for images in im_list:

x_offset = 0

max_height = 0

for im in images:

new_im.paste(im, (x_offset, y_offset))

x_offset += im.size[0]

max_height = max(im.size[1], max_height)

y_offset = y_offset + max_height + space_between_row

# show and save

new_im.show()

new_im.save(new_image_path)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值