Python图像处理入门:PIL与Matplotlib基础操作详解
本文介绍Python在计算机视觉领域的常用基础操作。通过PIL库实现图像的读取、保存、灰度转换、缩略图生成、尺寸调整、旋转及区域裁剪粘贴。结合Matplotlib库演示如何在图像上绘制点线、提取轮廓、生成直方图以及进行交互式标注,帮助开发者快速掌握Python图像处理的实用技巧。
本文主要讲解如何利用Python执行基础的图像读取与处理任务。
前言:
不同于早期计算机视觉程序多由C/C++编写的情况,随着硬件性能的显著提升,研究人员在算法实现语言的选择上,更倾向于代码编写的效率与易用性,而非单纯追求执行速度。这一趋势使得近年来越来越多的研究者采用Python来实现算法。
鉴于当前计算机视觉领域大量研究已转向Python,掌握这一易于上手的语言在图像处理中的应用显得尤为必要。本文将介绍如何借助几个主流的Python图像处理库,完成最基本的图像操作与处理流程。
利用PIL库执行基础图像操作
PIL简介:
PIL(Python Imaging Library,Python图像处理类库)提供了通用的图像处理功能及大量实用的基础图像操作,涵盖图像缩放、裁剪、旋转、颜色模式转换等。
PIL读取与存储图像:
借助PIL提供的函数,我们可以从大多数图像格式的文件中读取数据,并将其写入最常见的图像格式文件中。PIL中最为关键的模块是Image。
以下示例展示了如何使用PIL读取一张JPG图片,将其转换为灰度图后,保存为PNG文件:
# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#将其转为一张灰度图
img = img.convert('L')
#存储该张图片
try:
img.save("test.png")
except IOError:
print "cannot convert"
Test.jpg

Test.png

PIL生成缩略图:
# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#创建最长边为128的缩略图
img.thumbnail((128,128))
#存储该张图片
try:
img.save("test.png")
except IOError:
print "cannot convert"
Test.png

PIL调整尺寸与旋转:
# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#修改图片大小,参数为一元组
img = img.resize((100,200))
#使图片逆时针选择45度
img = img.rotate(45)
#存储该张图片
try:
img.save("test.png")
except IOError:
print "cannot convert"
Test.png

PIL复制粘贴图像区域:
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#从img中裁剪指定区域
region = img.crop((300,300,500,500))
#使裁剪部分逆时针选择145度
region = region.rotate(145)
#将该区域粘贴至指定区域
img.paste(region,(100,100,300,300));
#存储该张图片
try:
img.save("test.png")
except IOError:
print "cannot convert"
Test.png

在元组使用中,坐标原点设定为左上角,区域划分方式如下图所示。

利用Matplotlib执行基础图像操作
Matplotlib简介:
当处理数学运算、绘制图表,或在图像上绘制点、直线和曲线时,Matplotlib是一个优秀的类库,其绘图功能比PIL更为强大。Matplotlib能够绘制高质量的条形图、饼状图、散点图等,但在大多数计算机视觉应用中,通常仅需使用少数几个绘图命令。例如,若需用点和线表示某些对象,如兴趣点、对应点或检测到的物体,Matplotlib便十分适用。
使用Matplotlib绘制图像、点、线
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
# 读取图像到数组中
im = array(img)
# 绘制图像
imshow(im)
# 一些点
x = [100,100,400,400]
y = [200,500,200,500]
# 使用红色星状标记绘制点
plot(x,y,'r*')
# 绘制连接前两个点的线
plot(x[:2],y[:2])
# 添加标题,显示绘制的图像
title('Plotting: "Test.jpg"')
show()
调用show()命令会首先启动图形用户界面(GUI),随后新建一个图像窗口。该GUI会循环阻断脚本执行,直至最后一个图像窗口关闭。因此,在每个脚本中通常只调用一次show()命令,且一般置于脚本末尾。
此外,可以使用axis('off')命令来隐藏坐标轴显示。
运行结果

在绘图过程中,存在多种选项可用于控制图像的颜色和样式。
例如:
plot(x,y) #默认为蓝色实线 plot(x,y,'r*') #红色星状标记 plot(x,y,'go-') #带有圆圈标记的绿线 plot(x,y,'ks:') #带有正方形标记的黑色虚线
| 标记 | 颜色 |
|---|---|
| ‘b' | 蓝色 |
| ‘g' | 绿色 |
| ‘r' | 红色 |
| ‘c' | 青色 |
| ‘m' | 品红 |
| ‘y' | 黄色 |
| ‘k' | 黑色 |
| ‘w' | 白色 |
| 标记 | 线型 |
|---|---|
| ‘-‘ | 实线 |
| ‘–' | 虚线 |
| ‘:' | 点线 |
| 标记 | 形状 |
|---|---|
| ‘.' | 点 |
| ‘o' | 圆圈 |
| 's' | 正方形 |
| ‘*' | 星形 |
| ‘+' | 加号 |
| ‘x' | 叉号 |
使用Matplotlib绘制图像轮廓
绘制图像轮廓(或其他二维函数的等值线)在实际工作中非常有用。由于绘制轮廓需对每个坐标[x, y]的像素值应用相同的阈值,因此首先需将图像转换为灰度图,随后使用contour函数获取轮廓图像。
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 读取图像到数组中,并灰度化
im = array(Image.open('./source/test.jpg').convert('L'))
#显示时抛弃颜色信息
gray()
# 显示轮廓图像
contour(im, origin='image')
# 在原点的左上角显示
axis('equal')
#关闭坐标轴
axis('off')
show()
运行结果

使用Matplotlib绘制直方图
图像直方图用于表征图像像素值的分布情况。通过指定一定数量的小区间(bin)来定义像素值的范围,统计落入每个区间的像素数量。对于(灰度)图像,可以使用hist()函数绘制直方图:
hist()函数的第二个参数用于指定小区间的数量。需要注意的是,由于hist()仅接受一维数组作为输入,因此在绘制图像直方图前,必须先对图像进行压平处理。flatten()方法会按照行优先准则将任意数组转换为一维数组。
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 读取图像到数组中,并灰度化
im = array(Image.open('./source/test.jpg').convert('L'))
# 直方图图像
hist(im.flatten(),128)
# 显示
show()
运行结果

使用Matplotlib进行交互式标注
PyLab库中的ginput()函数可实现交互式标注,用于标记某些点或训练数据。
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 读取图像到数组中
im = array(Image.open('./source/test.jpg'))
# 显示图像
imshow(im)
print 'Please click 3 points'
#获取点击并将点击坐标保存在[x,y]列表中
x = ginput(3)
#输出保存的数据
print 'you clicked:',x
show()
上述脚本首先绘制一幅图像,随后等待用户在绘图窗口的图像区域内点击三次。程序将这些点击的坐标[x, y]自动保存在x列表中。
运行结果
you clicked: [(295.22704081632651, 210.72448979591837), (405.43112244897952, 66.846938775510239), (439.1045918367347, 180.11224489795921)]
总结
本文介绍了一些Python基本的图像操作。除了上述提到的PIL和Matplotlib,在实际开发中还常使用numpy直接操作图像数组以实现图像处理目的,或利用scipy完成更多更复杂的计算。我将持续记录学习过程,希望以上内容能对大家有所帮助。
以上就是本文关于Python图像常规操作的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续查阅本站:
python使用邻接矩阵构造图代码示例
在Python web中实现验证码图片代码分享
python好玩的项目—色情图片识别代码分享
Python生成数字图片代码分享
如有任何问题,欢迎随时留言,小编会及时回复。感谢朋友们对本站的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









