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

问题描述 投票:0回答:1

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

我知道我可以用一些小的开销来解决它,比如(有两种可能性):

  • 转换为 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())

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

python python-imaging-library
1个回答
63
投票

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

嗯,说到 PIL,我得到的选项是:

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

因此,从上面来看,我认为更简洁的方法是将

image.mode
L
RGB
字符串进行比较,以查找图像是否是灰度图像或通道数(如这个问题)是主要问题,那么一个简单的
len(image.getbands())
就可以完成这项工作。

通常

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

© www.soinside.com 2019 - 2024. All rights reserved.