我正在尝试找到一种使用Pillow获取图像通道数的方法。这看似微不足道,但我找不到(简单答案)。
我知道我可以用一些较小的开销解决它(有2种可能性):
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())
在我看来,我真的找不到这个简单的答案。
答案 0 :(得分:4)
我决定回答自己的问题(尽管我基本上会总结@cryptonome的评论)。
好吧,关于PIL,我得到的选择是:
image.mode
:返回包含读取数据模式的str。 RGB和灰度图像的典型值分别为"RGB"
和"L"
。模式显示为here。im2.info
:返回包含有关图像的各种信息的字典。这是特定于图像格式的。例如,对于jpg图像,它(可能)包含带有键的字段:
dpi
,jfif
,jfif_density
,exif
等。有关{em> jpg 图像的更多信息,请参见here。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())
会更安全。