如何将值从 0-20 的二维数组存储到 python 中的灰度图像

How to store a 2D array with values from 0-20 to a grayscale image in python

我正在做一个图像分割项目,我有一个大小为 (224,224) 的二维数组,其值介于 0-20 之间,每个数字代表数据集的一个类别。我想将此 2D 数组存储到灰度图像并使用相同的 0-20 值将其读回。我找不到合适的方法来做到这一点。我尝试如下,但尽管它存储为灰度图像,但从图像读取数组时无法读回实际的二维数组。

#arr is the 2D array of size (224,224) with values from 0-20     
rescaled = (255.0 / arr.max() * (arr - arr.min())).astype(np.uint8)
img = PIL.Image.fromarray(rescaled)
img.save(filename)

但是当我读回它时 I = np.asarray(PIL.Image.open('filename.png')) 我只能看到 0 和 255。我需要 0-20 的值。我怎样才能做到这一点?我试着用 cv2.imwrite(filename,arr) 来做,但它给出的只是一张空白图像。

你可以试试下面的代码

#arr is the 2D array of size (224,224) with values from 0-20     
min_value = arr.min()
max_Value = arr.max()
rescaled = (255.0 // (max_Value-min_value)  * (arr - min_value)).astype(np.uint8)
img = Image.fromarray(rescaled)
img.save(img_name, "BMP")

import_array = np.asarray(Image.open(img_name), dtype="int32")
rescaled_import_img = min_value + import_array*(max_Value- min_value)//255 
print (rescaled_import_img)

近似值有问题。当您除以整数值时,结果将为浮点数并四舍五入。当您加载值时,会有差异。我们最好不要缩放值,而是在灰度图像中保留 0-20 个值,稍后加载它们。

更新 1

没有重新缩放

img = Image.fromarray(np.uint8(arr))
img.save(img_name, "BMP")
print (img)

import_array = np.array(Image.open(img_name), dtype="uint8")
print (import_array)