在保留分辨率的同时保存类似 imshow 的图像
Saving an imshow-like image while preserving resolution
我有一个 (n, m) 数组,我一直在使用 matplotlib.pyplot.imshow
对其进行可视化。我想将此数据保存在某种类型的光栅图形文件(例如 png)中,以便:
- 显示的颜色是
imshow
- 基础数组的每个元素恰好是保存图像中的一个像素——这意味着如果基础数组是 (n, m) 个元素,则图像是 NxM 像素。 (我对
imshow
中的 interpolation='nearest'
不感兴趣。)
- 保存的图片除了数组中数据对应的像素点外,什么都没有。 (即边缘、轴等周围没有白色 space)
我该怎么做?
我看到一些代码可以通过使用 interpolation='nearest'
并强制 matplotlib(勉强地)关闭轴、白色 space 等来实现这一点。但是,必须有一些更直接地执行此操作的方法——也许使用 PIL?毕竟我有底层数据。如果我可以为底层数组的每个元素获取一个 RGB 值,那么我可以使用 PIL 保存它。有什么方法可以从 imshow
中提取 RGB 数据吗?我可以编写自己的代码将数组值映射到 RGB 值,但我不想重新发明轮子,因为该功能已经存在于 matplotlib 中。
正如您已经猜到的那样,不需要创建图形。你基本上需要三个步骤。规范化您的数据,应用颜色图,保存图像。 matplotlib 提供了所有必要的功能:
import numpy as np
import matplotlib.pyplot as plt
# some data (512x512)
import scipy.misc
data = scipy.misc.lena()
# a colormap and a normalization instance
cmap = plt.cm.jet
norm = plt.Normalize(vmin=data.min(), vmax=data.max())
# map the normalized data to colors
# image is now RGBA (512x512x4)
image = cmap(norm(data))
# save the image
plt.imsave('test.png', image)
虽然上面的代码解释了单个步骤,但您也可以让 imsave
执行所有三个步骤(类似于 imshow
):
plt.imsave('test.png', data, cmap=cmap)
结果(test.png):
我有一个 (n, m) 数组,我一直在使用 matplotlib.pyplot.imshow
对其进行可视化。我想将此数据保存在某种类型的光栅图形文件(例如 png)中,以便:
- 显示的颜色是
imshow
- 基础数组的每个元素恰好是保存图像中的一个像素——这意味着如果基础数组是 (n, m) 个元素,则图像是 NxM 像素。 (我对
imshow
中的interpolation='nearest'
不感兴趣。) - 保存的图片除了数组中数据对应的像素点外,什么都没有。 (即边缘、轴等周围没有白色 space)
我该怎么做?
我看到一些代码可以通过使用 interpolation='nearest'
并强制 matplotlib(勉强地)关闭轴、白色 space 等来实现这一点。但是,必须有一些更直接地执行此操作的方法——也许使用 PIL?毕竟我有底层数据。如果我可以为底层数组的每个元素获取一个 RGB 值,那么我可以使用 PIL 保存它。有什么方法可以从 imshow
中提取 RGB 数据吗?我可以编写自己的代码将数组值映射到 RGB 值,但我不想重新发明轮子,因为该功能已经存在于 matplotlib 中。
正如您已经猜到的那样,不需要创建图形。你基本上需要三个步骤。规范化您的数据,应用颜色图,保存图像。 matplotlib 提供了所有必要的功能:
import numpy as np
import matplotlib.pyplot as plt
# some data (512x512)
import scipy.misc
data = scipy.misc.lena()
# a colormap and a normalization instance
cmap = plt.cm.jet
norm = plt.Normalize(vmin=data.min(), vmax=data.max())
# map the normalized data to colors
# image is now RGBA (512x512x4)
image = cmap(norm(data))
# save the image
plt.imsave('test.png', image)
虽然上面的代码解释了单个步骤,但您也可以让 imsave
执行所有三个步骤(类似于 imshow
):
plt.imsave('test.png', data, cmap=cmap)
结果(test.png):