我正在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图像中显示我的点的正确位置?
答案 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]
输出图像:-