在保持分辨率的同时保存类似imshow的图像

lnm*_*rer 20 numpy matplotlib python-imaging-library pillow

我有一个(n,m)数组,我一直在想象matplotlib.pyplot.imshow.我想将这些数据保存在某种类型的光栅图形文件中(例如png),以便:

  1. 颜色是显示的颜色 imshow
  2. 底层数组的每个元素恰好是保存图像中的一个像素 - 这意味着如果底层数组是(n,m)个元素,则图像是NxM像素.(我不是有意interpolation='nearest'imshow).
  3. 除了与阵列中的数据对应的像素之外,保存的图像中没有任何内容.(即边缘,轴等周围没有空白区域)

我怎样才能做到这一点?

我已经看到一些代码可以做到这一点,通过使用interpolation='nearest'和强制matplotlib(勉强)关闭轴,空格等.但是,必须有一些方法来更直接地做到这一点 - 也许与PIL?毕竟,我有基础数据.如果我可以为底层数组的每个元素获取RGB值,那么我可以使用PIL保存它.有没有办法从中提取RGB数据imshow?我可以编写自己的代码来将数组值映射到RGB值,但我不想重新发明轮子,因为matplotlib中已经存在该功能.

hit*_*tzg 32

正如您已经猜到的那样,没有必要创建一个数字.你基本上需要三个步骤.规范化数据,应用色彩映射,保存图像.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)
Run Code Online (Sandbox Code Playgroud)

虽然上面的代码解释了单个步骤,但您也可以imsave执行所有三个步骤(类似于imshow):

plt.imsave('test.png', data, cmap=cmap)
Run Code Online (Sandbox Code Playgroud)

结果(test.png):

在此输入图像描述

  • 感谢您解释所有步骤.我可能想用`LogNorm`来代替`Normalize`,`imshow`可以把规范化函数作为参数,而`imsave`显然不能.但是,您的解释将让我解决这个限制. (3认同)