pil(枕头)图像中的通道数

Eyp*_*ros 7 python python-imaging-library

我正在尝试找到一种方法来使用Pillow获取图像的通道数。这看似微不足道,但我找不到(简单答案)。

我知道我可以以较小的开销来解决它(有2种可能性):

  • 转换为numpy并检查 array.shape
  • 检查image.size[0]*image.size[1]反对len(image.getdata())

因此,我对寻找可行的解决方案并不是很感兴趣,而是希望使用枕头来完成此工作。

我使用的代码很简单:

from PIL import Image

image = Image.open(image_path)
image.size  # <- this gives the size of the image but not the channel as in numpy.
Run Code Online (Sandbox Code Playgroud)

(609,439)

我还发现此方法受此答案的启发(当然,这也导入了开销):

num_channel = len(image.split())
Run Code Online (Sandbox Code Playgroud)

在我看来,我真的找不到这个简单的答案。

Eyp*_*ros 7

我决定回答我自己的问题(尽管我基本上会总结@cryptonome的评论)。

好吧,关于PIL,我得到的选择是:

  • image.mode:返回包含读取数据模式的str。典型值是"RGB""L"分别用于RGB和灰度图像。模式在这里介绍。
  • im2.info:返回包含有关图片的各种信息的字典。这是特定于图像格式的。对于JPG图像,例如它(可能)包含键字段: dpijfifjfif_densityexif等有关的更多信息JPG图片可以找到这里
  • image.getbands():返回一个元组(甚至是一个1元素),其中包含数据中存在的所有不同通道。对于典型的RGB图像将为('R', 'G', 'B'),对于典型的灰度图像将为('L',)

因此,从上述在我看来更简洁的方法判断。将比较image.mode针对LRGB字符串找到,如果一个图像是灰度或不,或者如果信道的数量(如在这个问题)是最主要的问题则一个简单的len(image.getbands())会做的工作。

通常,它len(image.mode)会与之吻合,len(image.getbands())并且可以在其位置使用,但由于至少有一种模式YCbCr包含5个字符,但仅包含3个通道(3x8位像素,彩色视频格式),因此使用起来更安全len(image.getbands())