python - 如何在保持分辨率的同时无损地将 2D 浮点 numpy 数组保存到灰度图像中?
问题描述
我有一些温度字段值,我想在保留分辨率的同时将其转换为灰度图像。(例如,如果它是(100x100)大小的浮点数组,那么转换应该是灰度(100x100)图像)。然后我将处理图像并将其转换回温度numpy数组。图像处理部分可以被认为是一个黑盒过程。
重要的是转换是无损的。
此外,图像处理代码将识别 .png 和 .jpg。(我不确定对包括 tiff 在内的其他文件格式的识别。此外,即使是 jpg 格式也不是首选,因为它们会导致有损转换)。
到目前为止我的尝试:
Matplotlib 的
imsave()
分辨率保持不变并且是无损的。但它将图像转换为 RGB 而不是灰度。这种方法对我来说也很好,但我无法准确地将 3 通道 RGB 图像转换回浮点 numpy 数组。例如,我取了一个 10x10 的 numpy 浮点数组temperature
,使用了plt.imsave('Temperature_profile.png',temperature)
. 然后,我重新打开了相同的图像,但无法找到将其转换回 (10x10) 浮点数组的准确方法。因此,如果有办法将 3 通道图像无损地转换回 2D 矩阵,问题就解决了。PIL
Image.fromarray()
保留分辨率,可以将图像保存为灰度图像。但是我无法无损地保存矩阵并无损地取回它。因此我会得到错误的结果。(将灰度值的二维 Numpy 数组转换为 PIL 图像)scipy.misc.imsave()
已弃用。imageio.imwrite()
给出关于有损转换的警告。(“从 float64 到 uint8 的有损转换”)。opencv
并且cv2
由于某种原因没有被我的 spyder 环境(python 3.7,Anaconda 4.7.12)识别。
解决方案
您需要一种可以保存浮点数的无损图像格式:
- 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
推荐阅读
- python - FileNotFoundError: [WinError 3] 训练图像时系统找不到指定的路径
- java - 使用标准 API 删除?
- outlook-addin - Office.context.mailbox.getCallbackTokenAsync() 空令牌
- java - 我在世袭班的方法上有问题
- javascript - Javascript 文件加载回退。替代 document.write()
- ios - iOS 中 React Native 组件的映射
- c# - Visual Studio Excel 加载项开发 - 无法激活 Windows 应用商店应用错误
- java - 无法使用 Recycler view android加载更多数据分页
- c# - 如何使用为键盘输入编写的按钮输入执行功能?
- python - AttributeError: module 'opcode' has no attribute '__file__' for nuitka executable in a project including pandas and numpy