python中PIL库中的简单使用
PIL库是python2中常用的开源图片处理库,但是由于官方维护缓慢,仅支持到Python2.7,没有对python3进行支持,于是一群志愿者在PIL的基础上创建了新的分支,名字叫Pillow
Pillow在PIL的基础上,支持最新Python3,并且增加了更多功能,它支持一系列图像文件格式,如PNG,JPEG,PPM,GIF,TIFF和BMP
相比较来讲,OpenCV和Scikit-image等工具功能更为丰富,但是使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,一些较为基础的图像处理我们可以使用较为简单的Pillow
Pillow库中有多个模块,分别对应不同的操作类型,如ImageFilter模块用于滤镜、ImageDraw模块用于画图、ImageFont模块用于加载字体等等
Image模块用于处理图片的常用操作,也是我们最常用的模块
Pillow安装
pip install Pillow
# PIL库与Pillow库不允许在同一环境中共存,如果之前安装了PIL库,请卸载后再安装Pillow
引入模块
from PIL import Image
# 包名仍然沿用之前的PIL
创建Image对象
from PIL import Image
# 包名仍然沿用之前的PIL
Image.open(file):加载指定的图片文件并返回Image对象
Image.new(mode,size,color=0):创建一个新的Image对象
mode:字符串,图像模式,常用值:L(灰度图)、RGB、RGBA、CMYK、LAB、HSV等
size:两个数字组成的元祖 (width,height)
color:图片颜色,默认0表示黑色,值支持(R,G,B)数字三元组、十六进制颜色以及颜色英文单词
获取图像属性
img.size:获取图像的宽和高组成的元祖 img.width:获取图像的宽度 img.height:获取图像的高度 img.format:获取图像的格式字符串(大写) img.mode:获取图像的模式 img.info:获取图片dict格式的元信息
显示和关闭
show():显示图像 close():关闭Image对象
保存和格式转换
save(file,format=None) file:可以为字符串表示保存文件,也可以是一个打开的文件对象 format:表示保存的图片格式,默认file参数的后缀,当file为文件对象时,该参数必须提供 convert(mode):转换图像的模式,返回转换模式后的新Image对象 由于png是RGBA模式,而jpg是RGB模式,当我们将png另存为jpg时,会报错 此时通过img.convert("RGB").save("demo.jpg")现将模式转换为RGB然后再保存文件
缩放操作
resize(size, resample=None, box=None, reducing_gap=None) size:宽和高组成的元祖,表示缩放后的大小 resample:表示重采样滤波器,一般不用更改 box:4个或2个数字组成的元祖 先裁切源图像某个区域再对裁切后的图像进行缩放 4个数字表示裁切的原图像左上角和右下角坐标 2个数字表示裁切的左上角坐标,右下角坐标默认为图像的右下角 reducing_gap:float,指定使用定期重采样调整大小的次数 该值应该大于1.0,该值越大效果越好,但是消耗时间越长 一般情况下大于3.0后效果基本上不会在提升 常用的值有3.0和5.0 该方法会返回一个调整大小后的新的Image对象 thumbnail(size):缩放图像,效果没有resize()精细但是效率快 一般用来创建缩略图 该方法会直接改变调用该方法的Image对象而不返回
通道操作
split():分离通道,返回单通道Image对象组成的元祖 merge(mode,bands):合并通道 bands为对应mode模式的组成图像的颜色通道组成的元祖或数组
图像混合
blend(img1,img2,alpha):混合两个图像 图像模式必须为RGBA模式 img2会覆盖在img1上 alpha表示混合程度,值为0到1的float 为0时输出图像和img1相同 为1时输出图像和img2相同
裁剪操作
crop(box=None):参数为4个或2个数字组成的元祖,表示裁剪区域 4个数字表示左上角和右下角的坐标,2个数字表示左上角坐标,默认裁剪至图像右下角 默认为 None,表示拷贝原图像 该方法返回裁剪后的新Image对象
拷贝和粘贴
copy():返回一个Image对象的拷贝副本 paste(img, box=None, mask=None):将一张图片粘贴至另一张图片中 粘贴后的图片模式将自动保持一致,不需要进行额外的转换 box:表示粘贴至目标图像中的区域,如果为4元祖,则粘贴图像的大小必须与指定区域相同 mask:为图片添加蒙版效果,即粘贴的图片的透明度 mask为一个灰度的Image对象,如Image.open("L",(300,200),150) mask参数中的灰度Image对象的宽和高必须和粘贴的图像一致,否则报错 创建灰度Image对象时的第三个表示颜色的参数(0表示黑色,255表示白色)为0时粘贴的图像完全透明,为255时完全不透明
几何变换
transpose(method):翻转操作 不改变原图像,返回新的翻转后的Image对象 method参数表示翻转方式。可选值 Image.Transpose.FLIP_LEFT_RIGHT:左右水平翻转 Image.Transpose.FLIP_TOP_BOTTOM:上下垂直翻转 Image.Transpose.ROTATE_90:逆时针旋转 90 度 Image.Transpose.ROTATE_180:逆时针旋转 180 度 Image.Transpose.ROTATE_270:逆时针旋转 270 度 Image.Transpose.TRANSPOSE:图像转置 Image.Transpose.TRANSVERSE:图像横向翻转 rotate(angle, resample=PIL.Image.NEAREST, expand=None, center=None, translate=None, fillcolor=None) angle:int,表示旋转角度,正数为逆时针旋转 resample:重采样滤波器,默认采用最近邻插值方法 expand:是否对进行尺寸扩展,默认False表示按原图像大小输出,会裁剪掉多余部分 center:指定旋转中心,值为表示旋转中心坐标的二元祖,默认为图像中心 translate:二元组,对旋转后的图像进行平移,以左上角为原点 fillcolor:填充颜色,图像旋转后,对图像之外的区域进行填充
降噪处理
Pillow通过ImageFilter类实现图像降噪的目的,该类中集成了不同种类的滤波器实现图像降噪
Image.ImageFilter(滤波器):返回处理后的新Image对象
常见的降噪滤波器:
ImageFilter.BLUR 模糊滤波,即均值滤波 ImageFilter.CONTOUR 轮廓滤波,寻找图像轮廓信息 ImageFilter.DETAIL 细节滤波,使得图像显示更加精细 ImageFilter.FIND_EDGES 寻找边界滤波(找寻图像的边界信息) ImageFilter.EMBOSS 浮雕滤波,以浮雕图的形式显示图像 ImageFilter.EDGE_ENHANCE 边界增强滤波 ImageFilter.EDGE_ENHANCE_MORE 深度边缘增强滤波 ImageFilter.SMOOTH 平滑滤波 ImageFilter.SMOOTH_MORE 深度平滑滤波 ImageFilter.SHARPEN 锐化滤波 ImageFilter.GaussianBlur() 高斯模糊 ImageFilter.UnsharpMask() 反锐化掩码滤波 ImageFilter.Kernel() 卷积核滤波 ImageFilter.MinFilter(size) 最小值滤波器,从 size 参数指定的区域中选择最小像素值,然后将其存储至输出图像中。 ImageFilter.MedianFilter(size) 中值滤波器,从 size 参数指定的区域中选择中值像素值,然后将其存储至输出图像中。 ImageFilter.MaxFilter(size) 最大值滤波器 ImageFilter.ModeFilter() 模式滤波
颜色处理
Pillow通过ImageColor类实现颜色处理,ImageColor类只提供了两个方法
getrgb(color):将(R,G,B)数字三元组、十六进制颜色以及颜色英文单词表示的颜色转换为RGB数字三元组 getcolor(color, mode):将(R,G,B)数字三元组、十六进制颜色以及颜色英文单词表示的颜色转换为mode模式
字体操作
Pillow通过ImageFont类实现字体对象的创建,字体对象主要用于图像绘制
创建字体对象:
ImageFont.truetype(filename=None,size=10):加载指定字体并设置字体大小(像素),返回字体对象
字体对象的方法
getbbox(text):获取指定该字体下指定文本的矩形大小,返回4元祖,分别表示左上角和右下角的坐标
getlength(text):获取指定该字体下指定文本的长度
图像绘制
Pillow通过ImageDraw类实现在图像上绘制图形
创建ImageDraw对象:draw = ImageDraw.Draw(img)
img表示Image对象,可以把Image对象理解成画布
通过调用ImageDraw对象的一些方法,实现在画布上绘制图形目的
ImageDraw对象的属性
font:获取和设置默认字体 fontmode:字体的抗锯齿,设为"1"表示禁用,设为"L"表示启用
ImageDraw对象常用方法
getfont():获取默认字体对象 eclipse(box, fill=None, outline=None, width=1):绘制椭圆形 box为一个四元组,分表表示绘制矩形的左上角和右下角坐标 fill:矩形图的背景填充色 outline:矩形图的边框线条颜色 width:边框宽度 按照box的坐标会有一个矩形,该椭圆外切该矩形的四个边 rectangle(box, fill=None, outline=None, width=1):绘制矩形 rounded_rectangle(box, radius=0, fill=None, outline=None, width=1):绘制圆角矩形,radius表示圆角的半径 line(box, fill=None, width=1):绘制直线、线段 point(xy, fill=None):绘制一个点,xy可以为二元组组成的list用来绘制多个点 draw.polygon(xy,fill=None, outline=None, width=1) 绘制多边形,xy为二元组组成的list,表示多边形的各个点坐标 text(xy, text, fill=None, font=None, anchor=None, spacing=4, align='left', direction=None, stroke_width=0, stroke_fill=None) xy:文本左上角坐标 text:要绘制的字符串 fill:文本颜色 font:用来绘制的ImageFont对象 anchor:文本锚点对齐方式。确定文本锚点的相对位置。默认对齐方式为左上角 一个长度为2的字符串,第一个字符表示水平位置,第二个字符表示垂直位置 水平位置常用字符:"l"(left),"m"(middle),"r"(right) 垂直位置常用字符:"t"(top),"m"(middle),"s"(baseline),"b"(bottom) 如"lt"表示左上角,"mt"表示中上部,"rm"表示右中部 spacing:字符间距,如果含有换行符,则行间距也为该值 align:文本对齐方式。可选值"left"、"center"、"right" direction:文本方向,可选址"rtl"、"ltr"、"ttb" stroke_width:文本描边的宽度 stroke_fill:文本描边的颜色。默认使用fill参数的值 textlength(text, font=None, direction=None):获取指定字体的字符串的长度