Создать Vips Image из массива Numpy RGB для больших изображений - PullRequest
0 голосов
/ 28 ноября 2018

Я пытался вывести большое сгенерированное изображение с помощью PIL / Pillow, но оно ломалось, когда размеры изображений становились больше.

Так что, исходя из того, что я читаю на SO, я пытаюсь использовать Vips.

Мои сгенерированные данные являются массивом значений RGB.Я хочу преобразовать это в изображение в Vips, чтобы я мог сохранить его.Однако я не могу понять, как получить данные о пикселях в Vips.

import numpy
import gi
gi.require_version('Vips', '8.0')
from gi.repository import Vips

WIDTH=32768
HEIGHT=32768
UCHAR=Vips.BandFormat.UCHAR

# Create an RGB black image
black_space = numpy.zeros( ( WIDTH, HEIGHT, 3 ), dtype=numpy.uint8 )

# this doesn't work
vips_image = Vips.Image.new_from_memory( black_space, WIDTH, HEIGHT, bands=3, format=UCHAR )
vips_image.write_to_file( "space_32k.tiff" )

Конечно, это приводит к ошибке при создании изображения Vips:

Traceback (most recent call last):
  File "./bad_vips.py", line 14, in <module>
    vips_image = Vips.Image.new_from_memory( black_space, WIDTH, HEIGHT, bands=3, format=UCHAR )
TypeError: Item 0: expected int argument

Есть ли способтрансформировать массив NumPy так, чтобы он работал с Vips?

Я также пытался передать black_space.data, но потом получаю:

NotImplementedError: Item 0: multi-dimensional sub-views are not implemented

1 Ответ

0 голосов
/ 28 ноября 2018

Вы используете старый Python-интерфейс libvips - теперь есть более новый, который немного лучше:

https://github.com/libvips/pyvips

Документы здесь:

https://libvips.github.io/pyvips/

В есть раздел о связывании libvips и numpy.Ваш пример будет:

import numpy
import pyvips

WIDTH = 100
HEIGHT = 100

# Create an RGB black image
black_space = numpy.zeros((WIDTH, HEIGHT, 3), dtype=numpy.uint8)

# reshape into a huge linear array
linear = black_space.reshape(WIDTH * HEIGHT * 3)

vips_image = pyvips.Image.new_from_memory(linear.data, \
        WIDTH, HEIGHT, bands=3, format="uchar")

vips_image.write_to_file("huge.tif")

reshape бесплатен (я думаю), поэтому он должен быть эффективным.В репо также есть пример программы:

https://github.com/libvips/pyvips/blob/master/examples/pil-numpy-pyvips.py

...