如何将矩阵另存为 PNG 图像并重新加载以恢复原始矩阵

问题描述 投票:0回答:1

我想将 96x96 矩阵保存为图像。 矩阵中的值范围为 -1 到 1。 当我使用

保存矩阵时
plt.imsave(path, matrix, cmap='rainbow'),

它被存储为 96x96x4 RGBA 图像,并且每个通道的值被重新缩放到 0–255 范围。 这使得检索矩阵的原始值变得困难。 有没有办法在保存和重新加载图像时保留原始矩阵值?

我尝试了以下方法来检索原始矩阵:

loaded_image = plt.imread(path)
restored_image = np.mean(loaded_image[:, :, :3], axis=2)
print(restored_image )

但是,这种方法只能重现一个与原始矩阵具有相同维度的矩阵,但其值与原始矩阵不同。

python image matplotlib matrix save
1个回答
0
投票

首先,如果您只需要存储和检索矩阵,可以直接在矩阵

[1]
[2]
上使用numpy.savenumpy.savetxt。如果您确实想要一个图像,用于调试或任何简洁的目的,而不牺牲太多的精度,您可以使用
imageio
将其保存为 16 位 PNG 并重新加载图像。在我的测试中,精度约为 1E-4。

请参阅下面的代码片段作为示例:

import imageio
import numpy as np

INT16_MAX = 2**15 - 1

path = 'test.png'

vmin = -1
vmax = 1

matrix = (vmax - vmin) * np.random.rand(96, 96) + vmin # generate a random matrix of size 96x96 with values between -1 and 1

# Transform to int16 range, write to 16bit PNG
matrix_i = (matrix - vmin) / (vmax - vmin) * INT16_MAX # transform the matrix to the range [0, 2^16 - 1]
imageio.imwrite(path, matrix_i.astype(np.int16))

# Load image and transform back to original range
loaded_image = imageio.imread(path).astype(np.float64)
restored_image = (vmax - vmin) * np.array(loaded_image) / INT16_MAX + vmin

print(f"maximum error is {np.max(np.abs(restored_image - matrix))}.")

限制是您必须先验地了解

vmin
vmax
方面的数据范围。所以除非你有充分的理由,否则我仍然会直接将矩阵存储为二进制或文本格式。

© www.soinside.com 2019 - 2024. All rights reserved.