stitch images together in python

自作多情 提交于 2019-12-22 18:15:18

问题


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.


回答1:


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)



回答2:


Install ImageMagick, then tell it where your two directories are.

#!/usr/bin/python3
##=========================================================
##  required  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
##
##  imagemagick.org/script/download.php
##
##=========================================================
##  libs  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

import subprocess as sp

##=========================================================
##  vars  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

offset  = 2                    ##  pixel gap between images
color  = '#000000'        ##  background color to fill gaps

dir1  = '/home/me/Pictures/topRow/'

dir2  = '/home/me/Pictures/bottomRow/'

##  note: windows dirs use double backslashes
##  'C:\\Users\\me\\Pictures\\topRow\\'
##=========================================================
##  script  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

row1args  = ['convert', '+smush', offset, '-background', color, dir1 + '*.png', 'row1.png']
row2args  = ['convert', '+smush', offset, '-background', color, dir2 + '*.png', 'row2.png']
merge  = ['convert', '-smush', offset, '-background', color, 'row*.png', 'merged.png']

##=========================================================
##  main  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sp .call(row1args)
sp .call(row2args)
sp .call(merge)

##=========================================================
##  eof  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


来源:https://stackoverflow.com/questions/42851896/stitch-images-together-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!