opencv中imwrite对float的处理
最近在搞毕设,遇到了一个问题。网络输出图像, 但是用imwrite写入的文件,和imshow的存在差异。
左面是imwrite, 右面是imshow的。冲突上按绝直观的差异就是感觉一些白色的像素点出现了异常。由于网络输出的浮点数,imshow和imwrite是这样处理的:
# imwrite的过程 out = np.asarray(output_image) # 将网络输出转换为array cv2.imwrite('test.png', out * 255.0) # 网络输出的值为0,1 # imshow的过程 out = np.asarray(output_image) # 将网络输出转换为array
out = out * 255.0 cv2.imshow(“test”, output_image.astype(uint8))
这里的网络输出是float32,再加上直观的感觉差异。认为是在astype强转的过程中,出现了差异。
可以输出对应点的像素值,发现imwrite和imshow对于浮点数的处理不同。
imwrite写入的时候按照会有一个四舍五入的过程, 并且有saturation的过程。小于0置为0,大于255置于255。
我遇到的不同最直观的原因就是在强转中出现的问题将本应是255的像素值转换成错误的值。
正确的处理应该是这样。
out_image = np.around(out_image) out_image[out_image > 255] = 255 out_image[out_image < 0] = 0 # saturation cv2.imshow("test", out_image)