OpenCV中原始图像加载与保存压缩技巧

加载图像

OpenCV中关于图像读写有两个函数imread与imwrite,imread加载的时候支持灰度图像、彩色图像、原始图像加载,默认情况下通过imread加载的图像都是三通道的BGR彩色图像。 但是实际上OpenCV支持加载任意通道的图像,首先来仔细再看一下imread函数

Mat cv::imread(
    const String &  filename,
    int flags = IMREAD_COLOR 
)

在不修改第二个参数flags的默认值情况下,我们经常这样使用该函数:

Mat image = imread("D:/images/test.png");
if (image.empty()) {
    printf("could not load image...\n");
    return -1;
}

当我们需要把加载图像始终以灰度图像出现时候:

Mat gray = imread("D:/images/dannis2.jpg", IMREAD_GRAYSCALE);
if (gray.empty()) {
    printf("could not load image...\n");
    return -1;
}

当我们需要把具有透明通道或者任意通道的图像加载进来不做任何改变时候:

Mat anycolor = imread("D:/images/test1.png", IMREAD_ANYCOLOR);
if (anycolor.empty()) {
    printf("could not load image...\n");
    return -1;
}

保存与压缩图像

一般情况下保存图像调用imwrite只会设置两个参数,但是实际上它还有第三个默认参数可以设置,这个参数可以帮助调整图像的压缩质量与保存图像的位图深度与通道数目,当我们不想保存为默认的三通道彩色图像的时候,我们就需要使用第三个参数来对保存图像进行有针对性的写入图像文件。首先我们需要重新认识一下imwrite这个函数。

bool cv::imwrite(
    const String & filename,
    InputArray img,
    const std::vector<int> & params = std::vector<int>()
)

参数解释 filename 表示保存文件路径与名称,必须带图像文件扩展名 img 内存中Mat对象 params 保存图像文件时候需要优化的参数,默认为空

params解释

对于第三个参数params来说,当我们保存图像为不同格式时候,params参数的内容也是不一样的,当保存图像格式为PNG时候,调整压缩质量参数为

IMWRITE_PNG_COMPRESSION 等级为0~9之间,值越大压缩时间越长,默认为1。值越大,图像大小越小!

当保存图像格式为JPG时候,调整压缩质量参数为

IMWRITE_JPEG_QUALITY 等级为0~100之间,值越大图像质量越高,默认为95。值越大,图像大小也越大!

压缩与保存代码演示

保存为单通道灰度图像

// 保存为单通道灰度图像
vector<int> opts;
opts.push_back(IMWRITE_PAM_FORMAT_GRAYSCALE);
imwrite("D:/gray.png", gray, opts);
opts.clear();

保存为BGR彩色图像

imwrite("D:/image.png", image);

保存为PNG彩色压缩图像

Mat anycolor = imread("D:/images/test1.png", IMREAD_ANYCOLOR);
vector<int> opts;
opts.push_back(IMWRITE_PNG_COMPRESSION);
opts.push_back(9);
imwrite("D:/anycolor.png", anycolor, opts);

保存为JPG高压缩比图像

Mat src = imread("D:/images/lovely-girl.jpg", IMREAD_COLOR);
vector<int> opts;
opts.push_back(IMWRITE_JPEG_QUALITY);
opts.push_back(50);
opts.push_back(IMWRITE_JPEG_OPTIMIZE);
opts.push_back(1);
imwrite("D:/src.jpg", src, opts);

lovely-girl.jpg原图像大小:389KB OpenCV压缩保存之后大小:128KB

对比压缩前后的两张图,发现图像质量并没有明显下降,证明OpenCV通过此方式可以有效降低图像大小,在网络传输时候节省带宽资源!

保存PNG带透明通道的彩色图像

// 保存为四通道彩色图像
Mat bgra;
cvtColor(anycolor, bgra, COLOR_BGR2BGRA);
int h = anycolor.rows;
int w = anycolor.cols;
for (int row = 0; row < h; row++) {
    for (int col = 0; col < w; col++) {
        Vec4b pixel = bgra.at<Vec4b>(row, col);
        pixel[3] = 127;
        bgra.at<Vec4b>(row, col) = pixel;
    }
}
imshow("alpha-demo", bgra);
opts.clear();
opts.push_back(IMWRITE_PAM_FORMAT_RGB_ALPHA);
imwrite("D:/bgra.png", bgra, opts);

总结

使用imread与imwrite两个函数进行图像读写的时候,特别需要注意缺省的最后一个参数,它们可以有效的帮助开发者解决各种图像加载与压缩保存需求。

操千曲而后晓声,观千剑而后识器

原文发布于微信公众号 - OpenCV学堂(CVSCHOOL)

原文发表时间:2018-11-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法工程师

分布式TensorFlow入门教程

深度学习在各个领域实现突破的一部分原因是我们使用了更多的数据(大数据)来训练更复杂的模型(深度神经网络),并且可以利用一些高性能并行计算设备如GPU和FPGA来...

42930
来自专栏专知

【干货】手把手教你用苹果Core ML和Swift开发人脸目标识别APP

【导读】CoreML是2017年苹果WWDC发布的最令人兴奋的功能之一。它可用于将机器学习整合到应用程序中,并且全部脱机。CoreML提供的机器学习 API,包...

34660
来自专栏Petrichor的专栏

图像预处理: 规范化

25630
来自专栏贾志刚-OpenCV学堂

OpenCV 3.1.0中特征检测与描述算法接口改动

OpenCV从 2.4.x升级到3.x中有很多代码重构和性能提高,还有API接口的整合,以Feature2D及其扩展模块的特征检测与描述为例,在OpenCV2....

43380
来自专栏mathor

“达观杯”文本智能处理挑战赛

 由于提供的数据集较大,一般运行时间再10到15分钟之间,基础电脑配置在4核8G的样子(越消耗内存在6.2G),因此,一般可能会遇到内存溢出的错误

41320
来自专栏图像识别与深度学习

2018-06-30 TensorFlow实战:SoftMax手写体MNIST识别(Python完整源码)

16740
来自专栏null的专栏

数据处理——One-Hot Encoding

一、One-Hot Encoding One-Hot编码,又称为一位有效编码,主要是采用 ? 位状态寄存器来对 ? 个状态进行编码,每个状态都由他独立的寄存器...

39170
来自专栏机器之心

教程 | Adrian小哥教程:如何使用Tesseract和OpenCV执行OCR和文本识别

本教程将介绍如何使用 OpenCV OCR。我们将使用 OpenCV、Python 和 Tesseract 执行文本检测和文本识别。

74840
来自专栏AI研习社

GitHub项目推荐 | ChainerCV:计算机视觉中的深度学习图书馆

ChainerCV是一个使用Chainer训练和运行神经网络以进行计算机视觉任务的工具集合。

25850
来自专栏数据处理

绘制等高线

14950

扫码关注云+社区

领取腾讯云代金券