参考自:Tutorial - Pillow (PIL Fork) 10.2.0 documentation
读取图片
在Pillow库中有Image类,类的静态方法主要用来创建实例。可以从文件中加载图片,或从头开始创建头像。
from PIL import Image
im = Image.open("hopper.ppm")
成功打开则会返回Image对象,否则引发OSError异常。
Image对象的主要属性如下:
im.format:标识图像的来源
im.mode:图像的模式
im.size:图片大小,是一个二元组
除open()外还有其他方法可以从如URL,二进制文件等读取图片,详细参考官方文档
图片的mode:
| modes | Description |
|---|---|
| 1 | 1位像素,黑白图像,存成8位像素 |
| L | 8位像素,黑白 |
| P | 索引色,使用调色板映射到任何其他模式 |
| RGB | 3*8位像素,真彩 |
| RGBA | 4*8位像素,真彩+透明通道 |
| CMYK | 4*8位像素,印刷四色模式或彩色印刷模式 |
| YCbCr | 3*8位像素,色彩视频格式 |
图片操作
剪切、粘贴和合并图像
从图像复制子矩形
from PIL import Image
im = Image.open("picture.jpg")
print(im.size) # (1920, 1080)
box = (200, 200, 700, 700)
region = im.crop(box)
print(type(region))
region.show()
'''
(1920, 1080)
<class 'PIL.Image.Image'>
'''
需要一个4元组分别确定子矩形的左上角和右下角(图片一般都是以左上角为原点)。注意截取的图片同样为Image类型
处理子矩形并粘贴
在粘贴时截取的区域与给定的区域大小必须匹配(否则会覆盖),但是不要求图片格式相同(不相同会自动进行转换)。
# img.paste(im, box=None, [mask=None])
im.paste(region, box)
paste()至少要求参数为一个Image对象和给定左上角的二元组,mask为透明度,0-255。
拆分和合并通道
通过
split()和merge()进行图片的拆解和合并。注意一个是对象方法,另一个是静态方法。
r, g, b = im.split()
im = Image.merge("RGB", (b, g, r))
对于单通道的图片split()返回本身,分解的单通道也是Image类型
几何变换
旋转
1.使用
rotate()/transpose()
rotate(
self,
angle,
resample=Resampling.NEAREST,
expand=0,
center=None,
translate=None,
fillcolor=None,
)
@param
angle:图片需要逆时针旋转的角度
resample:重采样滤波器,会进行上采样或下采样
expand:为True时使输出图像扩大到能够展现整张图片
center:旋转中心
translate:图片旋转后需要平移后的像素,为一个二元组(x,y),它会在旋转后生效
fillcolor:当出现图片外的区域的填充颜色
关于重采样滤波器
重采样包括上采样与下采样:采用不同的重采样方法时可能会对图像属性造成一定影响。
关于expand参数的演示:
from PIL import Image
im1 = Image.open("picture.jpg")
im2 = Image.open("picture.jpg")
im1 = im1.rotate(45, expand=1)
im1.show()
im2 = im2.rotate(45)
im2.show()
2.使用
transpose()
transpose(self, method)
"""
实现翻转或整数倍90度的旋转
:param method: One of :py:data:`Transpose.FLIP_LEFT_RIGHT`,
:py:data:`Transpose.FLIP_TOP_BOTTOM`, :py:data:`Transpose.ROTATE_90`,
:py:data:`Transpose.ROTATE_180`, :py:data:`Transpose.ROTATE_270`,
:py:data:`Transpose.TRANSPOSE` or :py:data:`Transpose.TRANSVERSE`.
:returns: Returns a flipped or rotated copy of this image.
"""
大小调整
使用以下方法对原图片会进行缩放
im.resize(size, resample==None, box=None, reducing_gap=无)
box:规定需要resize的区域,否则为整张图片
from PIL import ImageOps
ImageOps.contain(im, size)
ImageOps.cover(im, size)
ImageOps.fit(im, size)
ImageOps.pad(im, size, color)
模式转换
使用对象的
convert()方法,该方法支持任何模式到“L/RGB”模式的转换,否则需要经过RGB模式中转。
使用该函数时如果没有过高要求直接填入模式的对应字符串即可,如im=im.convert("L")。(函数原型参考官方文档)
图像增强
过滤器
在PIL中包括
ImageFilter模块,预定义了许多过滤器
通过对象方法point()可以实现单点操作
from PIL import Image, ImageFilter
im = Image.open("picture.jpg")
out = im.filter(ImageFilter.DETAIL)
im.show()
# multiply each pixel by 1.2
out = im.point(lambda i: i * 1.2)
out.show()
运行上述程序后,picture每个像素点乘以1.2,整张图片看起来更“淡”。
图像增强
可以使用 ImageEnhance模块中的类进行更多的图片增强。
6743





