从[-1;转换图像 1]到[0; 255]

Mae*_*all 2 python opencv numpy

我知道这个问题很简单,但我没有找到如何绕过这个问题:

我正在处理图像,输出像素是float32,值在范围内[-1; 1].问题是,当使用openCV保存时,所有负数据和浮点值都会丢失(我只获得0或1值的图像)

所以我需要将这些图像转换为[0; 255] (Int8)

我试过了

  • img * 255,但这样做对负值没有帮助.
  • (img + 1) * 255,我正在删除负值,但我正在创建一个溢出

有(干净的)方法吗?

我正在使用Python35,OpenCV2和Numpy,但我认为它更像是数学问题而不是库事物

Mic*_*ick 5

正如您所发现的那样,img * 255为您提供结果范围 [-255:255],并(img + 1) * 255为您提供结果[0:510].你走在正确的轨道上.

你需要的是:int((img + 1) * 255 / 2)round((img + 1) * 255 / 2).这从改变输入[-1:1][0:2]再乘以127.5得到[0.0:255.0].

使用int()将实际导致[0:254]


Jer*_*uke 5

您可以使用 cv2.normalize()

考虑以下数组a

a = np.array([[-0.12547205, -1.        ],
              [ 0.49696118,  0.91790167],
              [ 0.81638017,  1.        ]])

norm_image = cv2.normalize(image, None, alpha = 0, beta = 255, norm_type = cv2.NORM_MINMAX, dtype = cv2.CV_32F)

norm_image.astype(np.uint8)
Run Code Online (Sandbox Code Playgroud)

norm_image 返回以下数组:

array([[111,   0],
      [190, 244],
      [231, 255]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)

在此示例中:

  • -1 将被映射到 0
  • 1 将被mpmp到 255
  • 介于两者之间的所有内容都将进行相应映射(0、255)

注意事项:

  1. 确保数组为类型 float
  2. 价值的极端分别放在alpha和中beta