Я пытаюсь горизонтально объединить некоторые изображения JPEG в Python.
проблема
У меня есть 3 изображения - каждое 148 x 95 - смотрите в приложении. Я просто сделал 3 копии одного и того же изображения - поэтому они одинаковые.
Моя попытка
Я пытаюсь соединить их по горизонтали, используя следующий код:
import sys
from PIL import Image
list_im = ['Test1.jpg','Test2.jpg','Test3.jpg']
new_im = Image.new('RGB', (444,95)) #creates a new empty image, RGB mode, and size 444 by 95
for elem in list_im:
for i in xrange(0,444,95):
im=Image.open(elem)
new_im.paste(im, (i,0))
new_im.save('test.jpg')
Однако при этом создается вывод, прикрепленный как test.jpg
.
Вопрос
Есть ли способ объединить эти изображения по горизонтали, чтобы на суб-изображениях в test.jpg не отображалось дополнительное частичное изображение?
Дополнительная информация
Я ищу способ объединить n изображений по горизонтали. Я хотел бы использовать этот код в целом, поэтому я бы предпочел:
- не жестко указывать размеры изображения, если это возможно
- укажите размеры одной строкой, чтобы их можно было легко изменить
for i in xrange(...)
в вашем коде есть? Неpaste
нужно заботиться о трех указанных вами файлах изображений?Ответы:
Вы можете сделать что-то вроде этого:
Test1.jpg
Test2.jpg
Test3.jpg
test.jpg
Вложенный для
for i in xrange(0,444,95):
- это вставка каждого изображения 5 раз с шагом 95 пикселей. Каждая итерация внешнего цикла вставляется поверх предыдущей.источник
x_offset = 0
- это расхождение между имидж-центрами? 2. Как изменится ваш подход к вертикальной конкатенации?x_offset
какleft
. Для вертикального объединения отслеживайтеy-offset
, илиtop
. Вместоsum(widths)
andmax(height)
, dosum(heights)
иmax(widths)
and используйте второй аргумент поля с двумя кортежами. увеличитьy_offset
наim.size[1]
.map
python3.6Я бы попробовал это:
Он должен работать, пока все изображения одного и того же типа (все RGB, все RGBA или все оттенки серого). Убедиться в этом с помощью еще нескольких строк кода не составит труда. Вот мои примеры изображений и результат:
Test1.jpg
Test2.jpg
Test3.jpg
Trifecta.jpg:
Trifecta_vertical.jpg
источник
min_shape =....
иimgs_comb....
изменить для вертикальной конкатенации? Не могли бы вы опубликовать это здесь как комментарий или в своем ответе?hstack
наvstack
.Image.resize
от PIL.min_shape
является кортежем (min_width, min_height), а затем(np.asarray( i.resize(min_shape) ) for i in imgs )
сжимает все изображения до этого размера. Фактически, этоmin_shape
может быть любое изображение(width,height)
, но имейте в виду, что увеличение изображений с низким разрешением сделает их размытыми!Изменить: ответ DTing более применим к вашему вопросу, поскольку он использует PIL, но я оставлю это, если вы хотите знать, как это сделать в numpy.
Вот решение numpy / matplotlib, которое должно работать для N изображений (только цветных изображений) любого размера / формы.
Вот пример использования:
источник
output = concat_images(output, ...
то , что я искал, когда я начал искать способ , чтобы сделать это. Спасибо.Основываясь на ответе DTing, я создал функцию, которую проще использовать:
Позволяет выбрать цвет фона и выравнивание изображения. Также легко сделать рекурсию:
источник
Вот функция, обобщающая предыдущие подходы, создающая сетку изображений в PIL:
Он сократит каждую строку и столбцы сетки до минимума. У вас может быть только строка, используя pil_grid (изображения), или только столбец, используя pil_grid (images, 1).
Одним из преимуществ использования PIL над решениями на основе массива numpy является то, что вы можете работать с изображениями, структурированными по-разному (например, изображениями в оттенках серого или изображениями на основе палитры).
Примеры результатов
pil_grid(dummy_images)
:pil_grid(dummy_images, 3)
:pil_grid(dummy_images, 1)
:источник
h_sizes, v_sizes = [0] * n_horiz, [0] * (n_images // n_horiz)
должна читаться:h_sizes, v_sizes = [0] * n_horiz, [0] * ((n_images // n_horiz) + (1 if n_images % n_horiz > 0 else 0))
Причина: Если ширина по горизонтали не делит количество изображений в целых числах, вам необходимо разместить дополнительную, если неполная строка.Если все изображения одинаковой высоты,
возможно, вы можете изменить размер изображений перед объединением следующим образом,
источник
Вот мое решение:
Для этих изображений:
Результаты будут выглядеть так:
источник
источник
Вывод
источник
Просто добавляем к уже предложенным решениям. Предполагается одинаковая высота, без изменения размера.
источник
мое решение было бы:
источник