我想将 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 )
但是,这种方法只能重现一个与原始矩阵具有相同维度的矩阵,但其值与原始矩阵不同。
首先,如果您只需要存储和检索矩阵,可以直接在矩阵
[1]、
[2]上使用
numpy.save
或numpy.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
方面的数据范围。所以除非你有充分的理由,否则我仍然会直接将矩阵存储为二进制或文本格式。