前戏:
虽然PIL没有入OpenCV那样强大的功能,但是所提供的功能,在一般的图像处理中足够使用。
图像类别:
计算机绘图中有两类图像:一类是矢量图,另一类是点阵图(位图)
矢量图:
基于计算机数字对象的绘图,其图形的构成包括点,线,多边形等这样的几何图像。在实际显示的时候一般都是通过数学公式计算得到的。
所以其产生的文件比较小,而且对其进行缩放,旋转等操作后,图像不会失真。这种图像与分辨率无关,在输出结果的时候不会影响到图像的清晰度。
Flash使用的就是矢量图。其缺点就是无法表现颜色的细节变化。所以在PIL中没有包含对这类图像处理的模块。不支持矢量图像
位图:
基本组成单元为像素。
通过这些像素的不同颜色排列,就构成了颜色丰富的图像。当放大图像,可以看到像素单元,也可能会失真。
这种图像需要保存每个像素的内容,所以文件比较大。而且,其大小是随着像素的增加而增加的。
但是由于采用了像素这样微小的图形单元来下显示色彩,使得位图可以表现丰富的颜色,更加逼真。在处理图像的时候需要考虑到分辨率邮箱,这对最后的输出很重要
常见位图格式:
(1)BMP格式:
windows下的标准图像文件格式。是很多图像处理软件的中间格式。其未进行压缩,文件占用空间较大
(2)JPEG格式:
对图像的视觉不敏感部分进行了有损压缩,保持了其中主要的图像特征。文件爱你相对较小。
JPEG2000可以实现渐进传输,先传递轮廓,再传递细节数据
(3)GIF格式:
针对网络传输带宽限制开发的一种图片格式。。图像中可以包含透明区域,同时可以存储多幅静态图片而形成的连续的动画。
压缩比高,文件较小。但是只能储存不超过256色的图像
(4)PNG格式:
考虑了文件大小和图像质量的关系。采用了无损压缩方式进行压缩。
使得图像在保持质量的同时,减小了文件大小。还支持透明区域,使得其在网络设计中也具有一定的优势。
其他概念:
1.坐标:
PIL中采用的是笛卡尔坐标系,以左上点为(0,0),水平向右为x正,垂直向下为y正
2.像素
由于位图中是采用像素来保存颜色,所以像素的大小就是指其水平方向和垂直方向上的像素个数,1600x1200表示长为1600像素,宽为1200像素的图像大小。
3.颜色模式
颜色模式决定了图像如何描述和重现图像中的色彩。在显示和打印输出的时候会用到这个概念。
常见颜色模式有RGB,CMYK,灰度模式等,不同表达方式用在不同的领域。
一般在计算机上进行图像处理都是使用RGB,加色法(颜色通道叠加产生颜色)。
印刷上多用CMKY,采用青,品红,黄,黑四种油墨。减色法,通过色素合成后吸收光线来产生不同的颜色。
灰度颜色模式值包含灰度信息,不包含彩色信息。可以看做是只由一种颜色通道组成的,一般用8比特来表示颜色信息。
4.PIL支持的4中插值算法
(1)nearest 最近邻插值方法,将会选择输入图像中最近的图像来处理 (2)bilinear 双线性插值方法。将会对输入的图像选择2x2的区域进行线性插值 (3)bicubic 双立方插值方法。选择输入的图像4x4区域进行立方插值 (4)antialias 通过高质量的采样器作用在所有输入图像的像素上,从而得到输出图像的方法
图像缩小可以选择antialias方法,bilinear和bicubic更适用于等比例变换或者是图像放大等操作。
图像的基本处理
1.图像的读写保存
from PIL import Image img1 = Image.open("1.jpg") #使用Image模块中的open方法,从指定的图像文件中获取一个Image对象,出错触发错误 img2 = Image.Image() #构造函数定义一个空的图像对象 print(img1,type(img1)) #根据文件判别Image对象 print(img2,type(img2)) #初始Image对象 img1.show() #显示图像 img1.save("hhh.png") #注意这里可以用来保存图片,而且支持不同类型文件的转换
注意这里的show方法被调用的时候,PIL将会生成一个临时文件,然后使用windows中的图像处理工具显示。效率极低。而且若是程序先退出,临时文件会被回收,工具显示会出错
2.获取图像的信息
当生成了Image对象后,可以通过此Image对象来获取关于此图像文件的信息。包括分辨率,文件格式,大小,颜色模式,文件名,读写属性等。对于构造函数生成的空文件对象,大部分操作不允许,因为其文件格式为NoneType