如何解决将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] 举报,一经查实,本站将立刻删除。