Home > Article > Backend Development > How to use the Python image processing library PIL
Pillow is a relatively basic image processing library in Python. It is mainly used for basic image processing, such as cropping images, adjusting image sizes and images. Color processing, etc. Compared with Pillow, OpenCV and Scikit-image have richer functions and are therefore more complex to use. They are mainly used in fields such as machine vision and image analysis, such as the well-known "face recognition" application.
Supports a wide range of formats
Pillow supports a wide range of image formats, such as "jpeg", "png", "bmp", "gif", "ppm", "tiff" etc. At the same time, it also supports mutual conversion between image formats. In short, Pillow can process images in almost any format
Provides rich functions
Pillow provides rich image processing functions, which can be summarized in two aspects:
Image archiving includes creating thumbnails, generating preview images, image batch processing, etc.; while image processing includes resizing images, cropping images, pixel processing, adding filters, image color processing, etc.
Image archiving
Image processing
Used with GUI tools
pip install pillow 导包 imoprt PIL
Guide package
from PIL import Image
Use the open method
im = PIL.Image.open(fp) # 导入图片 im.show() # 展示图片
fp: Picture path
Use the open method
im = Image.new(mode,size,color) # 创建图片 im.show() # 展示图片
The parameter description is as follows:
mode: image mode, string parameters, such as RGB (true color image), L (grayscale image), CMYK (color map printing mode), etc.
size: image size, tuple parameters (width, height) represent the pixel size of the image
color: image color, the default value is 0 for black, parameter value Supports (R,G,B) triplet number format, hexadecimal value of color and English word of color
mode | Description |
---|---|
1 | 1 bit pixel (value range 0-1), 0 means black ,1 means white,monochrome channel. |
L | 8-bit pixel (value range 0 -255), grayscale image, monochrome channel. |
P | 8-bit pixel, using palette mapping to any other mode, monochrome channel. |
RGB | 3 x 8-bit pixels, true color, three color channels, the value range of each channel is 0-255. |
RGBA | 4 x 8-bit pixels, true color, transparent channel, four color channels. |
CMYK | 4 x 8-bit pixels, four color channels, suitable for printing pictures. |
YCbCr | 3 x 8-bit pixels, color video format, three color channels. |
LAB | 3 x 8-bit pixels, L * a * b color space, three color channels |
HSV | 3 x 8-bit pixels, hue, saturation, value color space, three color channels. |
I | 32-bit signed integer pixel, monochrome channel. |
F | 32-bit floating point pixels, monochrome channel. |
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) # 查看图片的模式
save 方法用于保存 图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片
语法:
im = PIL.Image.open(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg") im.save(fp, format=None) # 保存图片
参数说明如下:
fp:图片的存储路径,包含图片的名称,字符串格式
format:可选参数,可以指定图片的格式
注意,并非所有的图片格式都可以用 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:其他可选参数
在图像处理过程中经常会遇到缩小或放大图像的情况,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
缩略图指的是将原图缩小至一个指定大小(size)的图像。通过创建缩略图可以使图像更易于展示和浏览
Image 对象提供了一个 thumbnail() 方法用来生图像的缩略图,等比缩放
语法:
im.thumbnail(size,resample) # 直接在原图的基础上修改 im.show() # 缩放后的图片
参数:
size:元组参数,指的是缩小后的图像大小
resample:可选参数,指图像重采样滤波器,有四种过滤方式,分别是 Image.BICUBIC(双立方插值法)、PIL.Image.NEAREST(最近邻插值法)、PIL.Image.BILINEAR(双线性插值法)、PIL.Image.LANCZOS(下采样过滤插值法),默认为 Image.BICUBIC
图像(指数字图像)由许多像素点组成,像素是组成图像的基本单位,而每一个像素点又可以使用不同的颜色,最终呈现出了绚丽多彩的图像 ,而图像的分离与合并,指的就是图像颜色的分离和合并
im = PIL.Image.open(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg") r, g, b = im.split() # split 方法使用较简单,分离通道 r.show() g.show() b.show()
Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像
im_merge = PIL.Image.merge(mode, bands) im_merge.show()
参数:
mode:指定输出图片的模式
bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,比如 RGB 分别代表三种颜色通道,可以表示为 (r, g, b)
Image 类也提供了 blend() 方法来混合 RGBA 模式的图片(PNG 格式)
语法:
PIL.Image.blend(image1,image2, alpha)
参数:
image1:图片对象1
image2:图片对象2
alpha:透明度 ,取值范围为 0 到 1,当取值为 0 时,输出图像相当于 image1 的拷贝,而取值为 1 时,则是 image2 的拷贝,只有当取值为 0.5 时,才为两个图像的中合。因此改值的大小决定了两个图像的混合程度
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 轴,每个像素点代表一个单位
拷贝、粘贴操作几乎是成对出现的,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()
图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,Image 类提供了处理这些操作的函数 transpose()、rotate() 和 transform()
该函数可以实现图像的垂直、水平翻转
语法:
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:图像横向翻转
当我们想把图像旋转任意角度时,可以使用 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:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充
该函数能够对图像进行变换操作,通过指定的变换方式,产生一张规定大小的新图像
语法:
im_out = im.transform(size, method, data=None, resample=0) # 返回图像对象
参数:
size:指定新图片的大小
method:指定图片的变化方式,比如 Image.EXTENT 表示矩形变换
data:该参数用来给变换方式提供所需数据
resample:图像重采样滤波器,默认参数值为 PIL.Image.NEAREST
随着数字图像技术的不断发展,图像降噪方法也日趋成熟,通过某些算法来构造滤波器是图像降噪的主要方式。滤波器能够有效抑制噪声的产生,并且不影响被处理图像的形状、大小以及原有的拓扑结构
Pillow 通过 ImageFilter 类达到图像降噪的目的,该类中集成了不同种类的滤波器,通过调用它们从而实现图像的平滑、锐化、边界增强等图像降噪操作
Name | Description |
---|---|
ImageFilter.BLUR | Fuzzy filtering, that is, mean filtering |
ImageFilter.CONTOUR | Contour filtering, looking for image contour information |
ImageFilter.DETAIL | Detail filtering, making the image display more detailed |
ImageFilter.FIND_EDGES | Looking for boundaries Filtering (finding the boundary information of the image) |
ImageFilter.EMBOSS | Relief filtering, display the image in the form of a relief image |
ImageFilter.EDGE_ENHANCE | Border Enhancement Filter |
ImageFilter.EDGE_ENHANCE_MORE | Depth Edge Enhancement Filter |
ImageFilter.SMOOTH | Smooth filter |
ImageFilter.SMOOTH_MORE | Depth smooth filter |
ImageFilter.SHARPEN | Sharpening filter |
Gaussian Blur | |
Unsharp Mask Filter | |
Convolution Kernel Filter | |
Minimum filter selects the smallest pixel value from the area specified by the size parameter and stores it in the output image. | |
Median filter selects the median pixel value from the area specified by the size parameter and stores it in the output image . | |
Maximum filter | |
Pattern filtering |
The above is the detailed content of How to use the Python image processing library PIL. For more information, please follow other related articles on the PHP Chinese website!