Je veux fusionner plusieurs images en une seule image horizontalement. J'ai essayé de fusionner des images via un code donné mais cela donne une image blanche? Pour fusionner des images, j'ai essayé PIL.

Input1

Input2

Input3

image de sortie

import sys
from PIL import Image


def append_images(images,bg_color=(255,255,255), aligment='center'):

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


    new_width = sum(widths)
    new_height = max(heights)


    new_im = Image.new('RGB', (new_width, new_height), color=bg_color)

    offset = 0
    for im in images:
        y = 0
        if aligment == 'center':
            y = int((new_height - im.size[1])/2)
        elif aligment == 'bottom':
            y = new_height - im.size[1]
        new_im.paste(im, (offset, y))
        offset += im.size[0]


    return new_im
date=input("Enter Date:")
l=['1.jpg','2.jpg','3.jpg']


images = map(Image.open,l)
combo_2 = append_images(images, aligment='center')
combo_2.save('combo_2.jpg')
0
stock_code 17 mars 2019 à 17:13

2 réponses

Meilleure réponse

Je préfère travailler avec le combo OpenCV&Numpy. Cela signifie travailler avec des tableaux. Le code ci-dessous prend simplement la première image comme point de départ - Hauteur. Toute image que vous y ajouterez sera empilée horizontalement en fonction de la hauteur. Cela signifie que l'image ajoutée sera redimensionnée par la hauteur du montage, puis empilée horizontalement au montage.

Code de travail

import cv2
import numpy as np

image1 = cv2.imread("img1.jpg")[:,:,:3]
image2 = cv2.imread("img2.jpg")[:,:,:3]

class Montage(object):
    def __init__(self,initial_image):
        self.montage = initial_image
        self.x,self.y = self.montage.shape[:2]

    def append(self,image):
        image = image[:,:,:3]
        x,y = image.shape[0:2]
        new_image = cv2.resize(image,(int(y*float(self.x)/x),self.x))
        self.montage = np.hstack((self.montage,new_image))
    def show(self):
        cv2.imshow('montage',self.montage)
        cv2.waitKey()
        cv2.destroyAllWindows()

Tout d'abord, vous initialisez la classe avec la première image qui définira HEIGHT. Donc si vous voulez une hauteur différente, passez dans la classe image redimensionnée. Après cela, vous pouvez ajouter horizontalement l'image

Utilisation

>>> m = Montage(image1)
>>> m.append(image2)
>>> m.show()

Résultat dans votre cas : entrez la description de l'image ici


Mais généralement, il peut fonctionner avec des tailles totalement différentes

Image 1

enter image description here

Image 2

enter image description here

Montage

enter image description here

1
Martin 17 mars 2019 à 16:10

Remplacez votre ligne:

images = map(Image.open,l)

Avec:

images = [ Image.open(im) for im in l]

Et tout fonctionne bien.

0
Mark Setchell 17 mars 2019 à 18:18