python - pil(枕头)图像中的 channel 数

标签 python python-imaging-library

我正在尝试找到一种使用 Pillow 获取图像 channel 数的方法。这似乎相当微不足道,但我找不到它(简单的答案)。
我知道我可以用一个很小的开销来解决它,比如(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())
    
    对我来说,我找不到这个简单的答案似乎真的很奇怪。

    最佳答案

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

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

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

  • 因此,从以上判断,我认为更简洁的方法是比较 image.mode反对LRGB字符串来查找图像是否为灰度或 channel 数(如本问题)是否是主要问题,然后是一个简单的 len(image.getbands())会做的工作。

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

    关于python - pil(枕头)图像中的 channel 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52962969/

    相关文章:

    python - 在 OS X 中使用 python 的 ctypes 调用 DLL

    python - 如何在 Python 中使用 Gtk3 GtkTreeRowReference

    Python:PIL 替换单个 RGBA 颜色

    python - 有没有办法用 PIL 读取截断的 gif?

    python - 如何从图像中过滤特定的图像坐标

    python - 过滤 itertools 组合以获取动态数量的约束

    python - 有没有办法为 HTML 中的字符设置固定宽度?

    python - 如何将 PIL 与 Tkinter 一起使用?

    Python 图像库 : How to combine 4 images into a 2 x 2 grid?

    python - 如何使用 Openpyxl 读取现有的工作表表格?