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

14 篇文章 0 订阅

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值