Как я могу превратить 1 300 000 изображений в один файл массива?

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