如何在保持分辨率的同时将2D float numpy数组无损保存到灰度图像中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在保持分辨率的同时将2D float numpy数组无损保存到灰度图像中?相关的知识,希望对你有一定的参考价值。

我有一些温度场值,我想在保持分辨率时将其转换为灰度图像。 (例如,如果它是(100x100)大小的float数组,则转换应为灰度(100x100)图像)。然后,我将处理该图像并将其转换回Temperature numpy数组。图像处理部分可以被视为黑盒处理。

重要的是转换要无损

此外,图像处理代码将识别.png和.jpg。 (我不确定是否可以识别其他文件格式,包括tiff。而且,即使jpg格式也不是首选,因为它们会导致有损转换)。

我到目前为止的尝试:

  • Matplotlib的imsave()保持分辨率且无损。但是它将图像转换为RGB而不是灰度。这种方法对我也很好,但是我无法将3通道RGB图像准确地转换回float numpy数组。例如,我使用了一个10x10 numpy浮点数组temperature,并使用了plt.imsave('Temperature_profile.png',temperature)。然后,我重新打开了同一张图片,但无法找到将其转换回(10x10)浮点数组的准确方法。因此,如果有一种方法可以无损地将3通道图像转换回2D矩阵,则可以解决该问题。

  • PIL的Image.fromarray()保留分辨率,并且可以将图像另存为灰度图像。但是我无法无损地保存矩阵并无损地取回它。因此,我会得到错误的结果。 (Converting 2D Numpy array of grayscale values to a PIL image

  • scipy.misc.imsave()已弃用。

  • imageio.imwrite()给出有关有损转换的警告。 (“从float64到uint8的有损转换”)。

  • [opencvcv2由于某种原因未被我的spyder环境识别(python 3.7,Anaconda 4.7.12)。

答案

您需要一种可以保存浮点数的无损图像格式:

  • PNG最多只能保存16位整数,
  • JPEG不是无损的,只有8位整数,
  • GIF是整数和8位,
  • NetPBM仅是最大16位整数。

因此使用TIFF进行无损压缩或不进行压缩。或者,您可以使用PFM-便携式浮动图。

如果您的查看器无法显示包含浮点的TIFF文件,则始终可以使用ImageMagick将它们转换为可见的对象:

magic float.tif viewable.png

[我知道tifffilepyvips都是处理TIFF浮点数的良好Python库。

以上是关于如何在保持分辨率的同时将2D float numpy数组无损保存到灰度图像中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 2D float numpy 数组转换为 2D int numpy 数组?

nump库的简单函数介绍

Swift 3、iOS 10+、xCode 8.3+、Quickblox - 在保持纵横比/视频分辨率的同时切换全屏远程流

如何使用 DPI 缩放因子 (float) 设置边距 (int)

cocos2d iOS游戏录制视频,视频低分辨率,正常情况下高分辨率

在 Unity 中更改分辨率时,如何使我的 UI 文本以我的 2d 对象为中心?