Как загрузить 16-битное / канальное изображение RGB (A) с PIL? - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь загрузить 16-битное цветное изображение RGBA с помощью PIL.

Я скачал изображение pnggrad16rgba.png по следующей ссылке: https://www.fnordware.com/superpng/samples.html enter image description here Я проверил, что он действительно имеет 16 бит на цветовой канал пикселя:

screenshot of file properties in Windows Explorer

Но потом, когда я пытаюсь загрузить данные в PIL, Я получаю uint8 данные:

>>> from PIL import Image
>>> import numpy
>>> im = Image.open("D:/pnggrad16rgba.png")
>>> arr = numpy.array(im)
>>> arr.dtype
dtype('uint8')
>>> arr[0, 0]
array([  0,   0, 255, 255], dtype=uint8)

Есть ли способ получить доступ к 16-битным данным, не понижая их до uint8 с PIL?

Если нет, какая другая библиотека может справиться с этим?

1 Ответ

3 голосов
/ 21 января 2020

PIL не поддерживает многоканальные 16-битные / канальные изображения - см. документацию . Я бы посоветовал вам использовать OpenCV с флагом cv2.IMREAD_UNCHANGED следующим образом:

import cv2                                                                                               

# Load image as 16-bits per channel, 4 channels
BGRA = cv2.imread('pnggrad16rgba.png', cv2.IMREAD_UNCHANGED) 

# Check channels and depth
print(BGRA.dtype, BGRA.shape)                                                                                                
dtype('uint16')
(600, 600, 4)

Имейте в виду, что ваше изображение будет в BGRA порядке, а не RGBA, потому что OpenCV - это ... ну, OpenCV .

Если вам нужно, вы можете перейти от BGRA к RGBA, используя

RGBA = cv2.cvtColor(BGRA, cv2.COLOR_BGRA2RGBA)
...