0、问题描述
在使用numpy将元素值范围为(0,2268)的矩阵(深度图)可视化时,发现其可视化结果不如人意,下图1是正常图(翻转了180°),下图2是不如人意的图(也翻转了180°),通过排查最终发现是数值溢出问题,造成某些值得丢失。  
1、可视化原理
我们知道图像的像素值通常是0~255,所以要将元素值为0~2268范围的矩阵以图片方式展示,就要将0~2268范围按比例缩放到0~255
max_value=255
depth_min=depth.min()
depth_max=depth.max()
depth=max_value*(depth-depth_min)/(depth_max-depth_min)
cv2.imshow("",depth.astype('uint8'))
cv2.waitKey(0)
用以上代码就生成了不如人意的效果图,追踪问题发现是max_value*(depth-depth_min)/(depth_max-depth_min) 是先算前面的乘法,后算除法。然而depth是uint16 最大范围是65535,depth_min 和depth_max 也是uint16 ,该行代码的结果depth是uint16 。很显然在计算乘法时,其结果超出65536的部分全部置为65536,这意味着(depth-depth_min)>257的部分全部丢失了(depth_min==0),于是在0~2268范围中257~2268的部分丢失了,即只保留了整个范围的11%左右,如下直方图所示: 
2、解决办法
很简单,先算除法即可: 将 depth=max_value*(depth-depth_min)/(depth_max-depth_min) 修改为 depth=max_value*((depth-depth_min)/(depth_max-depth_min))
|