Итак, для этого проекта я работаю, у меня есть 2 фотографии. Эти две фотографии нужно сшить вместе, один сверху и один снизу, а затем вы сможете увидеть всю картину. Любые идеи о том, какой модуль я должен использовать для этого?
Сшивание фотографий вместе
Ответ 1
библиотека изображений python будет есть эту задачу на завтрак.
См. tutorial, в частности раздел "Вырезание, склеивание и слияние изображений" для некоторой соответствующей помощи.
Для грубой схемы загрузите оба изображения с помощью Image.open
, узнайте, насколько большим будет выходное изображение с помощью атрибута size
и некоторого добавления, создайте выходное изображение с помощью Image.new
, а затем используйте paste
метод для прохождения двух исходных изображений.
Ответ 2
Здесь пример кода, использующий Pillow. Надеюсь, это поможет кому-то!
from PIL import Image
def merge_images(file1, file2):
"""Merge two images into one, displayed side by side
:param file1: path to first image file
:param file2: path to second image file
:return: the merged Image object
"""
image1 = Image.open(file1)
image2 = Image.open(file2)
(width1, height1) = image1.size
(width2, height2) = image2.size
result_width = width1 + width2
result_height = max(height1, height2)
result = Image.new('RGB', (result_width, result_height))
result.paste(im=image1, box=(0, 0))
result.paste(im=image2, box=(width1, 0))
return result
Ответ 3
Это некоторый код из компьютерного видения Яна Эрика Солема с книгой python; вы можете, возможно, отредактировать его, чтобы соответствовать вашим требованиям top/bottom
def stitchImages(im1,im2):
'''Takes 2 PIL Images and returns a new image that
appends the two images side-by-side. '''
# select the image with the fewest rows and fill in enough empty rows
rows1 = im1.shape[0]
rows2 = im2.shape[0]
if rows1 < rows2:
im1 = concatenate((im1,zeros((rows2-rows1,im1.shape[1]))), axis=0)
elif rows1 > rows2:
im2 = concatenate((im2,zeros((rows1-rows2,im2.shape[1]))), axis=0)
# if none of these cases they are equal, no filling needed.
return concatenate((im1,im2), axis=1)
Ответ 4
Используйте numpy.hstack()
или numpy.vstack()
зависимости от того, хотите ли вы, чтобы изображения располагались рядом или поверх друг друга. Вы можете преобразовать ваши изображения в массивы numpy, если они представляют собой какой-то странный формат, который numpy не принимает. Убедитесь, что вы установили dtype=np.uint8
если интерпретируете изображения как массивы с помощью np.asarray()
.
Ответ 5
Я сделал вертикальную строчку вот так - это тот же код из @d3ming
07: def merge_images(file1, file2):
08: """Merge two images into one vertical image
09: :param file1: path to first image file
10: :param file2: path to second image file
11: :return: the merged Image object
12: """
13: image1 = Image.open(file1)
14: image2 = Image.open(file2)
15:
16: (width1, height1) = image1.size
17: (width2, height2) = image2.size
18:
19: # result_width = width1 + width2
20: result_width = width1
21: # result_height = max(height1, height2)
22: result_height = height1 + height2
23:
24: print (height2)
25:
26: result = Image.new('RGB', (result_width, result_height))
27: result.paste(im=image1, box=(0, 0))
28: result.paste(im=image2, box=(0, height1))
29: return result
строка 19-22 - будет меняться только высота строчки
вставьте второе изображение в line-28 box=(width1, 0)
изменится на box=(0, height1)