繁体   English   中英

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

[英]Number of channels in pil (pillow) image

我正在尝试找到一种使用 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)

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

num_channel = len(image.split())

对我来说,这似乎很奇怪,我找不到这个简单的答案。

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

好吧,当涉及到 PIL 时,我得到的选项是:

  • image.mode :返回包含读取数据模式的 str 。 RGB 和灰度图像的典型值为"RGB""L" 此处介绍模式。
  • im2.info :它返回一个包含有关图像的各种信息的字典。 这是特定于图像格式的。 例如,对于 jpg 图像,它(可能)包含带有键的字段: dpijfifjfif_densityexif等。有关jpg图像的更多信息可以在这里找到。
  • 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())更安全。

暂无
暂无

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

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