我正在尝试使用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()
返回带符号的int,而'L'
的Image.fromarray()
选项告诉它将数组解释为8位无符号的int(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]]
关于python - Image.fromarray(pixels)和np.array(img)是否应保持数据不变?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29761266/