点不能从numpy数组正确映射到PIL映像

时间:2019-07-12 16:23:37

标签: python numpy python-imaging-library

我正在numpy数组中找到一个点,然后希望将该数组另存为图像,并在该点周围有一个框。

下面是显示该问题的简化代码表示形式

from PIL import Image, ImageDraw
import numpy as np

np_img = np.zeros((259,339,3))
pt = (29,118)

np_img[pt] = [255,0,0]
print(np_img[pt])

final_img = Image.fromarray(np_img, 'RGB')
#final_draw = ImageDraw.Draw(final_img)
#final_draw.rectangle([(pt[1]-3, pt[0]+3), (pt[1]+3, pt[0]-3)], outline="blue")

new_np_img = np.asarray(final_img)
print(new_np_img[pt])

new_pt = np.where(new_np_img > 0)
print(new_pt)

final_img.show()

我希望,如果我将生成的PIL图像读回到numpy数组中,那么我设置为[255,0,0]的点仍将是该值,但事实并非如此。 PIL对我的数据做了什么,以便我可以理解如何对numpy数组进行条件处理,以使其在PIL图像中显示我的点的正确位置?

1 个答案:

答案 0 :(得分:2)

出现不希望的输出的原因是因为您没有将 numpy 数组的数据类型明确定义为uint8。在您的代码中,第一个数组( np_img )被存储为float64数据类型。从PIL final_img )获得的数组的数据类型为uint8。导致结果不一致。

from PIL import Image
import numpy as np

np_img = np.zeros((259,339,3), np.uint8)
pt = (29,118)

np_img[pt] = [255,0,0]
print(np_img[pt])

final_img = Image.fromarray(np_img, 'RGB')

new_np_img = np.asarray(final_img)
print(new_np_img[pt])

final_img.show()

输出:-

[255   0   0]
[255   0   0]

输出图像:-

enter image description here