Image.fromarray(pixels) 和 np.array(img) 应该保持数据不变吗?

Should Image.fromarray(pixels) and np.array(img) leave the data unchanged?

我正在尝试使用 PIL 的 Image.fromarray() 函数生成 PNG,但没有得到预期的图像。

arr=np.random.randint(0,256,5*5)
arr.resize((5,5))
print arr

给予

[[255 217 249 221  88]
 [ 28 207  85 219  85]
 [ 90 145 155 152  98]
 [196 121 228 101  92]
 [ 50 159  66 130   8]]

然后

img=Image.fromarray(arr,'L')
new_arr=np.array(img)

我希望 new_arr 与 arr 相同,但是

print new_arr
[[122   0   0   0   0]
 [  0   0   0  61   0]
 [  0   0   0   0   0]
 [  0 168   0   0   0]
 [  0   0   0   0 221]]

问题是 np.random.randint() returns signed int,而 Image.fromarray()'L' 选项告诉它将数组解释为 8 位 无符号 整数 (PIL modes)。如果你明确地将它转换为 uint8 它会起作用:

arr=np.random.randint(0,256,5*5)
arr.resize((5,5))
print arr

输出:

[[255 217 249 221  88]
 [ 28 207  85 219  85]
 [ 90 145 155 152  98]
 [196 121 228 101  92]
 [ 50 159  66 130   8]]

然后

img=Image.fromarray(arr.astype('uint8'),'L')  # cast to uint8
new_arr=np.array(img)
print new_arr

输出:

[[255 217 249 221  88]
 [ 28 207  85 219  85]
 [ 90 145 155 152  98]
 [196 121 228 101  92]
 [ 50 159  66 130   8]]