2017-03-17 3 views
2

Je suis en train d'assembler environ 50 images (toutes dans la même taille 287x287). Plus précisément, il devrait y avoir 25 images sur la rangée du haut et 25 images sur la rangée du bas, et il existe également une petite distance entre chaque image.assembler des images ensemble en python

j'ai rencontré deux difficultés lors de mes tentatives:

Le premier problème est qu'il ya 25 images dans un dossier avec leur nom 'prefix-70',...,'prefix-94' tandis que d'autres 25 images dans un autre dossier du même nom 'prefix-70',...,'prefix-94'. Je ne sais pas comment les faire en Python sans conflits.

Le deuxième problème est que j'ai écrit le code suivant pour lire un dossier images pour former une rangée, mais il sort une colonne.

#!/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') 

Je suppose que je suis entré dans une mauvaise façon ... Comment puis-je les assembler correctement? Toute suggestion est appréciée.

+1

Pour obtenir une ligne au lieu d'une colonne, il suffit de changer 'axe = 0' à' axe = 1'. – Junuxx

+0

Merci. Et comment pourrais-je faire une distance entre les images et comment construire deux rangs comme dit dans le premier problème? –

Répondre

4

Essayez cette (explication dans les commentaires):

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) 
+0

Un grand merci à vous, en tant que débutant, j'ai beaucoup appris de vous. J'ai encore une question, puisque toutes les images sont en fait un fond noir avec plusieurs points blancs, j'ai trouvé qu'il semble que les images sont étroitement cousues puisque le code ci-dessus sépare deux images par zone noire. Puis-je les séparer par zone blanche? –

+0

@fdafdsjflasdjlfas vous pouvez passer une option 'color' lors de la création de l'image de base' new_im = Image.new ('RGB', (total_width, total_height), color = (255, 255, 255)) '. C'est ce que tu veux dire? –

+0

Bien sûr, merci –

0

Installez ImageMagick, puis dites-lui où se trouvent vos deux répertoires.

#!/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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+0

Ce n'est pas vraiment une réponse à ce que l'OP a montré. – MKesper

+0

C'est comme ça que je le ferais en Python. ImageMagick est fait pour exactement cette raison, il est donc logique de l'utiliser. – Doyousketch2