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

2024-04-28 19:39:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道这个问题很简单,但我没有找到绕过这个问题的方法:

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

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

我试过了

  • img * 255,但这样做对负值没有帮助。
  • (img + 1) * 255,我去掉了负值,但是我正在创建 溢油

有(干净的)方法吗?

我用的是Python35,OpenCV2和Numpy,但我认为这更多的是一个数学问题而不是一个库的东西


Tags: 数据方法图像numpyimg数学像素opencv
3条回答

正如您所发现的,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]

您可以使用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将被mpped到255
  • 两者之间的所有内容都将相应地映射(0,255)

注意事项:

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

如果您只需要将范围-1,1映射到范围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

相关问题 更多 >