近日在用opencv作一些图像处理的操做时,须要对一些高分辨率的图像进行保存。好比,在操做一个容量为230M的图像后,并对该图像保存为JPG格式后,发现图像容量变为80M了!针对这个问题,忙了大半天,处处翻阅资料,终于知道为何了。网络
先举个例子说明本身遇到的问题,为了看出效果,我特地用了一个高分辨率的图片作实验。函数
好比我有以下的一个233M的图片
ui
通过下面的程序读进内存,再次保存后,图片容量就急剧变小了!编码
#include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; int main(int argc, char** argv) { Mat img = imread("src1.jpg"); imwrite("test.jpg", img); return 0; }
保存后的图片,只剩下126M了!怎么回事!我什么都没作啊,图片大小怎么就大大缩水了呢?
spa
经过翻阅一些资料才知道,原来是图片格式惹得祸。其实有些图片格式是自带压缩的,好比jpg格式,而bmp格式的图片是不带任何压缩,这就是每种图片的特色,若是对这些知识点不清楚的话,很容易踩坑!平时咱们操做的图像大小大多数都以KB为单位,因此通过一番“隐形压缩”后咱们很难发现图片大小变小了,可是,当咱们操做大图的时候,这种压缩效果一会儿就看出来了。code
那么若是咱们在使用imwrite保存图片时想提升保存图片的质量,该如何操做?blog
要改变保存的图片的质量,关键在于imwrite函数的第三个参数。图片
先看imwrite的声明内存
CV_EXPORTS_W bool imwrite( const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
第三个参数说明:const std::vector
对于JPEG格式的图片,这个参数表示从0-100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95.
对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0-9.较高的值意味着更小的尺寸和更长的压缩时间而默认值是3.
对于PPM,PGM或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,而默认值为1.
opencv的imwrite默认存储的jpg图片质量为95,若是想进一步提升保存图片的质量,能够这么写
#include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; int main(int argc, char** argv) { Mat img = imread("src1.jpg"); vector<int> compression_params; compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); //选择jpeg compression_params.push_back(100); //在这个填入你要的图片质量 imwrite("test2.jpg", img, compression_params); return 0; }
能够看出,通过参数调整后,jpg格式保存的图片的大小有了很大的提高。
可是不管如何,以jpg格式保存图片仍是不能百分百保存原图像的!
可是即便咱们把图片质量写成100,图片质量跟原图仍是右必定压缩的,好比原图233M,读入再保存为jpg格式容量就变为229M。
那当咱们不断读入图片,又不断存储图片为jpg格式,图片的质量就会不断下降!
因此有如下总结:
第一,opencv的存储图片函数imwrite是能够经过第三个函数参数来调整保存图片的压缩比的,好比保存图片为jpg格式,咱们若是咱们写成
第二,jpg格式的图片读进内存,若是再保存为jpg格式后,容量会被压缩的,这是jpg格式的特性,怎么调整压缩比都避免不了失真(损失图片质量)。
若是操做的而是png格式的图像,咱们一样能够调整其保存的质量。
#include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; int main(int argc, char** argv) { Mat img = imread("src1.jpg"); vector<int> compression_params; compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); //PNG格式图片的压缩级别 compression_params.push_back(9); //这里设置保存的图像质量级别 imwrite("test3.png", img,compression_params); return 0; }
那如何不损失图片质量地保存图片,那就得将图片保存为其余格式的图片了。如今,就简单介绍一下我最经常使用的图片格式以及他们的特色:
位图(外语简称:BMP、外语全称:BitMaP)BMP是一种与硬件设备无关的图像文件格式,使用很是广。它采用位映射存储格式,除了图像深度可选之外,不采用其余任何压缩,所以,BMP文件所占用的空间很大。
联合照片专家组(外语简称JPEG外语全称:Joint Photographic Expert Group)JPEG也是最多见的一种图像格式,它是由联合照片专家组(外语全称:Joint Photographic Experts Group),文件后辍名为".jpg"或".jpeg",是最经常使用的图像文件格式,由一个软件开发联合会组织制定,是一种有损压缩格式,可以将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,所以容易形成图像数据的损伤。尤为是使用太高的压缩比例,将使最终解压缩后恢复的图像质量明显下降,若是追求高品质图像,不宜采用太高压缩比例。可是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在得到极高的压缩率的同时能展示十分丰富生动的图像,换句话说,就是能够用最少的磁盘空间获得较好的图像品质。并且JPEG是一种很灵活的格式,具备调节图像质量的功能,容许用不一样的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率一般在10:1到40:1之间,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。
便携式网络图形(外语简称PNG、外语全称:Portable Network Graphics),是网上接受的最新图像文件格式。PNG可以提供长度比GIF小30%的无损压缩图像文件。它同时提供24位和48位真彩色图像支持以及其余诸多技术性支持。因为PNG很是新,因此并非全部的程序均可以用它来存储图像文件,但Photoshop能够处理PNG图像文件,也能够用PNG图像文件格式存储。