HOWTO · Matplotlib

如何使用 Matplotlib Python 显示图像

了解如何使用 Matplotlib 的 imshow() 加载和显示本地图像、显示 PIL 图像、自定义其外观并保存图形。

本页内容

使用 matplotlib.pyplot.imread() 加载图像,使用 imshow() 将其像素放入 Matplotlib 坐标轴中,并使用 show() 在脚本中显示图形。传递给 imread() 的路径必须标识 Python 进程可用的图像。在笔记本中,最终图形通常会自动显示;在普通脚本中,请调用 plt.show()。

使用 Matplotlib 加载并显示图像

这个自包含示例创建一个小的示例图像,用 imread() 读取它并显示它。对于您的文件,请将示例图像的设置和 image_path 赋值替换为 Python 进程可访问的图像路径。将图像放在脚本旁边并使用其文件名,或提供绝对路径;相对路径从进程的当前工作目录解析。

from pathlib import Path
from tempfile import TemporaryDirectory

import matplotlib.pyplot as plt
import numpy as np

with TemporaryDirectory() as directory:
    image_path = Path(directory) / "sample.png"
    pixels = np.zeros((3, 3, 3), dtype=float)
    pixels[:, :, 0] = 1.0
    plt.imsave(image_path, pixels)

    image = plt.imread(image_path)
    plt.imshow(image)
    plt.axis("off")
    plt.show()
    print("Image loaded and displayed.")
Image loaded and displayed.

imread() 将文件加载到数组中,imshow() 是 matplotlib.pyplot 中的一个函数,它在当前坐标轴中显示该图像数据。axis("off") 隐藏坐标轴及其刻度。生成的示例只是这个可运行示例的一个 fixture;使用您自己的图像时,请将该文件保持在所选路径上可用,并直接读取它。

使用 Matplotlib Python 显示图像

使用 Matplotlib 显示 PIL 图像

如果图像已经由 PIL 图像对象表示,请将该对象传递给 imshow(),而不是用 plt.imread() 读取它。当程序的另一部分已经用 Pillow 打开或处理了图像时,这很有用。Image.show() 是单独的 PIL 显示途径;使用 plt.show() 显示 Matplotlib 图形。两个显示调用使用不同的渲染路径,因此当您需要坐标轴、图形尺寸设置或图形导出时,请使用 Matplotlib 途径。

from pathlib import Path
from tempfile import TemporaryDirectory

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

with TemporaryDirectory() as directory:
    image_path = Path(directory) / "sample.png"
    plt.imsave(image_path, np.full((3, 3, 3), 0.4))

    with Image.open(image_path) as image:
        plt.imshow(image)
        plt.axis("off")
        plt.show()

将临时示例路径替换为您自己的图像路径,以打开本地文件。此途径需要提供 PIL.Image 的 Pillow。

使用 Matplotlib Python PIL 显示图像

自定义图像显示

要以灰度方式查看 RGB 数据,请对其三个颜色通道求平均值并选择灰度颜色映射。下面的 mean(axis=2) 操作假设数组的第三个轴包含红色、绿色和蓝色通道;它并不适用于每种图像形状或颜色模型。插值改变的是 Matplotlib 在屏幕上渲染像素的方式,而不是源图像的细节。

import matplotlib.pyplot as plt
import numpy as np

image = np.array(
    [
        [[1.0, 0.2, 0.1], [0.2, 0.8, 0.3]],
        [[0.1, 0.3, 1.0], [0.8, 0.8, 0.8]],
    ]
)
plt.imshow(image.mean(axis=2), cmap="gray", interpolation="bicubic")
plt.axis("off")
plt.show()

cmap="gray" 将平均值映射为灰色色调。当另一种受支持的颜色映射或插值设置更适合图像及其观看方式时,请选择它。要保留彩色图像,请将原始数组而不是平均后的数组传递给 imshow()。显示选项影响渲染出的视图;它们不会重写已加载的像素数据。

使用 Matplotlib Python 显示灰度图像

保存显示的图形

使用 savefig() 将 Matplotlib 图形写入图像文件。它保存图形(包括其坐标轴和布局),而不是更改原始图像。请在调用 show() 之前保存,以便在各种显示后端下图形仍可用于保存操作。

import matplotlib.pyplot as plt
import numpy as np

image = np.full((3, 3, 3), 0.4)
plt.imshow(image)
plt.axis("off")
plt.savefig("displayed-image.png", bbox_inches="tight", pad_inches=0)
plt.show()

路径 displayed-image.png 相对于当前工作目录写入。选择不同的文件名或路径来控制图形保存的位置。对于紧凑裁剪,bbox_inches="tight" 会裁掉周围的空白,pad_inches=0 会去掉额外的填充。如果导出的尺寸很重要,请在绘图前设置图形大小;保存的文件是当前 Matplotlib 图形的渲染结果。