如何使用 PIL 加载 16 位/通道 RGB(A) 图像?

PiR*_*iRK 2 python numpy python-imaging-library

我正在尝试使用 PIL 加载 16 位颜色 RGBA 图像。

我从以下链接下载了图像 pnggrad16rgba.png: https://www.fnordware.com/superpng/samples.html 在此输入图像描述 我检查了一下它确实有每像素 16 位的颜色通道:

Windows 资源管理器中文件属性的屏幕截图

但是当我尝试在 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)
Run Code Online (Sandbox Code Playgroud)

有没有办法访问 16 位数据而不将其向下转换为uint8with PIL

如果没有,还有什么其他库可以处理这个问题?

Mar*_*ell 5

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)
Run Code Online (Sandbox Code Playgroud)

请注意,您的图像将是有序的BGRA,而不是RGBA,因为OpenCV是......好吧,OpenCV

如果需要,您可以使用从 BGRA 到 RGBA

RGBA = cv2.cvtColor(BGRA, cv2.COLOR_BGRA2RGBA)
Run Code Online (Sandbox Code Playgroud)