【问题标题】:Point not mapping properly from numpy array to PIL Image点未正确从 numpy 数组映射到 PIL Image
【发布时间】:2019-07-12 16:23:37
【问题描述】:

我在一个 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 图像中显示我的点的正确位置?

【问题讨论】:

    标签: python numpy python-imaging-library


    【解决方案1】:

    不想要的输出的原因是因为您没有将 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]
    

    输出图像:-

    【讨论】:

    • 啊,我没想到。这解释了我在比较 numpy 数组时看到的差异,但不能解释为什么突出显示的点出现在 PIL 图像中的奇数位置?我希望该点位于图像的左上角,但它出现在右下角。
    • 对不起,我在开车,当我阅读您的评论时,我没有看到数据类型也会影响 PIL 图像中点的位置。我运行了你的修复程序,效果很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2020-07-19
    • 2015-12-18
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多