Python图像处理实战:Pillow从入门到精通(保姆级教程)
一.入门知识:搞懂图像的 2 个核心概念
在开始编码前,先搞懂两个基础概念,避免后续操作踩坑:
1.颜色:计算机如何表示色彩?计算机用RGB 色光三原色(红 Red、绿 Green、蓝 Blue)混合表示所有颜色,每个颜色分量的取值范围是 0-255(0 表示无该颜色,255 表示该颜色最浓)。常见的颜色表示方式有两种:RGB 值:(红,绿,蓝),如白色 (255,255,255)、黑色 (0,0,0);RGBA 值:(红,绿,蓝,透明度),其中 Alpha 通道(A)取值 0-255,0 完全透明,255 完全不透明,如半透明红色 (255,0,0,128)。图像是由无数个像素(pixel) 组成的网格,每个像素是一个不可分割的颜色小方格,有明确的位置和色彩值。我们常说的 “分辨率” 就是指图像的像素尺寸,比如 1920×1080 表示图像宽 1920 像素、高 1080 像素,像素越多,图像越清晰。二.用Pillow处理图像
Pillow 是 Python 最常用的图像处理库,支持图像读取、编辑、绘图等功能,安装简单,功能强大。
1. 安装 Pillow 库
打开终端 / CMD,输入以下命令安装,国内用户建议用清华源加速,避免下载缓慢:
pip install pillow
2. Pillow 核心操作:常用功能(附代码)
Pillow 中最为重要的是Image类,可以通过Image模块的open函数来读取图像并获得Image类型的对象。
1. 读取和显示图像from PIL import Image# 读取图像获得Image对象image = Image.open('guido.jpg')# 通过Image对象的format属性获得图像的格式print(image.format) # JPEG# 通过Image对象的size属性获得图像的尺寸print(image.size) # (500, 750)# 通过Image对象的mode属性获取图像的模式print(image.mode) # RGB# 通过Image对象的show方法显示图像image.show()
2. 剪裁图像# 通过Image对象的crop方法指定剪裁区域剪裁图像image.crop((80, 20, 310, 360)).show()
3. 生成缩略图# 通过Image对象的thumbnail方法生成指定尺寸的缩略图image.thumbnail((128, 128))image.show()
4. 缩放和黏贴图像# 读取骆昊的照片获得Image对象luohao_image = Image.open('luohao.png')# 读取吉多的照片获得Image对象guido_image = Image.open('guido.jpg')# 从吉多的照片上剪裁出吉多的头guido_head = guido_image.crop((80, 20, 310, 360))width, height = guido_head.size# 使用Image对象的resize方法修改图像的尺寸# 使用Image对象的paste方法将吉多的头粘贴到骆昊的照片上luohao_image.paste(guido_head.resize((int(width / 1.5), int(height / 1.5))), (172, 40))luohao_image.show()
5. 旋转和翻转image = Image.open('guido.jpg')# 使用Image对象的rotate方法实现图像的旋转image.rotate(45).show()# 使用Image对象的transpose方法实现图像翻转# Image.FLIP_LEFT_RIGHT - 水平翻转# Image.FLIP_TOP_BOTTOM - 垂直翻转image.transpose(Image.FLIP_TOP_BOTTOM).show()
6. 操作像素for x inrange(80, 310):for y inrange(20, 360):# 通过Image对象的putpixel方法修改图像指定像素点 image.putpixel((x, y), (128, 128, 128))image.show()
7. 滤镜效果from PIL import ImageFilter# 使用Image对象的filter方法对图像进行滤镜处理# ImageFilter模块包含了诸多预设的滤镜也可以自定义滤镜image.filter(ImageFilter.CONTOUR).show()
三.进阶实战:用 Pillow 绘制图像 / 文字
Pillow 中有一个名为ImageDraw的模块,该模块的Draw函数会返回一个ImageDraw对象,通过ImageDraw对象的arc、line、rectangle、ellipse、polygon等方法,可以在图像上绘制出圆弧、线条、矩形、椭圆、多边形等形状,也可以通过该对象的text方法在图像上添加文字。
要绘制如上图所示的图像,完整的代码如下所示。
import randomfrom PIL import Image, ImageDraw, ImageFontdefrandom_color():"""生成随机颜色""" red = random.randint(0, 255) green = random.randint(0, 255) blue = random.randint(0, 255)return red, green, bluewidth, height = 800, 600# 创建一个800*600的图像,背景色为白色image = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))# 创建一个ImageDraw对象drawer = ImageDraw.Draw(image)# 通过指定字体和大小获得ImageFont对象font = ImageFont.truetype('Kongxin.ttf', 32)# 通过ImageDraw对象的text方法绘制文字drawer.text((300, 50), 'Hello, world!', fill=(255, 0, 0), font=font)# 通过ImageDraw对象的line方法绘制两条对角直线drawer.line((0, 0, width, height), fill=(0, 0, 255), width=2)drawer.line((width, 0, 0, height), fill=(0, 0, 255), width=2)xy = width // 2 - 60, height // 2 - 60, width // 2 + 60, height // 2 + 60# 通过ImageDraw对象的rectangle方法绘制矩形drawer.rectangle(xy, outline=(255, 0, 0), width=2)# 通过ImageDraw对象的ellipse方法绘制椭圆for i inrange(4): left, top, right, bottom = 150 + i * 120, 220, 310 + i * 120, 380 drawer.ellipse((left, top, right, bottom), outline=random_color(), width=8)# 显示图像image.show()# 保存图像image.save('result.png')
注意:上面代码中使用的字体文件需要根据自己准备,可以选择自己喜欢的字体文件并放置在代码目录下。
四.常见问题避坑指南