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

Numpy 在保留分辨率的同时保存类似imshow的图像,numpy,matplotlib,python-imaging-library,pillow,Numpy,Matplotlib,Python Imaging Library,Pillow,我用matplotlib.pyplot.imshow可视化了一个(n,m)数组。我想将这些数据保存在某种类型的光栅图形文件(例如png)中,以便: 颜色是用imshow 基础数组的每个元素在保存的图像中正好是一个像素——这意味着如果基础数组是(n,m)个元素,则图像是NxM个像素。(我对imshow中的interpolation='nearest'不感兴趣) 除了与数组中的数据对应的像素外,保存的图像中没有其他内容。(即边缘、轴等周围没有空白) 我该怎么做 我见过一些代码可以通过使用interp

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

  • 颜色是用
    imshow
  • 基础数组的每个元素在保存的图像中正好是一个像素——这意味着如果基础数组是(n,m)个元素,则图像是NxM个像素。(我对
    imshow
    中的
    interpolation='nearest'
    不感兴趣)
  • 除了与数组中的数据对应的像素外,保存的图像中没有其他内容。(即边缘、轴等周围没有空白)
  • 我该怎么做


    我见过一些代码可以通过使用
    interpolation='nearest'
    并强制matplotlib(勉强)关闭轴、空格等来实现这一点。但是,必须有一些更直接的方法来实现这一点——可能是使用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
    ):

    结果(test.png):


    感谢您解释所有步骤。我可能想用
    LogNorm
    来代替
    Normalize
    ,并且
    imshow
    可以将规范化函数作为参数,而
    imsave
    显然不能。然而,你的解释会让我绕过这个限制。
    plt.imsave('test.png', data, cmap=cmap)