Python图像处理实战:PIL、Matplotlib与Numpy基础操作详解

不晚
不晚
发布时间:2026-10-14| 3人浏览过
原创

本文详细总结Python中进行图像处理的基础操作。涵盖PIL库的图像读取、格式转换及文件列表获取;利用Matplotlib进行图像绘制、轮廓检测、直方图分析及交互式标注;并通过Numpy解析图像数组结构,实现灰度变换、反向处理及非线性映射等核心算法,为开发者提供实用的代码示例与操作解析。

一、PIL库对图像的基本操作

1、读取图片

关于PIL库的网络教程众多,此处略过基础介绍,直接演示核心用法:读取指定图片,将其转换为灰度图像,并在终端打印处理结果。


from  PIL  import Image
import matplotlib.pyplot as plt
pil_im = Image.open("empire.jpeg")
pil_image = pil_im.convert("L")
plt.gray()
plt.imshow(pil_image)
plt.show()

运行上述代码后的输出结果如下所示:

2、转换图片格式

PIL支持将图像保存为多种格式,以下示例演示如何将PNG格式的文件转换为JPG格式:


from PIL import Image
import glob
import os
filelist = glob.glob("E:/pythonProject1/filelist/*.png")
for infile in filelist:
    outfile = os.path.splitext(infile)[0]+'.jpg'
 
    if infile  != outfile:
        try:
            Image.open(infile).save(outfile)
        except IOError:
            print("cannot convert", infile)

执行转换后的输出结果如下所示:

3、输出文件夹中所有图片的文件名列表


import os
def get_imlist(path):
    """返回目录中所有JPG图像的文件名列表"""
    return [os.path.join(path,f)for f in os.listdir(path) if f.endswith('.jpg')]
print(get_imlist("E:/pythonProject1/filelist/"))

程序最终输出包含所有图片文件名的列表。

二、Matplotlib

1、绘制图像、点和线


from PIL import Image
from pylab import *
 
#读取图像到数组中
im = array(Image.open("empire.jpeg"))
 
#绘制图像
imshow(im)
 
#一些点
x = [100, 100, 400, 400]
y = [200, 500, 200, 500]
 
#使用红色星状标记绘制点
plot(x, y)#默认为蓝色实线
# plot(x, y, 'r*')#红色星状标记
# plot(x, y, 'go-')#带有圆圈标记的绿线
# plot(x, y, 'ks')#带有正方形标记的黑色虚线
 
#绘制连接前三个点的线
plot(x[:3], y[:3])
axis('off')
 
#添加标题,显示绘制的图像
titles = ['empire']
plt.title = titles
show()

上述代码首先渲染原始图像,随后在x和y坐标列表中指定的位置绘制红色星状标记点,最后在前两个点之间绘制一条连接线。该示例的绘制效果如下图所示:

2、图像轮廓和直方图

绘制图像轮廓需对每个坐标[x, y]的像素值应用统一阈值,因此首要步骤是将图像灰度化。此处调用PIL的convert()方法将图像转换为灰度模式。此外,图像直方图用于表征像素值的分布情况。


from PIL import Image
from pylab import *
 
# 读取图像到数组中
im = array(Image.open("empire.jpeg").convert('L'))
 
#创建一个图像
figure()
#不使用颜色信息
gray()
#在原点的左上角显示轮廓图像
contour(im, origin = 'image')#检测图像轮廓
axis('equal')
axis('off')
show()
#新建一个图像
figure
hist(im.flatten(), 128)#绘制图像直方图
show()

生成的图像轮廓图输出如下所示:

生成的图像直方图输出如下所示:

3、交互式标注

若需在图像中标记特定点或标注训练数据,可使用PyLab库中的ginput()函数实现交互式标注功能。在图像窗口中点击三次,程序会自动将这三个点的坐标[x, y]保存至x列表中。


from PIL import Image
from pylab import *
 
im = array(Image.open("empire.jpeg"))
imshow(im)
print("please click 3 points")
x = ginput(3)
print("you clicked",x)
show()

三、Numpy

1、图像数组表示

针对图像数据的存储方式,以下示例进行了具体阐述。


from PIL import Image
import numpy as np
 
im = np.array(Image.open("empire.jpeg"))
print(im.shape,im.dtype)

输出结果为: (1024, 683, 3) uint8

元组中的第一个元素表示图像数组的尺寸(行、列、颜色通道数),紧随其后的字符串表示数组元素的数据类型。由于图像通常编码为无符号八位整数(uint8),载入图像并转换为数组后,其数据类型即为“uint8”。

2、灰度变换

对图像执行灰度变换的操作如下所示:


from PIL import Image
import numpy as np
 
im = np.array(Image.open("empire.jpeg"))
print(im.shape,im.dtype)
 
from PIL import Image
from matplotlib.pylab import plt
from numpy import *
 
im1 = array(Image.open('empire.jpeg').convert('L'))
im2 = 255 - im1 #对图像进行反向处理
im3 = (100.0/255) * im1 + 100 #将图像值变换到100-200之间
im4 = 255.0 * (im1/255) ** 2 #对图像像素值求平方后得到的图像
 
images = [im1, im2, im3, im4]
titles = ["f(x) = x", "f(x) = 255 - x", "f(x) = (100/255)*x +100", "f(x) = 255*(x/255)^2"]
#输出图中的最大像素值和最小像素值
print(int(im1.min()),int(im1.max()))
print(int(im2.min()),int(im2.max()))
print(int(im3.min()),int(im3.max()))
print(int(im4.min()),int(im4.max()))
 
for i in range(4):
    plt.subplot(2, 2, i+1)#2行2列,按编号顺序排列
    plt.imshow(images[i])#显示图像
    plt.title(titles[i])#显示标题
    plt.gray()
    # plt.xticks([])
    # plt.yticks([])
    plt.axis('equal')
    plt.axis('off')
plt.show()

变换后的输出结果如下所示:

总结

至此,关于Python图像处理基本操作的讲解已完成。如需了解更多相关Python图像处理内容,建议搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。