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]]
我正在尝试使用 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]]