[英]pixel encoding using PIL
我有一个天真的问题,但经过漫长的一天后,我仍然无法得到答案。 我目前正在使用 PIL 加载我的 png 图像,它运行良好。 但是,我的一些 png 图像是每像素 16 位。 我拼命地试图查询这些信息,但我无法使用 PIL 获取它。 事实上,如果我只是使用file
系统二进制文件,它就可以工作。
$ 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
。 根据文档PIL 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>
如果你真的,真的卡住了,不能/不会安装OpenCV或pyvips ,你有几个ImageMagick 的选择......
您可以使用以下方法将 3 个 RGB 通道(每个 16 位)减少到 3 个 RGB 通道(每个 8 位):
magick input.png PNG24:output.png # then open "output.png" with PIL
或者,您可以将 3 个 RGB 通道分成 3 个单独的 16 位文件,并使用PIL/Pillow分别处理它们:
magick input.png -separate channel-%d.png
您将在channel-0.png
获得红色通道作为 16 位图像,您可以使用PIL/Pillow打开它,绿色channel-1.png
为channel-1.png
,蓝色channel-2.png
为channel-2.png
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.