【问题标题】:What is the scaling behind PIL.Image.fromarray method?PIL.Image.fromarray 方法背后的缩放比例是多少?
【发布时间】:2020-11-13 19:44:13
【问题描述】:

假设我有一个 numpy 数组,其值范围在 -14 到 4450 之间。

如果我将该 numpy 数组转换为 PIL Image,它会自动在 0 到 255 之间缩放。

我正在研究fromarray here 的源代码,但我似乎找不到任何关于缩放工作原理的提示。有人可以向我解释一下fromarray 如何在幕后缩放数字吗?

感谢您的帮助!

【问题讨论】:

    标签: python python-3.x numpy python-imaging-library


    【解决方案1】:

    这里不涉及缩放,因为您已经通过将 arr.astype(np.uint8) 传递给 Image.fromarray 来键入转换原始 NumPy 数组!

    让我们调查一下这个问题:

    import numpy as np
    from PIL import Image
    
    arr = np.random.rand(1000, 1000) * 4464 - 14
    print('Original array: ', arr.min(), arr.max(), '\n')
    
    arr2 = arr.astype(np.uint8)
    print('Intermediate NumPy array: ', arr2.min(), arr2.max(), '\n')
    
    im = Image.fromarray(arr)
    print('Correct PIL.Image array: ', np.array(im).min(), np.array(im).max())
    print('PIL.Image format: ', im.mode)
    

    这就是输出:

    Original array:  -13.993518056270652 4449.9957434693215 
    
    Intermediate NumPy array:  0 255 
    
    Correct PIL.Image array:  -13.993518 4449.9956
    PIL.Image format:  F
    

    如您所见,中间 NumPy 数组 arr2minmax 已经是 0255。注意:从floatnp.uint8 的类型转换不涉及缩放,您只是有舍入和整数下溢和上溢。

    如果将原始 NumPy 数组 arr 传递给 Image.fromarray,则 PIL.Image 对象 imminmax 仍然类似于 -144450。此外,image modeF 用于浮动。

    ----------------------------------------
    System information
    ----------------------------------------
    Platform:    Windows-10-10.0.16299-SP0
    Python:      3.8.5
    NumPy:       1.19.4
    Pillow:      8.1.0
    ----------------------------------------
    

    【讨论】:

    • 直到我了解了整数下溢和上溢。谢谢@HansHirse!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多