@[]
简介
PIL,即Python图像处理库(Python Imaging Library),conda默认环境便已提供,如果没有,可通过pip安装
pip install pillow
有了PIL,就可以对文件进行读取和存储,示例如下
from PIL import Image
path = 'lena.jpg'
img = Image.open(path) # 读取
img.save('test.png') # 存储
【Image.open】可以打开一个图像文件,并返回一个Image对象,在调用这个图像中的【save】方法,就能把图像存储到硬盘里。在存储文件时,其保存的文件类型由文件后缀决定,所以一读一存,便完成了数据格式的转换。
PIL支持常见的bmp, jpg, png, gif等诸多图像格式,以及大量我没见过的图像格式,具体可查看【PIL支持的文件格式】。
色彩模式
Image中封装了大量属性和函数,其常用属性如下
img.filename # 图像的完整路径
img.format # 图像格式, 'JPEG'
img.mode # 色彩模式, 'RGB'
img.palette # 调色板,RGB模式不需要调色板,所以无返回
img.size # 图像尺寸 (512, 512)
# 此外,width和height分别表示图像宽、高
值得一提的是色彩模式【mode】,RGB表示红、绿、蓝三个通道。PIL提供的色彩模式如下表所示
位数 | 类别 | |
---|---|---|
1 | 2 | 黑白图像 |
L | 8 | 灰度 |
P | 8 | 彩图,颜色由palette进行映射 |
RGB | 8×3 | 红绿蓝 |
RGBA | 8×4 | RGB+A,A是透明通道 |
CMYK | 8×4 | 青品黄黑 |
YCbCr | 8×3 | 亮度、蓝红 |
LAB | 8×3 | 亮度、红绿色条、黄蓝色条 |
HSV | 8×3 | 色相、饱和度、亮度 |
I | 32 | 整数 |
F | 32 | 浮点数 |
有了这个,就可以在存储图像时,将彩色图像转为黑白图像,代码如下
img.convert("L").save("gray.png") # 存储
通道
上面的示例,通过【convert】函数,将RGB图像转换成了灰度图像,但具体是如何转换的,PIL并没有说明。在实际应用中,我们希望提取出图像中某种颜色的分量,比如绿色,那么久需要提取出图像的某一个通道,如下例所示。
green = img.getchannel("G")
green.save("green.png") # 存储
img.convert("LAB").getchannel("A").save("A.png") # 存储
【getchannel】即可实现提取某一通道,但这个函数仅适用于RGB或者RGBA格式的图像。
P模式
P模式就是调色板模式。在RGB图像中,每个像素要用R,G,B三组数据来描述,需要占据24位,而其能够描述的色彩数共有16777216中。而事实上,一张 1920 ∗ 1024 1920*1024 1920∗1024的壁纸,也不过只有1966080个像素点,换言之,这张图像并不能用完RGB中所有的色彩。
为了让图像更小,可以将图像中现有的色彩按照序列排布,将每一组RGB和一个编号对应。那么,在像素中,就可以用色彩编号来取代RGB三元组,此色彩编号,即为调色板。可以预想,随着颜色数目的下降,图像色彩也会有不同程度的失真,效果如下
代码示例如下
img.convert("P").save("lena.gif")
img.quantize(16).save("p16.gif")
【quantize】函数,可以在转换为调色盘格式时,指定色彩数目。