opencv gdal保存多波段tif opencv保存图像函数_数据分析

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()

成功保存一张灰度图。

opencv gdal保存多波段tif opencv保存图像函数_opencv gdal保存多波段tif_02


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

opencv gdal保存多波段tif opencv保存图像函数_人工智能_03


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

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

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

opencv gdal保存多波段tif opencv保存图像函数_opencv_04


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

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

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

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

opencv gdal保存多波段tif opencv保存图像函数_python_05

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")