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

时间:2018-10-24 07:14:51

标签: 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.
  

(609,439)

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

num_channel = len(image.split())

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

1 个答案:

答案 0 :(得分:4)

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

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

  • image.mode:返回包含读取数据模式的str。 RGB和灰度图像的典型值分别为"RGB""L"。模式显示为here
  • im2.info:返回包含有关图像的各种信息的字典。这是特定于图像格式的。例如,对于jpg图像,它(可能)包含带有键的字段: dpijfifjfif_densityexif等。有关{em> jpg 图像的更多信息,请参见here
  • image.getbands():返回一个元组(甚至是一个1元素),该元组包含数据中存在的所有不同通道。对于典型的RGB图像,该值为('R', 'G', 'B'),对于典型的灰度图像,其值为('L',)

因此,从以上的观点来看,我认为更简洁的方法是将image.modeLRGB字符串进行比较,以确定图像是否为灰度图像或如果主要问题是渠道数量(如本问题所述),那么简单的len(image.getbands())就可以完成工作。

通常len(image.mode)将与len(image.getbands())一致,并且可以在其位置使用,但是由于存在至少一种模式YCbCr,该模式包含5个字符但仅3个通道(3x8位像素) (彩色视频格式),我猜想len(image.getbands())会更安全。