OpenCV 写图像也有讲究,取经之路第 5 天

举报
梦想橡皮擦 发表于 2021/09/14 09:19:14 2021/09/14
【摘要】 今天是持续写作的第 37 / 100 天。如果你有想要交流的想法、技术,欢迎在评论区留言。本篇文章与你一起学一个方法 imwrite。 OpenCV 保存图像读取图像之后,对应的就是保存图像,在 OpenCV 里面,保存图像也有讲究。在 C++语言里面,OpenCV 函数结构如下:CV_EXPORTS_W bool imwrite( const String& filename, Input...

今天是持续写作的第 37 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。

本篇文章与你一起学一个方法 imwrite

OpenCV 保存图像

读取图像之后,对应的就是保存图像,在 OpenCV 里面,保存图像也有讲究。

在 C++语言里面,OpenCV 函数结构如下:

CV_EXPORTS_W bool imwrite( const String& filename, InputArray img,
              const std::vector<int>& params = std::vector<int>());
  • 参数一: const String& filename 表示需要写入的文件名,必须要加上后缀,比如 test.jpg
  • 参数二:InputArray img 表示 Mat 类型的图像数据;
  • 参数三:const std::vector& params 表示为特定格式保存的参数编码,它有一个默认值 std::vector< int >(),所以一般情况下不用写。

以上内容,在 Python 中同样适用,Python 的语法格式如下。

# cv2.imwrite(存储路径,图像矩阵[,存盘标识])
cv2.imwrite(filename, img[, params])
  • 参数一:保存的路径及文件名;
  • 参数二:图像矩阵;
  • 参数三:针对特定的格式的存盘标识,对于 JPEG,其表示的是图像的质量,用 0-100 的整数表示,默认为 95。对于 PNG,第三个参数表示的是压缩级别。

存盘标识具体内容如下:

  1. cv2.CV_IMWRITE_JPEG_QUALITY 设置图片格式为.jpeg 或者.jpg 的图片质量,其值为 0—100(数值越大质量越高),默认 95;
  2. cv2.CV_IMWRITE_WEBP_QUALITY 设置图片的格式为.webp 格式的图片质量,值为 0–100;
  3. cv2.CV_IMWRITE_PNG_COMPRESSION 设置.png 格式的压缩比,其值为 0–9(数值越大,压缩比越大),默认为 3。

测试一段代码如下,读取图片,保存图片。

import cv2
img = cv2.imread("maoyan.jpg",0)

# cv2.imshow("maoyan.png",img)
# imwrite 保存图片
cv2.imwrite("maoyan_grayscale.jpg", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

成功保存一张灰度图。

还有一个可以查阅一下上面两张图的属性,在查看一些图像上的属性数据。

对于 jpg 格式的文件,imwrite 中第三个参数是设置图片质量,范围从 1~100,默认 95,越大画质越好,文件越大。

cv2.imwrite("maoyan_3.jpg", img, (cv2.IMWRITE_JPEG_QUALITY, 5))

整理就是质量越高,图片越清楚,质量越低,图片越模糊,但是图片占用空间变小。

其余的用法可以继续参考 官方手册 学习。

在检索第三方资料的时候,发现很多博主都写了下面一句话。

注意,cv2.IMWRITE_JPEG_QUALITY类型为 Long,必须转换成int。

橡皮擦实际试了一下,发现并不是 Long,如果有博友发现是其它原因,欢迎在评论区交流。(而且在 Python3 中已经移除掉 long 类型了)

imwrite 的坑

在学习过程中,imwrite 还真存在两个需要特别注意的地方,第一个就是中文路径问题,这个在很多编程场景中都存在。

先说读取,读取的时候也存在该问题。

import cv2
import numpy as np
# img = cv2.imread("./imgs/maoyan.jpg",-1)
img = cv2.imdecode(np.fromfile("./图像/maoyan.jpg",dtype=np.uint8),-1)

cv2.imshow("maoyan.png",img)

写入文件解决中文路径的问题,在测试的时候发现的第二个问题,如果目录文件不存在,OpenCV 不会自动创建目录。

# 保存图片中文路径问题
cv2.imencode('.jpg',img)[1].tofile("./图像_目录不存在/maoyan2.jpg")

今天的 OpenCV 尾声

1 个小时又过去了,对 Python OpenCV 图像写入相关的知识点,你掌握了吗?

空闲之余,可以订阅橡皮擦的爬虫百例课程学习爬虫知识。


如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞评论收藏

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。