Python 基于PIL的像素编码

Python 基于PIL的像素编码,python,python-imaging-library,Python,Python Imaging Library,我有一个天真的问题,但经过漫长的一天,我仍然无法得到我的答案。 我目前正在使用PIL加载我的png图像,效果很好。然而,我的一些想法 图像为每像素16位。我拼命想查询这些信息,但我无法使用PIL获得它。事实上,如果我只是简单地使用二进制文件系统,它就可以工作 $ file flower_16b.png flower_16b.png: PNG image data, 660 x 600, 16-bit/color RGB, non-interlaced 但是在我的python代码中: img

我有一个天真的问题,但经过漫长的一天,我仍然无法得到我的答案。 我目前正在使用PIL加载我的png图像,效果很好。然而,我的一些想法 图像为每像素16位。我拼命想查询这些信息,但我无法使用PIL获得它。事实上,如果我只是简单地使用二进制文件系统,它就可以工作

$ file flower_16b.png 
flower_16b.png: PNG image data, 660 x 600, 16-bit/color RGB, non-interlaced
但是在我的python代码中:

img = Image.open(filename, "r")
print(img.mode)
我得到RGB。按照文档中的RGB表示3x8位像素,真彩色,看起来像是图像已被浇铸。那么,是否存在使用PIL或其他python模块获取图像深度的方法

PIL/Pillow不支持这样的48位图像。一个选项可能是OpenCV,但请注意它是BGR而不是RGB:

import cv2

# Read with whatever bit depth is specified in the image file
BGR = cv2.imread('image.png', cv2.IMREAD_ANYDEPTH|cv2.IMREAD_ANYCOLOR)

# Check dtype and number of channels
print(BGR.dtype, BGR.shape)

dtype('uint16'), (768, 1024, 3)
另一种选择可能是pyvips,它的工作方式稍有不同,但有一些好的好处:

import pyvips

im = pyvips.Image.new_from_file('image.png', access="sequential")

print(im)
<pyvips.Image 1024x768 ushort, 3 bands, rgb16>
或者,您可以将3个RGB通道分离为3个单独的16位文件,并使用PIL/Pillow单独处理它们:

在channel-0.png中,红色通道为16位图像,可以用PIL/Pillow打开,绿色通道为channel-1.png,蓝色通道为channel-2。png

PIL/Pillow不是这样的48位图像。一个选项可能是OpenCV,但请注意它是BGR而不是RGB:

import cv2

# Read with whatever bit depth is specified in the image file
BGR = cv2.imread('image.png', cv2.IMREAD_ANYDEPTH|cv2.IMREAD_ANYCOLOR)

# Check dtype and number of channels
print(BGR.dtype, BGR.shape)

dtype('uint16'), (768, 1024, 3)
另一种选择可能是pyvips,它的工作方式稍有不同,但有一些好的好处:

import pyvips

im = pyvips.Image.new_from_file('image.png', access="sequential")

print(im)
<pyvips.Image 1024x768 ushort, 3 bands, rgb16>
或者,您可以将3个RGB通道分离为3个单独的16位文件,并使用PIL/Pillow单独处理它们:


在channel-0.png中,红色通道为16位图像,可以用PIL/Pillow打开,绿色通道为channel-1.png,蓝色通道为channel-2.png

AFAIK唯一的16位是灰度,所以声称你得到的是RGB是没有意义的。你还没有说你为什么需要深度信息…@martineau我想OP是指Truecolor,它是3个通道,每个通道16位,即链接表中的48位。我正在处理推理问题。我的研究小组证明它只适用于8位像素的png,但正如你所说,它是没有意义的,因为标准颜色是8位像素。AFAIK唯一的16位是灰度,所以声称你得到的是RGB是没有意义的。你还没有说你为什么需要深度信息…@martineau我想OP是指Truecolor,它是3个通道,每个通道16位,即链接表中的48位。我正在处理推理问题。我的研究团队证明它只适用于8位像素的png,但正如你所说,这是没有意义的,因为标准颜色是8位像素。要将BGR转换为RGB,只需执行RGB=BGR[…,::-1]@马克非常感谢你的建议!要将BGR转换为RGB,只需执行RGB=BGR[…,:-1]@马克非常感谢您的建议!