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

10-12 16:53