【问题标题】:How to load a 16-bits/channel RGB(A) image with PIL?如何使用 PIL 加载 16 位/通道 RGB(A) 图像?
【发布时间】:2020-05-07 05:55:35
【问题描述】:

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

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

但是当我尝试在 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 位数据而不用 PIL 向下转换为 uint8

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

【问题讨论】:

  • 我想 Pil 会原生支持各种位,请参阅文档。但是,与此同时,您是否尝试过在数组创建期间设置数据类型,例如 arr = numpy.array(im, dtype=np.uint16) ?

标签: python numpy python-imaging-library


【解决方案1】:

PIL 不支持多通道 16 位/通道图像 - 请参阅 documentation。我建议您将 OpenCVcv2.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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2018-10-19
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多