首页 > 解决方案 > 如何在保持分辨率的同时无损地将 2D 浮点 numpy 数组保存到灰度图像中?

问题描述

我有一些温度字段值,我想在保留分辨率的同时将其转换为灰度图像。(例如,如果它是(100x100)大小的浮点数组,那么转换应该是灰度(100x100)图像)。然后我将处理图像并将其转换回温度numpy数组。图像处理部分可以被认为是一个黑盒过程。

重要的是转换是无损的。

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

到目前为止我的尝试:

标签: pythonimage

解决方案


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

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

所以使用无损压缩或不压缩的 TIFF。或者,您可以使用PFM - 便携式浮动地图。


这是一个演示:

import numpy as np
from PIL import Image

# Generate a small float image in Numpy array
grey32 = np.random.randn(2,3).astype(np.float32)                                           

# Convert to PIL Image and save
Image.fromarray(grey32).save('test.tif')                                                   

# Read back from disk and convert to Numpy array
reloaded = np.array(Image.open('test.tif'))                                                

# Inspect
print(grey32)

array([[-0.28032717, -1.7696048 , -0.9811929 ],
       [-0.7785768 , -1.2427857 , -0.33241433]], dtype=float32)

print(reloaded)                                                                           

array([[-0.28032717, -1.7696048 , -0.9811929 ],
       [-0.7785768 , -1.2427857 , -0.33241433]], dtype=float32)

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

magick float.tif -auto-level viewable.png

我知道tifffilepyvips都是处理 TIFF 浮点数的优秀 Python 库。


推荐阅读