您现在的位置是:网站首页> 编程资料编程资料

Python图像处理库PIL详细使用说明_python_

2023-05-26 520人已围观

简介 Python图像处理库PIL详细使用说明_python_

一、 简介

1、 基本介绍

Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像、调整图像大小和图像颜色处理等。与 Pillow 相比,OpenCV 和 Scikit-image 的功能更为丰富,所以使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,比如众所周知的“人脸识别”应用 。

2、 特点

  • 支持格式繁多

    Pillow 支持广泛的图像格式,比如 "jpeg","png","bmp","gif","ppm","tiff" 等。同时,它也支持图像格式之间的相互转换。总之, Pillow 几乎能够处理任何格式的图像

  • 提供丰富的功能

    Pillow 提供了丰富的图像处理功能,可概括为两个方面:

    • 图像归档
    • 图像处理

    图像归档,包括创建缩略图、生成预览图像、图像批量处理等;而图像处理,则包括调整图像大小、裁剪图像、像素点处理、添加滤镜、图像颜色处理等

  • 配合 GUI 工具使用

官方文档:【https://www.osgeo.cn/pillow/reference/ImageFont.html】

3、 安装

pip install pillow 导包 imoprt PIL

二、 Image 对象

1、 实例化对象

1.1 实例化

导包

from PIL import Image

使用 open 方法

im = PIL.Image.open(fp) # 导入图片 im.show() # 展示图片

fp:图片路径

使用 open 方法

im = Image.new(mode,size,color) # 创建图片 im.show() # 展示图片

参数说明如下:

  • mode:图像模式,字符串参数,比如 RGB(真彩图像)、L(灰度图像)、CMYK(色彩图打印模式)等
  • size:图像大小,元组参数(width, height)代表图像的像素大小
  • color:图片颜色,默认值为 0 表示黑色,参数值支持(R,G,B)三元组数字格式、颜色的十六进制值以及颜色英文单词

1.2 图像模式

mode描述
11 位像素(取值范围 0-1),0表示黑,1 表示白,单色通道。
L8 位像素(取值范围 0 -255),灰度图,单色通道。
P8 位像素,使用调色板映射到任何其他模式,单色通道。
RGB3 x 8位像素,真彩色,三色通道,每个通道的取值范围 0-255。
RGBA4 x 8位像素,真彩色+透明通道,四色通道。
CMYK4 x 8位像素,四色通道,可以适应于打印图片。
YCbCr3 x 8位像素,彩色视频格式,三色通道。
LAB3 x 8位像素,L * a * b颜色空间,三色通道
HSV3 x 8位像素,色相,饱和度,值颜色空间,三色通道。
I32 位有符号整数像素,单色通道。
F32 位浮点像素,单色通道。

2、 对象属性

import PIL.Image im = PIL.Image.open(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg") print(im.size) # 查看图片大小 print(im.readonly) # 查看是否为只读,1为是,0为否 print(im.format) # 查看图片的格式 print(im.info) # 查看图片的相关信息 print(im.mode) # 查看图片的模式

3、 格式转换

3.1 save 方法

save 方法用于保存 图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片

语法:

im = PIL.Image.open(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg") im.save(fp, format=None) # 保存图片

参数说明如下:

  • fp:图片的存储路径,包含图片的名称,字符串格式
  • format:可选参数,可以指定图片的格式

3.2 convert 方法

注意,并非所有的图片格式都可以用 save() 方法转换完成,比如将 PNG 格式的图片保存为 JPG 格式,如果直接使用 save() 方法就会出现错误

引发错误的原因是由于 PNG 和 JPG 图像模式不一致导致的。其中 PNG 是四通道 RGBA 模式,即红色、绿色、蓝色、Alpha 透明色;JPG 是三通道 RGB 模式。因此要想实现图片格式的转换,就要将 PNG 转变为三通道 RGB 模式

Image 类提供的 convert() 方法可以实现图像模式的转换。该函数提供了多个参数,比如 mode、matrix、dither 等,其中最关键的参数是 mode,其余参数无须关心

语法:

im.convert(mode, params) # 转换模式 im.save(fp) # 保存图片

参数:

  • mode:指的是要转换成的图像模式
  • params:其他可选参数

4、 图片缩放

在图像处理过程中经常会遇到缩小或放大图像的情况,Image 类提供的 resize() 方法能够实现任意缩小和放大图像

语法:

im_new = im.resize(size, resample=image.BICUBIC, box=None, reducing_gap=None) # 注意要重新赋值 im_new.show() # 缩放后的图片

参数:

  • size:元组参数 (width,height),图片缩放后的尺寸

  • resample:可选参数,指图像重采样滤波器,与 thumbnail() 的 resample 参数类似,默认为 Image.BICUBIC

  • box:对指定图片区域进行缩放,box 的参数值是长度为 4 的像素坐标元组,即 (左,上,右下)。注意,被指定的区域必须在原图的范围内,如果超出范围就会报错。当不传该参数时,默认对整个原图进行缩放

    (0, 0, 120, 180)代表的是以原图的左上角为原点,选择宽和高分别是(120,180)的图像区域

  • reducing_gap:可选参数,浮点参数值,用于优化图片的缩放效果,常用参数值有 3.0 和 5.0

5、 创建缩略图

缩略图指的是将原图缩小至一个指定大小(size)的图像。通过创建缩略图可以使图像更易于展示和浏览

Image 对象提供了一个 thumbnail() 方法用来生图像的缩略图,等比缩放

语法:

im.thumbnail(size,resample) # 直接在原图的基础上修改 im.show() # 缩放后的图片

参数:

  • size:元组参数,指的是缩小后的图像大小
  • resample:可选参数,指图像重采样滤波器,有四种过滤方式,分别是 Image.BICUBIC(双立方插值法)、PIL.Image.NEAREST(最近邻插值法)、PIL.Image.BILINEAR(双线性插值法)、PIL.Image.LANCZOS(下采样过滤插值法),默认为 Image.BICUBIC

6、 图像分离与合并

图像(指数字图像)由许多像素点组成,像素是组成图像的基本单位,而每一个像素点又可以使用不同的颜色,最终呈现出了绚丽多彩的图像 ,而图像的分离与合并,指的就是图像颜色的分离和合并

6.1 split 方法

im = PIL.Image.open(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg") r, g, b = im.split() # split 方法使用较简单,分离通道 r.show() g.show() b.show()

6.2 merge 方法

Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像

im_merge = PIL.Image.merge(mode, bands) im_merge.show()

参数:

  • mode:指定输出图片的模式
  • bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,比如 RGB 分别代表三种颜色通道,可以表示为 (r, g, b)

6.3 blend 方法

Image 类也提供了 blend() 方法来混合 RGBA 模式的图片(PNG 格式)

语法:

PIL.Image.blend(image1,image2, alpha)

参数:

  • image1:图片对象1
  • image2:图片对象2
  • alpha:透明度 ,取值范围为 0 到 1,当取值为 0 时,输出图像相当于 image1 的拷贝,而取值为 1 时,则是 image2 的拷贝,只有当取值为 0.5 时,才为两个图像的中合。因此改值的大小决定了两个图像的混合程度

7、 图像处理

7.1 图像裁剪

Image 类提供的 crop() 函数允许我们以矩形区域的方式对原图像进行裁剪

语法:

im_crop = im.crop(box=None) # box 代表裁剪区域 im_crop.show()

box 是一个有四个数字的元组参数 (x_左上,y_左下,x1_右上,y1_右下),分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位

7.2 拷贝和粘贴

拷贝、粘贴操作几乎是成对出现的,Image 类提供了 copy() 和 paste() 方法来实现图像的复制和粘贴

拷贝语法:

im_copy = im.copy() # 复制图片

粘贴语法:

im_copy.paste(image, box=None, mask=None)

参数:

  • image:指被粘贴的图片
  • box:指定图片被粘贴的位置或者区域,其参数值是长度为 2 或者 4 的元组序列,长度为 2 时,表示具体的某一点 (x, y);长度为 4 则表示图片粘贴的区域,此时区域的大小必须要和被粘贴的图像大小保持一致
  • mask:可选参数,为图片添加蒙版效果

注意:

  • 粘贴后的图片模式将自动保持一致,不需要进行额外的转换
from PIL import Image im = Image.open(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg") # 复制一张图片副本 im_copy = im.copy() # 对副本进行裁剪 im_crop = im_copy.crop((0, 0, 200, 100)) # 创建一个新的图像作为蒙版,L模式,单颜色值 image_new = Image.new('L', (200, 100), 200) # 将裁剪后的副本粘贴至副本图像上,并添加蒙版 im_copy.paste(im_crop, (100, 100, 300, 200), mask=image_new) # 显示粘贴后的图像 im_copy.show()

8、几何变化

图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,Image 类提供了处理这些操作的函数 transpose()、rotate() 和 transform()

8.1 transpose

该函数可以实现图像的垂直、水平翻转

语法:

im_out = im.transpose(method) # 生成新的图像对象

method取值:

  • Image.FLIP_LEFT_RIGHT:左右水平翻转
  • Image.FLIP_TOP_BOTTOM:上下垂直翻转
  • Image.ROTATE_90:图像逆时针旋转 90 度
  • Image.ROTATE_180:图像旋转 180 度
  • Image.ROTATE_270:图像旋转 270 度
  • Image.TRANSPOSE:图像转置
  • Image.TRANSVERSE:图像横向翻转

8.2 rotate

当我们想把图像旋转任意角度时,可以使用 rotate() 函数

语法:

im_out = im.rotate(angle, resample=PIL.Image.NEAREST, expand=None, center=None, translate=None, fillcolor=None) # 返回图像对象

参数:

  • angle:表示任意旋转的角度
  • resample:重采样滤波器,默认为 PIL.Image.NEAREST 最近邻插值方法
  • expand:可选参数,表示是否对图像进行扩展,如果参数值为 True 则扩大输出图像,如果为 False 或者省略,则表示按原图像大小输出
  • center:可选参数,指定旋转中心,参数值是长度为 2 的元组,默认以图像中心进行旋转
  • translate:参数值为二元组,表示对旋转后的图像进行平移,以左上角为原点;translate的参数值可以为负数
  • fillcolor:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充

8.3 transform

该函数能够对图像进行变换操作,通过指定的变换方式,产生一张规定大小的新图像

语法:

im_out = im.transform(size, method, data=None, resample=0) # 返回图像对象

参数:

  • size:指定新图片的大小
  • method:指定图片的变化方式,比如 Image.EXTENT 表示矩形变换
  • data:该参数用来给变换方式提供所需数据
  • resample:图像重采样滤波器,默认参数值为 PIL.Image.NEAREST

三、 ImageFilter

1、 简介

随着数字图像技术的不断发展,图像降噪方法也日趋成熟,通过某些算法来构造滤波器是图像降噪的主要方式。滤波器能够有效抑制噪声的产生,并且不影响被处理图像的形状、大小以及原有的拓扑结构

Pillow 通过 ImageFilter 类达到图像降噪的目的,该类中集成了不同种类的滤波器,通过调用它们从而实现图像的平滑、锐化、边界增强等图像降噪操作

2、 降噪处理

2.1 图像降噪滤波器

名称说明
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()模式滤波

2.2 使用语法

语法:

im_ft = im.filter
                
                

-六神源码网