问题解决:matplotlib显示图像失真,保存再加载能够正常显示

1. 显示图像时,图像失真,保存再加载能够正常显示

【问题】
最近做车牌攻击,攻击后的车牌必须要保存后再次打开才能显示正常,如果攻击的车牌直接显示,就是下面这样,不能正常显示。

问题解决:matplotlib显示图像失真,保存再加载能够正常显示_第1张图片

原因分析

为什么先使用OpenCV的cv2.imwrite函数保存图片后,再次使用imread读取保存后的图片就显示正常了?
说明imwrite函数中做了某些处理,由于OpenCV是开源的,所以找到源码,发现imwrite函数中调用了如下语句,说明在保存的时候,将图像先转换为CV_8U,然后再保存

image.convertTo( temp, CV_8U );

备注:CV_8U是无符号的8位/像素 – 即像素可以具有值0-255,这是大多数图像和视频格式的正常范围。

解决方法

其实在,jupyter中,显示的时候已经有 Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).的提示,但自己忽略了,导致走偏。

在jupyter中使用matplotlib显示图像,有两种处理方法:

【第一种】: 将图像进行转换,由0~255之间的浮点数转换为 0~255的整数,该方法是真正解决问题,和imwrite的解决思路一致。
img_ret = np.array(img, np.int32)

【第二种】如果只是为了在jupyter中显示正常,可以在显示的时候,除以255,将其转换为0~1之间的floats即可正常显示。

plt.figure()
plt.title(ret)
plt.imshow(img / 255) #转换为0~1之间的float
plt.show()

可以参考

2. imwrite 保存的图像为黑色

【问题】
OpenCV中,处理完图像使用imshow可以正常显示,但保存为图像时为黑色。

【解决】这里打印出图像内容,可以看出图像数据都是0~1之间的浮点数,所以在保存后会显示为黑色。此时需要使用normalize函数做格式转换,转换实例:

# 注意查看api文档:dst = cv.normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]] )
# 解决保存图片为黑色的情况
img_adv1 = cv2.normalize(img_adv1, None, 0, 255, cv2.CV_8U)

你可能感兴趣的:(Python,ARTS)