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

时间:2018-06-21 10:25:49

标签: python numpy opencv

我知道这个问题确实很简单,但是我没有找到如何绕过该问题的方法:

我正在处理图像,输出像素为 float32 ,其值在[-1; 1]范围内。关键是,使用openCV保存时,所有负数据和浮点值都丢失了(我只得到0或1个值的图像)

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

我尝试过

  • img * 255,但是这样做对负值没有帮助。
  • (img + 1) * 255,我要删除负值,但我要创建 溢出

有没有一种(干净的)方法?

我正在使用Python35,OpenCV2和Numpy,但我认为这是数学问题,而不是库问题

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:4)

您可以使用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)

norm_image返回以下数组:

array([[111,   0],
      [190, 244],
      [231, 255]], dtype=uint8)

在此示例中:

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

注意事项:

  1. 确保数组的类型为float
  2. 值的 extreme 分别位于alphabeta中。

答案 2 :(得分:1)

如果您只需要将 range -1,1映射到 range 0,255,则可以简单地比较范围:

OldMin = -1
OldMax = 1
NewMin = 0
NewMax = 255

OldValue = 0.42

OldRange = (OldMax - OldMin)  
NewRange = (NewMax - NewMin)  
NewValue = int((((OldValue - OldMin) * NewRange) / OldRange) + NewMin)

print NewValue #OUTPUT: 181

有关正确的映射,请参见this question