#python-3.x #numpy
#python-3.x #numpy
Вопрос:
У меня около 1 300 000 изображений. Чтобы снизить затраты на ввод-вывод, я хочу создать один файл из всех изображений. Итак, файл должен быть (1300000, 256, 256, 3).
Я намеревался решить эту проблему numpy
, к сожалению, я не могу читать и записывать все изображения одновременно, потому что у меня всего 16 ГБ оперативной памяти.
Не могли бы вы предложить какой-нибудь способ эффективного решения этой проблемы?
Комментарии:
1. Есть ли на вашем компьютере сотни или гигабайты оперативной памяти? Если нет, то вам будет сложно загрузить это в память.
2. Спрашивать об этом все равно, что спрашивать: «Как я могу прыгнуть на высоту 15 этажей? Ничего страшного, если для этого мне придется использовать кроссовки другой марки. »
3. Вы могли бы использовать
np.memmap
для создания такого массива, он будет отображаться на дисковый файл объемом в сотни ГБ, но он должен работать (при условии, что вы используете 64-разрядную систему). Вы можете записывать изображения по одному, и когда вы закончите, вся информация должна быть в этом огромном файле. Однако я не уверен, что это лучший подход к проблеме, которую вы пытаетесь решить.
Ответ №1:
Вам нужно будет объединять изображения по одному за раз. Вот возможное решение с использованием PIL / Pillow
import sys
import glob
from PIL import Image
def concat_two_images(image1, image2):
images = map(Image.open, [image1, image2])
widths, heights = zip(*(i.size for i in images))
total_width = sum(widths)
max_height = max(heights)
new_im = Image.new('RGB', (total_width, max_height))
x_offset = 0
for im in images:
new_im.paste(im, (x_offset,0))
x_offset = im.size[0]
new_im.save('concat_image.jpg')
return 'concat_image.jpg'
first_concat_image = concat_two_images('test_image1.jpg', 'test_image2.jpg')
for image in glob.glob('*.jpg'):
# TODO - Add code to skip the first 2 images
new_image = concat_two_images(first_concat_image, image)