这里不涉及缩放,因为您已经通过将 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 数组 arr2 的 min 和 max 已经是 0 和 255。注意:从float 到np.uint8 的类型转换不涉及缩放,您只是有舍入和整数下溢和上溢。
如果将原始 NumPy 数组 arr 传递给 Image.fromarray,则 PIL.Image 对象 im 的 min 和 max 仍然类似于 -14 和 4450。此外,image mode 是 F 用于浮动。
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.8.5
NumPy: 1.19.4
Pillow: 8.1.0
----------------------------------------