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

标签 numpy matplotlib python-imaging-library pillow

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

  • 颜色是用 imshow 显示的颜色。
  • 底层数组的每个元素恰好是保存图像中的一个像素——这意味着如果底层数组是 (n, m) 个元素,则图像是 NxM 像素。 (我对 interpolation='nearest' 中的 imshow 不感兴趣。)
  • 除了数组中数据对应的像素外,保存的图像中没有任何内容。 (即边缘、轴等周围没有空白区域)

  • 我怎样才能做到这一点?

    我已经看到一些代码可以通过使用 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 ):
    plt.imsave('test.png', data, cmap=cmap)
    

    结果(test.png):

    enter image description here

    关于numpy - 在保留分辨率的同时保存类似 imshow 的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31544130/

    相关文章:

    python - matplotlib 和 latex 之间的一致字体

    python - Matplotlib 不绘制线图;十字形、圆形和三角形都可以

    python - 在 Python 中修改或删除 Exif 标签 'Orientation'

    algorithm - 查找颜色相似的图像

    python - 如何做总和的平方和的总和?

    python - 一元运算符 ~ 在 numpy 中做什么?

    python - 垂直箱中 y 值的平均值

    python - 在图像上绘制多个透明蒙版

    python - 安装 matplotlib-venn

    python - PIL的getpixel和getdata的数据不一样?