繁体   English   中英

使用 PIL 进行像素编码

[英]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>

如果你真的,真的卡住了,不能/不会安装OpenCVpyvips ,你有几个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.pngchannel-1.png ,蓝色channel-2.pngchannel-2.png

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM