Есть ли способ объединить несколько изображений в одно изображение в Python? - PullRequest
0 голосов
/ 17 марта 2019

Я хочу объединить несколько изображений в одно изображение по горизонтали.Я пытался объединить изображения с помощью данного кода, но он дает белое изображение?Для объединения изображений я попробовал PIL.

Вход1

Вход2

Вход3

выходное изображение

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')

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Замените вашу строку:

images = map(Image.open,l)

на:

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

и все работает нормально.

0 голосов
/ 17 марта 2019

Я предпочитаю работать с OpenCV & Numpy Combo. Это значит работать с массивами. Код ниже просто взять первое изображение в качестве отправной точки - Высота. Любое изображение, к которому вы добавите изображение, будет горизонтально расположено в зависимости от высоты. Это означает, что размер добавляемого изображения будет изменяться по высоте монтажа, а затем укладываться горизонтально для монтажа.

Рабочий код

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()

Во-первых, вы инициализируете класс первым изображением, которое определит ВЫСОТУ. Так что если вы хотите разной высоты, перейдите в класс с измененным размером изображения. После этого вы можете добавить изображение по горизонтали

Использование

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

Результат в вашем случае: enter image description here


Но обычно он может работать с разными размерами

Изображение 1

enter image description here

Изображение 2

enter image description here

Montage

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...