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)

  

 

posted @ 2020-04-20 16:25  siren27  阅读(2950)  评论(0编辑  收藏  举报