Преобразование изображения PIL из режима I в режим P - PullRequest
3 голосов
/ 21 октября 2019

У меня есть это изображение глубины:

enter image description here

, которое я загружаю с помощью PIL:

depth_image = Image.open('stereo.png')

Если я печатаюрежим изображения показывает режим I, то есть (32-bit signed integer pixels) в соответствии с документацией.

Это правильно, поскольку значения изображения варьируются от 0 до 255. Я хотел бы раскрасить это изображение глубины дляулучшена визуализация, поэтому я попытался преобразовать его в режим P с палитрой, например:

depth_image = depth_image.convert('P', palette=custom_palette)
depth_image.save("colorized.png")

Но в результате получается черно-белое изображение, подобное этому:

enter image description here

Я уверен, что палитра в порядке, поскольку в одном массиве 256 цветов в формате int.

Я пытался преобразовать его в RGBперед сохранением, как:

depth_image = depth_image.convert('RGB')

Также я попытался добавить палитру потом как:

depth_image = depth_image.putpalette(custom_palette)

И если я пытаюсь сохранить его без преобразования в RGB, я получаю:

    depth_image.save("here.png")
AttributeError: 'NoneType' object has no attribute 'save'

Пока что я попытаюсь преобразовать изображение в массив, а затем отобразить цвета оттуда, но мне было интересно, что я упускал из виду. нг PIL. Я просматривал документацию, но не нашел ничего относительно преобразования I в P.

1 Ответ

1 голос
/ 22 октября 2019

Я думаю, что проблема в том, что ваши значения масштабируются до диапазона 0..65535, а не 0..255.

Если вы сделаете это, вы увидите, что значения больше, чем вы ожидали:

i = Image.open('depth.png') 
n = np.array(i) 

print(n.max(),n.mean())
# prints 32257, 6437.173

Итак, я быстро попробовал:

n = (n/256).astype(np.uint8)
r = Image.fromarray(n)
r=r.convert('P') 
r.putpalette(custom_palette)     # I grabbed this from your pastebin

enter image description here

...