我正在尝试找到一种使用 Pillow 获取图像通道数的方法。这看起来相当微不足道,但我找不到它(简单的答案)。
我知道我可以用一些小的开销来解决它,比如(有两种可能性):
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 图像,它(可能)包含带键的字段:
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())
。