我知道这个问题确实很简单,但是我没有找到如何绕过该问题的方法:
我正在处理图像,输出像素为 float32 ,其值在[-1; 1]
范围内。关键是,使用openCV保存时,所有负数据和浮点值都丢失了(我只得到0或1个值的图像)
所以我需要将这些图像转换为[0; 255]
(Int8)
我尝试过
img * 255
,但是这样做对负值没有帮助。 (img + 1) * 255
,我要删除负值,但我要创建
溢出有没有一种(干净的)方法?
我正在使用Python35,OpenCV2和Numpy,但我认为这是数学问题,而不是库问题
答案 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
注意事项:
float
alpha
和beta
中。答案 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