将float64类型的np.array转换为uint8缩放值类型
我有代表特定灰度图像的特定np.array`数据。我需要使用SimpleBlobDetector(),不幸的是,该SimpleBlobDetector()仅接受8位图像,因此我需要转换此图像,显然会有质量损失。
我已经尝试过:
import numpy as np
import cv2
[...]
data = data / data.max() #normalizes data in range 0 - 255
data = 255 * data
img = data.astype(np.uint8)
cv2.imshow("Window", img)
但是 cv2.imshow 不能提供预期的图像,但是会产生奇怪的失真…
最后,我只需要将np.float64转换为np.uint8即可缩放所有值,并截断其余所有值,例如。65535变为255,65534变为254,依此类推…。
谢谢。
-
标准化图像的更好方法是取每个值,然后除以数据类型所经历的最大值。这样可以确保图像中动态范围较小的图像保持较小,并且不会被意外归一化,从而变为灰色。例如,如果您的图像的动态范围为
[0-2]
,则现在的代码会将其缩放为强度为[0, 128, 255]
。您希望将它们转换为后保持较小np.uint8
。因此,将每个值除以图像 类型
可能的最大值,而不是实际图像本身。然后,您可以将其缩放255以产生标准化的结果。使用numpy.iinfo
并提供dtype
图像的类型(),您将获得该类型的信息结构。然后,您可以从此max
结构访问该字段以确定最大值。因此,通过以上操作,对您的代码进行以下修改:
import numpy as np import cv2 [...] info = np.iinfo(data.dtype) # Get the information of the incoming image type data = data.astype(np.float64) / info.max # normalize the data to 0 - 1 data = 255 * data # Now scale by 255 img = data.astype(np.uint8) cv2.imshow("Window", img)
请注意,我另外将图像转换为
np.float64
,以防输入数据类型不是这种情况,并在进行除法时保持浮点精度。