📜  OpenCV-存储图像(1)

📅  最后修改于: 2023-12-03 14:44:54.354000             🧑  作者: Mango

OpenCV-存储图像

OpenCV是一个开源的计算机视觉库,允许使用C++、Python、Java等多种编程语言进行编程,其中包含了很多计算机视觉相关的操作,包括图像处理、图像识别、目标检测等。

在OpenCV中,存储图像也是一项非常重要的操作。本篇文章将向您介绍如何在OpenCV中存储图像,并提供一些示例代码帮助您更好地理解这一过程。

存储图像

在OpenCV中,可以使用imwrite()函数将图像保存到硬盘上。该函数提供了多种图像格式的支持,包括bmp、jpeg、png等。

bool imwrite ( const string &filename, InputArray img, const vector<int> &params = vector<int>() );

其中,filename是要保存的文件名,img是要保存的图像矩阵,params是保存选项。

示例代码:

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
    Mat image = imread("test.jpg");
    imwrite("new_image.jpg", image);
    return 0;
}

在这个例子中,我们使用imread()函数将test.jpg图像读入到内存中,然后使用imwrite()函数将该图像保存为new_image.jpg。

保存选项

除了上述示例代码中使用的默认参数外,imwrite()函数还可以提供一些选项以便更好地控制保存结果。

参数列表

在保存图像时,可以使用一个名为params的可选参数列表来传递保存选项。该参数需要使用一个vector类型的变量来存储传递的选项。

示例代码:

vector<int> params;
params.push_back(IMWRITE_JPEG_QUALITY);
params.push_back(100);
imwrite("new_image.jpg", image, params);

在这个例子中,我们使用IMWRITE_JPEG_QUALITY选项来指定JPEG图像的质量。该选项指定的值类型为int,可以在0到100之间取值。0表示最低质量,100则表示最高质量。

上述代码将JPEG图像质量设定为100,并保存到硬盘上。同样,我们还可以使用其他的选项来控制保存结果。

JPEG选项

对于JPEG格式的图像,可以使用以下的保存选项:

  • IMWRITE_JPEG_QUALITY:指定保存JPEG图像的质量。取值范围为0到100,默认值为95。

  • IMWRITE_JPEG_PROGRESSIVE:指定JPEG图像是否为渐进式。如果该值为1,则指定为渐进式;否则,指定为非渐进式。默认值为0。

  • IMWRITE_JPEG_OPTIMIZE:指定JPEG图像是否进行优化。如果该值为1,则对图像进行优化;否则,不对图像进行优化。默认值为0。

  • IMWRITE_JPEG_RST_INTERVAL:指定每个重启间隔使用的DCT系数数量。该值越小,则图像文件大小越小,但图像质量可能会下降。默认值为0(表示没有重启)。

  • IMWRITE_JPEG_LUMA_QUALITY:指定亮度的压缩质量。取值范围为0到100。默认值为0。

  • IMWRITE_JPEG_CHROMA_QUALITY:指定色度的压缩质量。取值范围为0到100。默认值为0。

PNG选项

对于PNG格式的图像,可以使用以下的保存选项:

  • IMWRITE_PNG_COMPRESSION:指定PNG图像的压缩级别。取值范围为0到9,0表示没有压缩(文件最大),9表示最大压缩(文件最小)。默认值为1。

  • IMWRITE_PNG_STRATEGY:指定PNG压缩策略。可以选择3种选项:

    • IMWRITE_PNG_STRATEGY_DEFAULT:默认压缩策略。该选项可以产生最快的压缩速度。

    • IMWRITE_PNG_STRATEGY_FILTERED:使用过滤器来进行压缩,以便产生更好的压缩结果。

    • IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY:只使用霍夫曼编码进行压缩。

  • IMWRITE_PNG_BILEVEL:当该值为1时,将PNG格式转换为1位的二值图像。默认值为0。

  • IMWRITE_PNG_STRATEGY_FIXED:指定使用固定的压缩策略。

示例

下面提供一个示例代码,展示如何使用不同的选项保存图像。

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
    Mat image = imread("test.jpg");
  
    // 保存为JPEG图像,并指定质量为100
    vector<int> params_jpeg;
    params_jpeg.push_back(IMWRITE_JPEG_QUALITY);
    params_jpeg.push_back(100);
    imwrite("new_image.jpg", image, params_jpeg);
  
    // 保存为非渐进式JPEG图像,使用优化,并设置重启间隔
    vector<int> params_jpeg_optimize_progressive;
    params_jpeg_optimize_progressive.push_back(IMWRITE_JPEG_QUALITY);
    params_jpeg_optimize_progressive.push_back(95);
    params_jpeg_optimize_progressive.push_back(IMWRITE_JPEG_PROGRESSIVE);
    params_jpeg_optimize_progressive.push_back(0);
    params_jpeg_optimize_progressive.push_back(IMWRITE_JPEG_OPTIMIZE);
    params_jpeg_optimize_progressive.push_back(1);
    params_jpeg_optimize_progressive.push_back(IMWRITE_JPEG_RST_INTERVAL);
    params_jpeg_optimize_progressive.push_back(10);
    imwrite("new_image_optimize_progressive.jpg", image, params_jpeg_optimize_progressive);
  
    // 保存为渐进式JPEG图像,并指定重启间隔
    vector<int> params_jpeg_progressive;
    params_jpeg_progressive.push_back(IMWRITE_JPEG_QUALITY);
    params_jpeg_progressive.push_back(95);
    params_jpeg_progressive.push_back(IMWRITE_JPEG_PROGRESSIVE);
    params_jpeg_progressive.push_back(1);
    params_jpeg_progressive.push_back(IMWRITE_JPEG_RST_INTERVAL);
    params_jpeg_progressive.push_back(10);
    imwrite("new_image_progressive.jpg", image, params_jpeg_progressive);
  
    // 保存为PNG图像,并指定压缩级别
    vector<int> params_png;
    params_png.push_back(IMWRITE_PNG_COMPRESSION);
    params_png.push_back(9);
    imwrite("new_image.png", image, params_png);
  
    return 0;
}

在这个示例中,我们首先使用默认选项保存图像为new_image.jpg。然后,我们使用不同的选项保存图像为JPEG和PNG格式,并设置不同的选项,以便更好地控制保存结果。