注册 登录

清河洛

python中PIL库中的简单使用

qingheluo2023-02-08清河洛1001
PIL库是python2中常用的开源图片处理库,但是由于官方维护缓慢,仅支持到Python2.7,没有对python3进行支持,于是一群志愿者在PIL的基础上创建了新的分支,名字叫PillowPillow在PIL的基础上,支持最新Python3,并且增加了更多功能,它支持一系列图像文件格式,如PNG,JPEG,PPM,GIF,TIFF和BMP相比较来讲,OpenCV和Scikit-image等工具功能更为丰富,但是使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,一些较为基础的图像处理我们可以使用较为简单的PillowPillow库中有多个模块,分别对应不同的操作类型,如Image...

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对象

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):获取指定字体的字符串的长度


网址导航