将float64类型的np.array转换为uint8缩放值类型

发布于 2021-01-29 17:58:54

我有代表特定灰度图像的特定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
被浏览
301
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    标准化图像的更好方法是取每个值,然后除以数据类型所经历的最大值。这样可以确保图像中动态范围较小的图像保持较小,并且不会被意外归一化,从而变为灰色。例如,如果您的图像的动态范围为[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,以防输入数据类型不是这种情况,并在进行除法时保持浮点精度。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看