Matplotlib imsave()¶
概念与用途¶
matplotlib.pyplot.imsave() 将 NumPy 数组直接编码为图像文件,适合保存计算生成的灰度图、颜色映射结果或 RGB/RGBA 像素。它保存的是数组本身,不会保存坐标轴、标题、图例等 Figure 元素;保存完整图表应使用 Figure.savefig()。
核心 API¶
matplotlib.pyplot.imsave(
fname, arr, vmin=None, vmax=None, cmap=None,
format=None, origin=None, dpi=100, metadata=None
)
fname可为路径或二进制文件对象,扩展名通常决定格式。arr支持二维标量数组、RGB 或 RGBA 数组。cmap、vmin、vmax用于二维标量数组。origin控制数组第 0 行在上方还是下方。format在文件名没有扩展名时显式指定编码格式。dpi主要写入格式元数据,不会像savefig()那样按 Figure 尺寸改变数组像素数。
可运行示例¶
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
height, width = 180, 320
y, x = np.mgrid[0:height, 0:width]
field = np.sin(x / 18) + np.cos(y / 14)
output = Path("generated-field.png")
plt.imsave(
output,
field,
cmap="viridis",
vmin=-2,
vmax=2,
origin="lower",
metadata={"Title": "Generated scalar field"},
)
print(f"saved {output} ({output.stat().st_size} bytes)")
保存 RGB 图像时直接传入形状为 (height, width, 3) 的数组,不要再设置 cmap。
常见错误¶
- 期待输出包含坐标轴和标题:
imsave()只编码数组。完整可视化应先绘图,再调用fig.savefig()。 - 二维灰度数组保存后变成彩色:默认应用当前色图。需要灰度时显式设置
cmap="gray"和稳定的vmin/vmax。 - 每批图像亮度不一致:自动归一化会按每个数组的最小值和最大值拉伸。跨样本比较时固定范围。
- RGB dtype 或范围错误:
uint8使用 0 到 255,浮点 RGB 使用 0 到 1;超出范围会被裁剪。 - 误以为 PNG 会保留原始浮点矩阵:常规图像编码保存的是可视化后的像素,不是分析数据。
图表设计与工程注意事项¶
需要无损保留数值和 dtype 时使用 .npy、TIFF 或领域专用格式,并把 PNG 仅作为预览。写文件前创建受控输出目录,避免用未经校验的用户输入拼接路径。批处理应使用唯一、可追踪的文件名并记录色阶参数。若输出用于机器学习,确认通道顺序、alpha、颜色空间和重新读取后的 dtype 符合下游约定。