Я работаю с 2D-массивами numpy с плавающей запятой и сохраняю их в виде файлов .png с высокой точностью (см. этот вопрос о том, как я пришел к этому). Для этого я использую плагин freeimage, как в этом связанном вопросе.
Это создает странное поведение, когда изображения переворачиваются (как влево-вправо, так и вверх-вниз), если они сохранены в 16-битном формате. Это происходит только для изображений RGB или RGBA, но не для изображений в оттенках серого. Вот пример кода:
from skimage import io, img_as_uint, img_as_ubyte
im = np.random.uniform(size=(256, 256))
im[:128, :128] = 1
im = img_as_ubyte(im)
io.use_plugin('freeimage')
io.imsave('test_1.png', im)
создает следующую картину:
когда я пытаюсь сохранить это в 16-битном формате, я получаю тот же результат (хотя и беру 99 КБ вместо 50, поэтому я знаю, что битовая глубина работает).
Теперь сделайте то же самое, что и для RGB-изображения:
im = np.random.uniform(size=(256, 256, 3))
im[:128, :128] = 1
im = img_as_ubyte(im)
io.use_plugin('freeimage')
io.imsave('test_1.png', im)
8-битный результат:
но делаю следующее
im = img_as_uint(im)
io.use_plugin('freeimage')
io.imsave('test_1.png', im)
дает мне
Это происходит, если массив также содержит альфа-уровень.
Это можно исправить, включив
im = np.fliplr(np.flipud(im))
перед сохранением. Однако мне кажется, что это довольно странное поведение и не очень желательно. Есть идеи, почему это происходит или так задумано? Насколько я мог видеть, это не задокументировано.