PIL库的使用
PIL库是一个图像处理的第三方库。它不仅包含了丰富的像素、色彩操作功能,还可以用于图像的归档和批量处理。下面我们来看看PIL库的使用。
首先,需要安装PIL库:在命令提示符中输入 指令: pip install pillow

PIL库支持图像存储、显示和处理,它能够处理几乎所有图像格式,可以完成图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。
根据功能不同,PIL库共包括21个与图像相关的类:
import(PIL)
help(PIL)
可以看到PIL的所有类,其中
Image, ImageChops, ImageCms, ImageColor, ImageDraw, ImageDraw2, ImageEnhance, ImageFile, ImageFilter, ImageFont,ImageGrab, ImageMath,ImageMode, ImageMorph, ImageOps, ImagePalette, ImagePath,ImageQt, ImageSequence,ImageShow, ImageStat, ImageTk,ImageTransform, ImageWin
我们这里重点介绍PIL最常用的:Image、ImageFilter、ImageEnhance。
PIL库中Image类的使用
首先导入Image类:
from PIL import Image
1. 图像的读取和创建
在PIL中,任何一个图像文件都可以用Image对象来表示。下表中给出了Image类的图像读取和创建方法。
| 方法 | 描述 |
| Image.open(filename) | 根据参数加载图像文件 |
| Image.new(mode,size, color) | 根据给定参数创建一个新的图像 |
| Image.open(StringIO.StringIO(buffer)) | 从字符串中获取图像 |
| Image.frombytes(mode,size,data) | 根据象素点data创建图像 |
| Image.verify() | 对图像文件完整性进行检查,返回异常 |
首先,我们在D盘python目录下存放任一图像文件,例如hqu.jpg。
使用Image.open("D:/python/hqu.jpg")加载这个图像文件。例如:
img=Image.open("D:/python/hqu.jpg")

2. 图像的属性
在Image中,有4个处理图像的常用属性,如下表:
| 属性 | 描述 |
| Image.format | 标识图像格式或来源,如果图像不是从文件读取,值为None |
| Image.mode | 图像的色彩模式,"L"为灰度图像、"RGB"为真彩色图像、"CMYK"为出版图像
|
| Image.size | 图像宽度和高度,单位是像素(px),返回值是二元元组(tuple) |
| Image.palette | 调色板属性,返回一个ImagePalette类型 |
例如,要查看已读取的文件的属性:
print(img.format,img.size,img.mode)
运行结果:
JPEG (1002, 190) 'RGB'
3.序列类图像
Image还能读取序列类图像文件,包括GIF、FLI、FLC、TIFF等格式文件。open()方法打开一个这类文件时自动加载序列中的第一帧,使用seek()和tell()方法可以在不同帧之间移动,如下表:
| 方法 | 描述 |
| Image.seek(frame) | 跳转并返回图像中的指定帧 |
| Image.tell() | 返回当前帧的序号 |
4.图像的格式的转换和保存
Image类的图像转换和保存方法如下表:
| 方法 | 描述 |
| Image.save(filename, format) | 将图像保存为filename文件名,format格式(省略则为文件名的扩展名格式) |
| Image.convert(mode) | 使用不同的参数,转换图像为新的模式 |
| Image.thumbnail(size) | 创建图像的缩略图,size是缩略图尺寸的二元元组 |
搭配open()和save()可以实现图像的格式转换,例如png格式转为jpg格式:
img=Image.open("D:/python/hqu.jpg")
img.save("D:/python/hqu.png")

运行后,在D盘python目录下会多一个hqu.png文件。

执行以下命令:
img.thumbnail((128,128))
img.save("D:/python/hquTN.jpg")
会在D盘python目录下创建一个hqu.jpg的缩略图hquTN.jpg, 其尺寸一参数值为128。

5.图像的缩放和旋转
Image类可以缩放和旋转图像,方法如下表,其中rotate()以逆时针旋转的角度值作为参数来旋转图像。
| 方法 | 描述 |
| Image.resize(size) | 按size大小调整图像,生成副本 |
| Image。rotate(angle) | 按angle角度旋转图像,生成图像 |
6.图像的像素和色彩通道的操作
Image类能够对图像的每个像素点或者一副RGB图像的每个通道单独进行操作,如下表,split()能够将RGB图像各颜色通道提取出来,merge()能够将各独立通道再合成一幅新的图像。
| 方法 | 描述 |
| Image.point(func) | 根据函数func的功能对每个元素进行运算,返回图像副本 |
| Image.split() | 提取RGB图像的每个颜色通道,返回图像副本
|
| Image.merge(mode,bands) | 合并通道,其中mode表示色彩,bands表示新的色彩通道 |
| Image.blend(im1,im2,alpha) | 将两幅图片im1和im2按照公式 im1*(1.0-alpha)+im2*alpha 插值后生成新的图像 |
from PIL import Image
img = Image.open("D:/python/hqu.jpg")
r,g,b=img.split()
om = Image.merge("RGB",(b,g,r)) #色彩值发生改变
om.save("D:/python/hquBGR.jpg")

运行后,产生的hquBGR.jpg与原图色彩变化了。

图像的过滤与增强
PIL库中的ImageFilter和ImageEnhance类提供了过滤图像和增强图像的方法。
1.图像的过虑
ImageFileter类提供10种预定义图像的过滤方法,如下表:
| 方法 | 描述 |
| ImageFilter.BLUR | 图像的模糊效果 |
| ImageFilter.CONTOUR | 图像的轮廓效果 |
| ImageFilter.DETAIL | 图像的细节效果 |
| ImageFilter.EDGE_ENHANCE | 图像的边界加强效果 |
| ImageFilter.EDGE_ENHANCE_MORE | 图像的阈值边界加强效果 |
| ImageFilter.EMBOSS | 图像的浮雕效果 |
| ImageFilter.FIND_EDGES | 图像的边界效果 |
| ImageFilter.SMOOTH | 图像的平滑效果 |
| ImageFilter.SMOOTH_MORE | 图像的阈值平滑效果 |
| ImageFilter.SHARPEN | 图像的锐化效果 |
使用Image类的filter()方法可以使用ImageFilter类,例如:
img.filter(ImageFilter.BLUR) 表示把图像文件进行模糊效果处理
【例 】图像的轮廓获取
首先存储一张要处理的图像文件img1.jpg,运行下面代码:
from PIL import Image
from PIL import ImageFilter
img= Image.open("img1.jpg")
om= img.filter(ImageFilter.CONTOUR)
om.save("img1Contour.jpg")
结果会在同一目录下生成原图的轮廓图img1Contour.jpg。


2.图像的增强
ImageEnhance类提供了更高级的图像增强功能,如调整色彩度、亮度、对比度、锐化等,该类的图像增强和滤镜方法如下:
| 方法 | 描述 |
| ImageEnhance.enhance(factor) | 对选择属性的数值增强factor倍 |
| ImageEnhance.Color(im) | 调整图像的颜色平衡 |
| ImageEnhance.Contrast(im) | 调整图像的对比度 |
| ImageEnhance.Brightness(im) | 调整图像的亮度 |
| ImageEnhance.Sharpness(im) | 调整图像的锐度 |
【例】图像对比度增强20倍
首先,在当前目录下存放一张图像,例如img1.jpg
from PIL import Image
from PIL import ImageEnhance
img=Image.open("img1.jpg)
om=ImageEnhance.Contrast(img)
om.enhance(20).save("img1EnContrast.jpg")
运行后,在当前目录生成一张新的图像文件img1EnContrast.jpg,其对比度是原图的20倍。

