标准化图像的更好方法是取每个值,然后除以数据类型所经历的最大值。这样可以确保图像中动态范围较小的图像保持较小,并且不会被意外归一化,从而变为灰色。例如,如果您的图像的动态范围为
[0-2],则现在的代码会将其缩放为强度为
[0,128, 255]。您希望将它们转换为后保持较小
np.uint8。
因此,将每个值除以图像 类型
可能的最大值,而不是实际图像本身。然后,您可以将其缩放255以产生标准化的结果。使用
numpy.iinfo并提供
dtype图像的类型(),您将获得该类型的信息结构。然后,您可以从此
max结构访问该字段以确定最大值。
因此,通过以上操作,对您的代码进行以下修改:
import numpy as npimport cv2[...]info = np.iinfo(data.dtype) # Get the information of the incoming image typedata = data.astype(np.float64) / info.max # normalize the data to 0 - 1data = 255 * data # Now scale by 255img = data.astype(np.uint8)cv2.imshow("Window", img)请注意,我另外将图像转换为
np.float64,以防输入数据类型不是这种情况,并在进行除法时保持浮点精度。



