Создание очень больших изображений с помощью Библиотеки изображений Python

Я пытаюсь создать очень большое изображение (25000x25000) путем вставки вместе многих меньших изображений. По вызову Image.new () с такими большими размерами, Python исчерпывает память, и я получаю MemoryError.

Существует ли способ выписать изображение как это инкрементно, не имея всего этого резидентный объект в RAM?

Править: Использование ImageMagick montage команда, кажется возможным создать произвольно измеренные изображения. Похоже, что это не пытается загрузить заключительное изображение в RAM (это использует очень мало памяти во время процесса), а скорее потоковая передача его к диску, который идеален.

13
задан meatvest 21 January 2010 в 14:48
поделиться

6 ответов

Проверьте, работает ли ваша система из виртуальной памяти, когда вы это сделаете. Если это так, попробуйте добавить больше. Таким образом, вы разгружаете всю проблему на подсистему виртуальной памяти, что может быть быстрее.

0
ответ дан 2 December 2019 в 01:57
поделиться

Mayby Вы можете попробовать привязки Oiio Python, созданную одним из студентов GSOC? Сам OpenImageio можно прочитать большие изображения, используя небольшую память - но я не использовал его самостоятельно

OIIO: http://openimageio.org Как использовать привязки Python: http://openimageio.org/wiki/index.php?title=python_bindings

Есть также небольшой скрипт под названием «Isticher», который делает то, что вы хотите (по крайней мере, я думаю, так)

0
ответ дан 2 December 2019 в 01:57
поделиться

Вы можете попытаться использовать GDAL библиотеку. Он обеспечивает привязки к Python. Вот комбинированные Учебное пособие Представляем, как читать и писать изображения с помощью APIS C ++, C и Python В зависимости от операций GDAL и используемых функций GDAL может обрабатывать очень большие изображения и обрабатывать изображения, которые слишком велики, которые будут проходить в RAM.

3
ответ дан 2 December 2019 в 01:57
поделиться

Используйте numpy.memp и модуль PNG.

-1
ответ дан 2 December 2019 в 01:57
поделиться

Лично я использую Platinfo для обнаружения базовой платформы.

>>> from platinfo import PlatInfo
>>> pi = PlatInfo()
>>> pi.os
'win64'
>>> pi.arch
'x64'
>>> pi.name()
'win64-x64'

Для 32-битных, pi.name () возвращается Win32-X86 .

-121--1213121-

Это просто вопрос понимания формата двоичного файла. Сжатые форматы будут сложнее.

Предполагая, что вы хотите растровое изображение / DIB, этот код:

#incremental_write_bmp.py
import binascii

data='''
0h -2 -42 4D -"BM" -Magic Number (unsigned integer 66, 77)
2h -4 -46 00 00 00 -70 Bytes -Size of the BMP file
6h -2 -00 00 -Unused -Application Specific
8h -2 -00 00 -Unused -Application Specific
Ah -4 -36 00 00 00 -54 bytes -The offset where the bitmap data (pixels) can be found.
Eh -4 -28 00 00 00 -40 bytes -The number of bytes in the header (from this point).
12h -4 -02 00 00 00 -2 pixels -The width of the bitmap in pixels
16h -4 -02 00 00 00 -2 pixels -The height of the bitmap in pixels
1Ah -2 -01 00 -1 plane -Number of color planes being used.
1Ch -2 -18 00 -24 bits -The number of bits/pixel.
1Eh -4 -00 00 00 00 -0 -BI_RGB, No compression used
22h -4 -10 00 00 00 -16 bytes -The size of the raw BMP data (after this header)
26h -4 -13 0B 00 00 -2,835 pixels/meter -The horizontal resolution of the image
2Ah -4 -13 0B 00 00 -2,835 pixels/meter -The vertical resolution of the image
2Eh -4 -00 00 00 00 -0 colors -Number of colors in the palette
32h -4 -00 00 00 00 -0 important colors -Means all colors are important
36h -3 -00 00 FF -0 0 255 -Red, Pixel (1,0)
39h -3 -FF FF FF -255 255 255 -White, Pixel (1,1)
3Ch -2 -00 00 -0 0 -Padding for 4 byte alignment (Could be a value other than zero)
3Eh -3 -FF 00 00 -255 0 0 -Blue, Pixel (0,0)
41h -3 -00 FF 00 -0 255 0 -Green, Pixel (0,1)
44h -2 -00 00 -0 0 -Padding for 4 byte alignment (Could be a value other than zero)
'''.strip().split('\n')

open('test.bmp','wb')
for l in data:
    b = l.split('-')[2].strip()
    d = ''.join(b.split())
    x = binascii.a2b_hex(d)
    # this re-opens the file and appends each iteration
    open('test.bmp','ab').write(x)

... Постепенно напишу пример 2x2 растровое изображение здесь . Теперь это просто вопрос установки заголовков до нужного размера, и чтение (а иногда и повторное чтение) ваших плиток в правильном порядке. Я попробовал это с очень большим файлом и не видел шип памяти Python. Я предполагаю, что ОС может присоединиться к файлу, не прочитав все это.

2
ответ дан 2 December 2019 в 01:57
поделиться

Не слишком удивительно, у вас заканчивается память; Это изображение займет 2GIG в памяти и в зависимости от системы, которую вы используете, ваша ОС, возможно, не сможет выделить достаточно виртуальную память для Python, чтобы запустить ее, независимо от вашей фактической оперативной памяти.

Вы определенно приходите надо написать его постепенно. Если вы используете формат RAW, вы, вероятно, можете сделать это на ряд изображений, если они все одинаковы измерений. Тогда вы можете объединить файлы, в противном случае вам придется быть немного более осторожным с тем, как вы кодируете данные.

2
ответ дан 2 December 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: