Python图像处理入门:PIL与Matplotlib基础操作详解

Evan
Evan
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍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生成数字图片代码分享

如有任何问题,欢迎随时留言,小编会及时回复。感谢朋友们对本站的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表