在python中将图像缝合在一起 [英] stitch images together in python

查看:335
本文介绍了在python中将图像缝合在一起的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将约50张图像(所有图像尺寸均为287x287)拼接在一起.具体来说,最上面一行应该有25张图片,最下面一行应该是25张图片,并且每两张图片之间也要有很小的距离.

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:

第一个问题是,文件夹中有25张图像的名称为'prefix-70',...,'prefix-94',而其他文件夹中的25张图像的名称均为'prefix-70',...,'prefix-94'.我不知道如何在Python中做到无冲突.

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)

这篇关于在python中将图像缝合在一起的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆