微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将float64类型的np.array转换为uint8缩放值类型

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

解决方法

我有代表特定灰度图像的特定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,依此类推…。

谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。