OpenCV提供了imwrite()函数,用于将Mat图像数据保存到文件中,支持多种图像格式。其函数原型如下:
bool cv::imwrite(
const String& filename, // 保存的文件路径(含扩展名)
InputArray img, // 要保存的图像(cv::Mat)
const std::vector<int>& params = std::vector<int>()// 编码参数(可选)
);返回值:true表示保存成功,false表示保存失败,可能的原因是路径无效、权限不足或格式不支持。imwrtie不会创建目录,所以路径中的文件夹必须已存在。
imwrite最基本的用法是保存为灰度图像和彩色图像。伪代码如下:
Mat image = cv::imread("input.jpg");
imwrite("output_color.jpg",image);//保存为彩色图像
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);//将彩色3通道图转换为灰度3通道图
imwrite("outpuit_gray.jpg."gray);//保存为灰度图像支持的图像格式
| 格式 | 扩展名 | 特点 | 
| JPEG | .jpg/.jpeg | 有损压缩,支持质量参数(1-100),默认95。 | 
| PNG | .png | 无损压缩,支持透明度(Alpha通道),压缩级别(0-9),默认3。 | 
| TIFF | .tif/.tiff | 支持多页、高位深(16/32位)。 | 
| BMP | .bmp | 无压缩,文件较大。 | 
| WebP | .webp | 支持有损/无损压缩,需编译时启用 WebP 支持。 | 
关于高级参数设置(params)
imwrite的第3个参数为可选参数。这些参数实际是一个ImwriteFlags枚举类型,它的定义和介绍如下
enum ImwriteFlags {
       IMWRITE_JPEG_QUALITY        = 1,  //!< For JPEG, it can be a quality from 0 to 100 (the higher is the better). Default value is 95.
       IMWRITE_JPEG_PROGRESSIVE    = 2,  //!< Enable JPEG features, 0 or 1, default is False.
       IMWRITE_JPEG_OPTIMIZE       = 3,  //!< Enable JPEG features, 0 or 1, default is False.
       IMWRITE_JPEG_RST_INTERVAL   = 4,  //!< JPEG restart interval, 0 - 65535, default is 0 - no restart.
       IMWRITE_JPEG_LUMA_QUALITY   = 5,  //!< Separate luma quality level, 0 - 100, default is -1 - don't use.
       IMWRITE_JPEG_CHROMA_QUALITY = 6,  //!< Separate chroma quality level, 0 - 100, default is -1 - don't use.
       IMWRITE_PNG_COMPRESSION     = 16, //!< For PNG, it can be the compression level from 0 to 9. A higher value means a smaller size and longer compression time. If specified, strategy is changed to IMWRITE_PNG_STRATEGY_DEFAULT (Z_DEFAULT_STRATEGY). Default value is 1 (best speed setting).
       IMWRITE_PNG_STRATEGY        = 17, //!< One of cv::ImwritePNGFlags, default is IMWRITE_PNG_STRATEGY_RLE.
       IMWRITE_PNG_BILEVEL         = 18, //!< Binary level PNG, 0 or 1, default is 0.
       IMWRITE_PXM_BINARY          = 32, //!< For PPM, PGM, or PBM, it can be a binary format flag, 0 or 1. Default value is 1.
       IMWRITE_EXR_TYPE            = (3 << 4) + 0, /* 48 */ //!< override EXR storage type (FLOAT (FP32) is default)
       IMWRITE_EXR_COMPRESSION     = (3 << 4) + 1, /* 49 */ //!< override EXR compression type (ZIP_COMPRESSION = 3 is default)
       IMWRITE_WEBP_QUALITY        = 64, //!< For WEBP, it can be a quality from 1 to 100 (the higher is the better). By default (without any parameter) and for quality above 100 the lossless compression is used.
       IMWRITE_PAM_TUPLETYPE       = 128,//!< For PAM, sets the TUPLETYPE field to the corresponding string value that is defined for the format
       IMWRITE_TIFF_RESUNIT        = 256,//!< For TIFF, use to specify which DPI resolution unit to set; see libtiff documentation for valid values
       IMWRITE_TIFF_XDPI           = 257,//!< For TIFF, use to specify the X direction DPI
       IMWRITE_TIFF_YDPI           = 258,//!< For TIFF, use to specify the Y direction DPI
       IMWRITE_TIFF_COMPRESSION    = 259,//!< For TIFF, use to specify the image compression scheme. See libtiff for integer constants corresponding to compression formats. Note, for images whose depth is CV_32F, only libtiff's SGILOG compression scheme is used. For other supported depths, the compression scheme can be specified by this flag; LZW compression is the default.
       IMWRITE_JPEG2000_COMPRESSION_X1000 = 272 //!< For JPEG2000, use to specify the target compression rate (multiplied by 1000). The value can be from 0 to 1000. Default is 1000.
     };因为OpenCV主要支持JPGE、PNG、TIFF和WebP几种格式的编码配置,且都定义在ImwriteFlags枚举中,所以需要分别以这几种图像格式来介绍这个枚举每一项所表示的含义。
1.JPEG格式参数
| 枚举值 | 数值 | 取值范围 | 说明 | 
| IMWRITE_JPEG_QUALITY | 1 | 0-100 | JPEG压缩质量(默认95),值越高画质越好,文件越大。 | 
| IMWRITE_JPEG_PROGRESSIVE | 2 | 0/1 | 启用渐进式JPEG(默认0),1表示支持渐进加载。 | 
| IMWRITE_JPEG_OPTIMIZE | 3 | 0/1 | 启用哈夫曼表优化(默认0),1可减小文件大小。 | 
| IMWRITE_JPEG_RST_INTERVAL | 4 | 0-65535 | 重启间隔(默认0),用于错误恢复,非零值会增大文件。 | 
| IMWRITE_JPEG_LUMA_QUALITY | 5 | 0-100 | 亮度(Y)通道单独质量(默认-1,不启用)。 | 
| IMWRITE_JPEG_CHROMA_QUALITY | 6 | 0-100 | 色度(CbCr)通道单独质量(默认-1,不启用)。 | 
例如,保存高质量JPEG并启用优化
std::vector<int> params = {
    IMWRITE_JPEG_QUALITY, 90,
    IMWRITE_JPEG_OPTIMIZE, 1
};
cv::imwrite("output.jpg", image, params);2.PNG格式参数
| 枚举值 | 数值 | 取值范围 | 说明 | 
| IMWRITE_PNG_COMPRESSION | 16 | 0-9 | 压缩级别(默认1),值越高压缩率越大但速度越慢。 | 
| IMWRITE_PNG_STRATEGY | 17 | 见 ImwritePNGFlags | 压缩策略(默认 IMWRITE_PNG_STRATEGY_RLE)。 | 
| IMWRITE_PNG_BILEVEL | 18 | 0/1 | 二值化PNG(默认0),1表示黑白二值图。 | 
例如保存高压缩PNG
std::vector<int> params = {
    IMWRITE_PNG_COMPRESSION, 9,
    IMWRITE_PNG_STRATEGY, IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY
};
cv::imwrite("output.png", image, params);3.TIFF格式参数
| 枚举值 | 数值 | 说明 | 
| IMWRITE_TIFF_RESUNIT | 256 | 分辨率单位(如 RESUNIT_INCH=2)。 | 
| IMWRITE_TIFF_XDPI | 257 | X方向DPI值(默认-1)。 | 
| IMWRITE_TIFF_YDPI | 258 | Y方向DPI值(默认-1)。 | 
| IMWRITE_TIFF_COMPRESSION | 259 | 压缩格式(默认LZW,浮点图像强制用SGILOG)。 | 
例如,保存TIFF并设置DPI
std::vector<int> params = {
    IMWRITE_TIFF_RESUNIT, 2,  // 英寸为单位
    IMWRITE_TIFF_XDPI, 300,
    IMWRITE_TIFF_YDPI, 300
};
cv::imwrite("output.tiff", image, params);4.WebP格式参数
| 枚举值 | 数值 | 取值范围 | 说明 | 
| IMWRITE_WEBP_QUALITY | 64 | 1-100 | 质量(默认100),>100时使用无损压缩。 | 
例如,保存无损WebP
std::vector<int> params = {IMWRITE_WEBP_QUALITY, 101};
cv::imwrite("output.webp", image, params);5.其他格式参数
| 枚举值 | 数值 | 说明 | 
| IMWRITE_PXM_BINARY | 32 | PPM/PGM/PBM格式的二进制标志(默认1)。 | 
| IMWRITE_EXR_TYPE | 48 | EXR存储类型(默认FLOAT)。 | 
| IMWRITE_EXR_COMPRESSION | 49 | EXR压缩类型(默认ZIP_COMPRESSION)。 | 
| IMWRITE_PAM_TUPLETYPE | 128 | PAM格式的元组类型(如RGB、GRAYSCALE)。 | 
| IMWRITE_JPEG2000_COMPRESSION_X1000 | 272 | JPEG2000压缩率(默认1000=无损)。 | 
这些参数都是通过std::vector<int>传递,格式为{参数ID, 参数值}。例如:
std::vector<int> params = {IMWRITE_JPEG_QUALITY, 85};若文章对您有帮助,可以激励一下我哦,祝您平安幸福!
| 微信 | 支付宝 | 
|---|---|
|  |  |