Pillow简介
Pillow
不仅是 PIL 库的“复制版”,而且它又在 PIL 库的基础上增加了许多新的特性。Pillow 发展至今,已经成为了比 PIL 更具活力的图像处理库。
Pillow 的初衷只是想作为 PIL 库的分支和补充,如今它已是“青出于蓝而胜于蓝”。
Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像、调整图像大小和图像颜色处理等。与 Pillow 相比,OpenCV 和 Scikit-image 的功能更为丰富,所以使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,比如众所周知的“人脸识别”应用。
Pillow 库(有时也称 PIL 库) 是 Python 图像处理的基础库,它是一个免费开源的第三方库,Pillow 提供了非常强大的图像处理功能,它能够很轻松地完成一些图像处理任务。与 Python 的其他图像处理库相比(OpenCV、Scikit-image 等),Pillow 库简单易用,非常适合初学者学习。
Pillow 库提供了非常丰富的功能,主要有以下几点:
- Pillow 库能够很轻松的读取和保存各种格式的图片;
- Pillow 库提供了简洁易用的 API 接口,可以让您轻松地完成许多图像处理任务;
- Pillow 库能够配合 GUI(图形用户界面) 软件包 Tkinter 一起使用;
- Pillow 库中的 Image 对象能够与 NumPy ndarray 数组实现相互转换。
图像加载与显示
from PIL import Image
#打开一图片文件
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
#要显示图像需要调用 show()方法
im.show()
#使用颜色的十六进制格式
im_1=Image.new(mode='RGB',(260,100),color="#ff0000")
im_1.show()
new() 方法可以创建一个新的 Image 对象
查看图像的尺寸
from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
#打印image对象
print(im)
#查看尺寸
print("宽是%s高是%s"%(im.width,im.height))
#或者通过size查看
print("图像的大小size:",im.size)
查看图片的格式
from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
print("图像的格式:",im.format)
查看图片相关信息
from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
# 包括了每英寸像素点大小和截图软件信息
print("图像信息:",im.info)
图像模式
from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
print("图像模式信息:",im.mode)
图像转换
Pillow 支持将图像从一种模式转换为另一种模式。常见的模式包括:
- ‘L’:灰度模式
- ‘RGB’:彩色模式
- ‘CMYK’:印刷用的四分色模式
# 将RGB图像转换为灰度图像
gray_image = image.convert('L')
gray_image.show()
保存图片
from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
im.save('C:/Users/Administrator/Desktop/c.biancheng.net.bmp')
from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
#此时返回一个新的image对象,转换图片模式
image=im.convert('RGB')
#调用save()保存
image.save('C:/Users/Administrator/Desktop/c.biancheng.net.jpg')
图片缩放
from PIL import Image
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
try:#放大图片image=im.resize((550,260))#将新图像保存至桌面image.save("C:/Users/Administrator/Desktop/放大图像.png")print("查看新图像的尺寸",image.size)
except IOError:print("放大图像失败")
resize(size, resample=image.BICUBIC, box=None, reducing_gap=None)
参数说明:
- size:元组参数 (width,height),图片缩放后的尺寸;
- resample:可选参数,指图像重采样滤波器,与 thumbnail() 的 resample 参数类似,默认为 Image.BICUBIC;
- box:对指定图片区域进行缩放,box 的参数值是长度为 4 的像素坐标元组,即 (左,上,右,下)。注意,被指定的区域必须在原图的范围内,如果超出范围就会报错。当不传该参数时,默认对整个原图进行缩放;
- reducing_gap:可选参数,浮点参数值,用于优化图片的缩放效果,常用参数值有 3.0 和 5.0。
图片裁剪
# 裁剪图像
cropped_image = image.crop((50, 50, 150, 150))
cropped_image.show()
crop(box=None)
box:表示裁剪区域,默认为 None,表示拷贝原图像。
注意:box 是一个有四个数字的元组参数 (x_左上,y_左下,x1_右上,y1_右下),分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位。
图像旋转与翻转
# 旋转图像
rotated_image = image.rotate(45)
rotated_image.show()# 水平翻转图像
flipped_image = image.transpose(Image.FLIP_LEFT_RIGHT)
flipped_image.show()
图像滤镜
from PIL import ImageFilter# 应用模糊滤镜
blurred_image = image.filter(ImageFilter.BLUR)
blurred_image.show()# 应用轮廓滤镜
contour_image = image.filter(ImageFilter.CONTOUR)
contour_image.show()
Pillow 内置了多种滤镜,常见的有模糊滤镜、轮廓滤镜、锐化滤镜等
通道操作
# 拆分通道
r, g, b = image.split()# 操作通道,如增强红色通道
enhanced_r = r.point(lambda i: i * 1.5)
# 合并通道
merged_image = Image.merge('RGB', (enhanced_r, g, b))
merged_image.show()
Pillow 允许我们对图像的各个颜色通道进行独立操作。比如,我们可以拆分图像的 RGB 通道,并单独处理某一通道
文字与图像的结合
from PIL import ImageDraw, ImageFont# 创建一个新的白色图像
image = Image.new('RGB', (300, 100), color = 'white')# 初始化绘图对象
draw = ImageDraw.Draw(image)# 定义字体和大小
font = ImageFont.truetype("arial.ttf", 40)# 在图像上绘制文字
draw.text((50, 25), "Hello, Pillow!", font=font, fill=(0, 0, 0))# 显示图像
image.show()
Pillow 支持在图像上绘制文字或图形,这一功能对于创建水印、生成动态图片等非常有用。ImageDraw 模块允许你在图像上进行绘制操作
图像合并
Image.merge(mode, bands)
参数说明如下:
- mode:指定输出图片的模式
- bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,比如 RGB 分别代表三种颜色通道,可以表示为 (r,g,b)。
from PIL import Image
#打开图2.jpg
im_1 = Image.open("C:/Users/Administrator/Desktop/2.jpg")
im_2= Image.open("C:/Users/Administrator/Desktop/向日葵.jpg")
#因为两种图片的图片格式一致,所以仅需要处理图片的大小,让它们保持一致
#让 im_2 的图像尺寸与 im_1 一致,注意此处新生成了 Image 对象
image = im_2.resize(im_1.size)
#接下来,对图像进行颜色分离操作
r1, g1 ,b1 = im_1.split()
r2, g2 , b2 = image.split()
# 合并图像
im_3 = Image.merge('RGB',[r2,g1,b2])
im_3.show()
im_3.save("C:/Users/Administrator/Desktop/合成.jpg")
""""
混合 rgba模式的图像
"""
im1 = Image.open("C:/Users/Administrator/Desktop/c-net.png")
image = Image.open("C:/Users/Administrator/Desktop/心形函数图像.png")
im2=image.resize(im1.size)
def blend_im(im1,im2):#设置 alpha 为 0.5Image.blend(im1,im2,0.5).save("C:/Users/Administrator/Desktop/C语言中文网.png")
#调用函数
blend_im(im1,im2)
模糊处理
# 导入Image类和ImageFilter类
from PIL import Image,ImageFilter
im = Image.open("C:/Users/Administrator/Desktop/国宝.jpg")
#图像模糊处理
im_blur=im.filter(ImageFilter.BLUR)
im_blur.show()
im_blur.save("C:/Users/Administrator/Desktop/模糊.png")
轮廓图
from PIL import Image,ImageFilter
im = Image.open("C:/Users/Administrator/Desktop/国宝.jpg")
#生成轮廓图
im2=im.filter(ImageFilter.CONTOUR)
im2.show()
im2.save("C:/Users/Administrator/Desktop/轮廓图.png")
边缘检测
from PIL import Image,ImageFilter
im = Image.open("C:/Users/Administrator/Desktop/国宝.jpg")
#边缘检测
im3=im.filter(ImageFilter.FIND_EDGES)
im3.show()
im3.save("C:/Users/Administrator/Desktop/边缘检测.png")
浮雕图
from PIL import Image,ImageFilter
im = Image.open("C:/Users/Administrator/Desktop/国宝.jpg")
#浮雕图
im4=im.filter(ImageFilter.EMBOSS)
im4.show()
im4.save("C:/Users/Administrator/Desktop/浮雕图.png")
平滑图像
#生成平滑图像
from PIL import Image,ImageFilter
im = Image.open("C:/Users/Administrator/Desktop/国宝.jpg")
#平滑图smooth
im5=im.filter(ImageFilter.SMOOTH)
im5.show()
im5.save("C:/Users/Administrator/Desktop/平滑图.png")