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

时间:2017-10-11 13:25:55

标签: python image numpy

我有一个特定的np.array 数据,它代表一个特定的灰度图像。 我需要使用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等等......任何帮助?

感谢。

3 个答案:

答案 0 :(得分:20)

规范化图像的更好方法是获取每个值并除以数据类型所经历的最大值。这样可以确保图像中动态范围较小的图像保持较小,并且不会无意中将其标准化,使其变为灰色。例如,如果您的图片的动态范围为[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,并在进行除法时保持浮点精度。

答案 1 :(得分:1)

您可以使用const items = [ 'this/is/path1', //path 'this/is/path2',//others.two ]; ,它将使您的numpy数组范围从0-> 255

sudo docker-compose up  

答案 2 :(得分:1)

考虑到您正在使用OpenCV,在数据类型之间进行转换的最佳方法是使用normalize函数。

img_n = cv2.normalize(src=img, dst=None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)