简单实用的Python图像处理库Pillow

Pillow 是Python Imaging Library 的简称,是Python 语言中最为常用的图像处理库。Pillow 库提供了对 Python3 的支持,为 Python3 解释器提供了图像处理的功能。通过使用 Pillow 库, 可以方便地使用 Python 程序对图片进行处理,例如常见的尺寸、格式、色彩、旋转等处理。

Pillow 库的安装

Pillow 库是 Python 开发者最为常见的图像处理库,它提供了广泛的文件格式支持、强大的图像处理能力,主要包括图像存储、图像显示、格式转换以及基本的图像处理操作等。 安装 Pillow 库的方法与安装 Python 其他第三方库的方法相同,也可以到 Python 官方网站下载 Pillow 库的压缩包。

pip 安装 pillow,执行如下命令:

pip install pillow

图象处理基本知识

图像的RGB 色彩模式

RGB 三个颜色通道的变化和叠加得到各种颜色,其中

  • R 红色,取值范围,0-255
  • G 绿色,取值范围,0-255
  • B 蓝色,取值范围,0-255

比如,我们常见的黄色就是由红色和绿色叠加而来。

  • 红色的 RGB 表示(255,0,0)
  • 绿色的 RGB 表示(0,255,0)
  • 蓝色的 RGB 表示(0,0,255)
  • 黄色的 RGB 表示(255,255,0)

像素阵列

数字图像可以看成一个整数阵列,阵列中的元素称为像素(Pixel),见下图的数字阵列

在这里插入图片描述

每个点代表 1 个像素(Pixel),一个点包含 RGB 三种颜色。也就是 1 个像素包含 3 个字节的信息:(R,G,B)。假如这个像素是红色,则信息是:(255,0,0)。那么,理论上我们只要操作每个点上的这三个数字,就能实现任何的图形。一幅图像上的所有像素点的信息就完全可以采用矩阵来表示,通过矩阵的运算实现更加复杂的操作。

Image 模块

打开和新建

在 Pillow 库中,通过使用 Image 模块,可以从文件中加载图像,或者处理其他图像, 或者从 scratch 中创建图像。在对图像进行处理时,首先需要打开要处理的图片。在 Image 模块中使用函数 open()打开一副图片,执行后返回 Image 类的实例。当文件不存在时,会引发 IOError 错误。使用函数 open()语法格式如下所示。

open(fp,mode)

  1. fp:指打开文件的路径。
  2. mode:可选参数,表示打开文件的方式,通常使用默认值 r。
    在 Image 模块中,可以使用函数 new()新建图像。具体语法格式如下所示:

new(mode,size,color=0)
(1) mode:图片模式,具体取值如下表
(2) size:表示图片尺寸,是使用宽和高两个元素构成的元组
(3) color:默认颜色(黑色)

Pillow 库支持的常用图片模式信息

mode(模式) bands(通道) 说明
“1” 1 数字 1,表示黑白二值图像,每个像素用 0 或者 1 共 1 位二进制代码表示
“L” 1 灰度图,每个像素用 8 位二进制代码表示
“P” 1 索引图,每个像素用 8 位二进制代码表示
“RGB” 3 24 位真彩图,每个像素用 3 个字节的二进制代码表示
“RGBA” 4 “RGB”+透明通道表示,每个像素用 4 字节的二进制代码表示
“CMYK” 4 印刷模式图像,每个像素用 4 字节的二进制代码表示
“YCbCr” 3 彩色视频颜色隔离模式,每个像素用 3 个字节的二进制代码表示
“LAB” 3 lab 颜色空间,每个像素用 3 字节的二进制代码表示
“HSV” 3 每个像素用 3 字节的二进制代码表示
“I” 1 使用整数形式表示像素,每个像素用 4 字节的二进制代码表示
“F” 1 使用浮点数形式表示像素,每个像素用 4 字节的二进制代码表示

【示例】使用 Image 打开一副图片

#导入 Image 模块
from PIL import Image 
#打开图片
im=Image.open('bjsxt.png')
#显示图片
im.show()
#查看图片的信息
print('图像格式:',im.format)
print('图像大小,格式是(宽度,高度):',im.size) print('图像宽度:',im.width,'图像高度:',im.height)

运行结果如下图:

在这里插入图片描述

混合

透明度混合处理

在 Pillow 库的 Image 模块中,可以使用函数 blend()实现透明度混合处理。具体语法格式如下所示:

blend(im1,im2,alpha)

其中 im1、im2 指参与混合的图片 1 和图片 2,alpha 指混合透明度,取值是 0-1。通过使用函数 blend(),可以将 im1 和 im2 这两幅图片(尺寸相同)以一定的透明度进行混合。具体混合过程如下:

(im1*(1-alpha)+im2*alpha)

当混合透明度为 0 时,显示 im1 原图。当混合透明度 alpha 取值为 1 时,显示 im2
原图片。

【示例】透明度混合图片

from PIL import Image 
img1=Image.open('bjsxt.jpg').convert(mode="RGB") 
img2=Image.new("RGB",img1.size,"red")
# #混合两幅图
Image.blend(img1,img2,alpha=0.5).show()

执行结果如下图:

在这里插入图片描述在这里插入图片描述

遮罩混合处理

在 Pillow 库中 Image 模块中,可以使用函数 composite()实现遮罩混合处理。具体语法格式如下所示:

composite(im1,im2,mask)

其中 im1 和 im2 表示混合处理的图片 1 和图片 2.mask 也是一个图像,mode 可以为“1”, “L”, or “RGBA”,并且大小要和 im1、im2 一样。

函数 composite()的功能是使用 mask 来混合图片 im1 和 im2,并且要求 mask、im1 和 im2 三幅图片的尺寸相同。下面的实例代码演示了使用 Image 模块实现图片遮罩混合处理的过程。

【示例】遮罩混合图片

from PIL import Image 
img1=Image.open('img1.jpg') 
img2=Image.open('img2.jpg') 
img2=img2.resize(img1.size) 
r,g,b=img2.split()
Image.composite(img2,img1,b).show()

执行结果如下图:

在这里插入图片描述在这里插入图片描述在这里插入图片描述

复制和缩放

复制图像

在 Pillow 库的 Image 模块中,可以使用函数 Image.copy()复制指定的图片,这可以用于在处理或粘贴时需要持有源图片。

缩放像素

在 Pillow 库的 Image 模块中,可以使用函数 eval()实现像素缩放处理,能够使用函数 fun()计算输入图片的每个像素并返回。使用函数 eval()语法格式如下:

eval(image,fun)

其中 image 表示输入的图片,fun 表示给输入图片的每个像素应用此函数,fun()函数只允许接收一个整型参数。如果一个图片含有多个通道,则每个通道都会应用这个函数。

【示例】缩放指定的图片,实现图像每个像素值×2

from PIL import Image
img=Image.open('img2.jpg') 
Image.eval(img,lambda i:i*2).show()

缩放图像

在 Pillow 库的 Image 模块中,可以使用函数 thumbnail()原生地缩放指定的图像 。具体语法格式如下:

Image.thmbnail(size,resample=3)

【示例】缩放成指定的大小

from PIL import Image 
img=Image.open('img2.jpg') 
imgb=img.copy()
#缩放为指定大小(220,168)
imgb.thumbnail((220,168)) 
imgb.show()

粘贴和裁剪

粘贴

在 Pillow 库的 Image 模块中,函数 paste()的功能是粘贴源图像或像素至该图像中。具体语法格式如下:

Image.paste(im,box=None,mask=None)

其中 im 是源图或像素值;box 是粘贴的区域;mask 是遮罩。参数 box 可以分为以下 3 中情况。

  1. (x1,y1):将源图像左上角对齐(x1,y1)点,其余超出被粘贴图像的区域被抛弃。
  2. (x1,y1,x2,y2):源图像与此区域必须一致。
  3. None:源图像与被粘贴的图像大小必须一致。

裁剪图像

在 Pillow 库的 Image 模块中,函数 crop()的功能是剪切图片中 box 所指定的区域, 具体语法如下:

Image.crop(box=None)

参数 box 是一个四元组,分别定义了剪切区域的左、上、右、下 4 个坐标。

【示例】对指定图片剪切和粘贴操作

from PIL import Image 
img=Image.open('bjsxt.png') 
# 复制图片
imgb=img.copy() 
imgc=img.copy()
# 剪切图片
region=imgb.crop((5,5,120,120)) 
#粘贴图片
imgc.paste(region,(30,30))
imgc.show()

图像旋转

在 Pillow 库的 Image 模块中,函数 rotate()的功能返回此图像的副本,围绕其中心逆时针旋转给定的度数。具体语法格式如下:

Image.rotate(angle,resample = 0,expand = 0,center = None,translate = None,fillcolor= None )

【示例】函数 rotate()实现图像旋转

from PIL import Image
img=Image.open('bjsxt.png') 
img.rotate(90).show()

格式转换

covert()

在 Pillow 库的 Image 模块中,函数 convert()的功能是返回模式转换后的图像实例。具体转换的语法格式如下:

Image.convert(mode=None,matrix=None,dither=None,palette=0,colors=256)

其中 mode:转换文件的模式,默契支持的模式有“L”、“RGB”“CMYK”;matrix:转使用的矩阵;dither:取值为 None 切转为黑白图时非 0(1-255)像素均为白,也可以设置此参数为 FLOYDSTEINBERG。

transpose()

在 Pillow 库的 Image 模块中,函数 transpose()函数功能是实现图像格式的转换。具体语法格式如下:

Image.transpose(method)

转换图像后,返回转换后的图像,“method”的取值有以下几个。

  1. PIL.Image.FLIP_LEFT_RIGHT:左右镜像

  2. PIL.Image.FLIP_TOP_BOTTOM :上下镜像

  3. PIL.Image.ROTATE_90:旋转 90

  4. PIL.Image.ROTATE_180:旋转 180

  5. PIL.Image.ROTATE_270:旋转 270

  6. PIL.Image.TRANSPOSE :颠倒顺序

【示例】对指定图片进行转换操作

from PIL import Image 
#打开指定的图片
img1=Image.open('bjsxt.png')
img2=img1.copy() 
#convert()
img_convert=img2.convert('CMYK') 
# img_convert.show()
#transpose()
img_transpose=img2.transpose(Image.ROTATE_90) 
img_transpose.show()

分离和合并

分离

在 Pillow 库的 Image 模块中,使用函数 split()可以将图片分割为多个通道列表。使用函数 split()的语法格式如下所示:

Image.split()

合并

在 Pillow 库的 Image 模块中,使用函数 merge()可以将一个通道的图像合并到更多通道图像中。使用函数 merge()的语法格式如下所示:

Image.merge(mode,bands)

其中 mode 指输出图像的模式,bands 波段通道,一个序列包含单个带图通道。
【示例】对指定图片进行合并和分离操作

from PIL import Image 
img1=Image.open('blend1.jpg'
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nine_mink

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值