作者:狗且偷生 | 来源:互联网 | 2022-12-01 15:29
我正在尝试找到一种方法来使用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())
在我看来,我真的找不到这个简单的答案。
1> Eypros..:
我决定回答我自己的问题(尽管我基本上会总结@cryptonome的评论)。
好吧,关于PIL,我得到的选择是:
image.mode
:返回包含读取数据模式的str。典型值是"RGB"
和"L"
分别用于RGB和灰度图像。模式在这里介绍。
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())
。