Python PIL 图像处理中模式为"P"的含义以及与"RGB"之间的转换

查看图片的模式

from PIL import Image
img = Image.open('xxx.gif')
print(img.mode)

对于一般的 gif 图片,你会得到输出 "P"
其他输出有"1-二值图",“L-灰度图”,“RGB-三原色”"RGBA-三原色+透明度alpha"等。

P是什么意思

P 可以理解为 palettised,这是由调色盘 palette演变而来的,上例中使用gif图像做测试是因为大多数的GIF格式图片都使用调色盘。

调色盘?

调色盘存储在图像文件的文件头部附近,详细资料可以在网络中找到。

首先用大家熟悉的RGB图像为例,RGB图像是典型的不使用调色盘存储颜色的图像格式,所以RGB采用R,G,B三个通道,每个通道在每一个像素位置用1个字节即8个比特存储对应通道的颜色值(0~255),譬如纯红色的一张图,它的R通道上每一个值都是255,表示红色的程度最大,而另外两个通道值为0,表示不存在该颜色的分量。

考虑涂色盘的一个重要优点减少存储空间使用量
简单地说,调色盘是一个预设好的,这张表最多能存储256中不同的调色方案。调色方案是由RGB值定义的。
以下代码将会打印出图像img的调色板情况,按照256个配色方案*3个通道值的格式排列:

print(np.array(img.getpalette()).reshape(256,3))

回过头来,使用了调色盘的图像将会被单通道存储,每个像素位置的值是调色盘“表”中的索引,这在存储图像的时候空间要求从RGB的3个字节变成了1个字节

当然,因为表中有限的配色方案数量(256),能使用的颜色也是有限制的,这也是P格式图像的一个缺点

转换

PIL库提供了非常方便的函数:

img = img.convert('RGB')

执行以上语句即可完成转换,同时,请注意赋值回原图像变量,img.convert()的执行不是inplace的。


2019/12 Karl

发布了30 篇原创文章 · 获赞 7 · 访问量 4435

猜你喜欢

转载自blog.csdn.net/weixin_40005329/article/details/103481553