近日在用opencv做一些圖像處理的操作時,需要對一些高分辨率的圖像進行保存。比如,在操作一個容量為230M的圖像后,并對該圖像保存為JPG格式后,發(fā)現(xiàn)圖像容量變?yōu)?0M了!針對這個問題,忙了大半天,到處翻閱資料,終于知道為什么了。

先舉個例子說明自己遇到的問題,為了看出效果,我特意用了一個高分辨率的圖片做實驗。

比如我有如下的一個233M的圖片
iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

經(jīng)過下面的程序讀進內(nèi)存,再次保存后,圖片容量就急劇變小了!

#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了!怎么回事!我什么都沒做啊,圖片大小怎么就大大縮水了呢?
iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

通過翻閱一些資料才知道,原來是圖片格式惹得禍。其實有些圖片格式是自帶壓縮的,比如jpg格式,而bmp格式的圖片是不帶任何壓縮,這就是每種圖片的特點,如果對這些知識點不清楚的話,很容易踩坑!平時我們操作的圖像大小大多數(shù)都以KB為單位,所以經(jīng)過一番“隱形壓縮”后我們很難發(fā)現(xiàn)圖片大小變小了,但是,當我們操作大圖的時候,這種壓縮效果一下子就看出來了。

那么如果我們在使用imwrite保存圖片時想提高保存圖片的質(zhì)量,該如何操作?

要改變保存的圖片的質(zhì)量,關(guān)鍵在于imwrite函數(shù)的第三個參數(shù)。

先看imwrite的聲明

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

第三個參數(shù)說明:const std::vector

  • 對于JPEG格式的圖片,這個參數(shù)表示從0-100的圖片質(zhì)量(CV_IMWRITE_JPEG_QUALITY),默認值是95.

  • 對于PNG格式的圖片,這個參數(shù)表示壓縮級別(CV_IMWRITE_PNG_COMPRESSION)從0-9.較高的值意味著更小的尺寸和更長的壓縮時間而默認值是3.

  • 對于PPM,PGM或PBM格式的圖片,這個參數(shù)表示一個二進制格式標志(CV_IMWRITE_PXM_BINARY),取值為0或1,而默認值為1.

調(diào)整jpg圖像格式的保存質(zhì)量

opencv的imwrite默認存儲的jpg圖片質(zhì)量為95,如果想進一步提高保存圖片的質(zhì)量,可以這么寫

#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); //在這個填入你要的圖片質(zhì)量

    imwrite("test2.jpg", img, compression_params);    return 0;
}

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

可以看出,經(jīng)過參數(shù)調(diào)整后,jpg格式保存的圖片的大小有了很大的提升。

但是無論如何,以jpg格式保存圖片還是不能百分百保存原圖像的!

但是即使我們把圖片質(zhì)量寫成100,圖片質(zhì)量跟原圖還是右一定壓縮的,比如原圖233M,讀入再保存為jpg格式容量就變?yōu)?29M。

那當我們不斷讀入圖片,又不斷存儲圖片為jpg格式,圖片的質(zhì)量就會不斷降低!

所以有以下總結(jié):

第一,opencv的存儲圖片函數(shù)imwrite是可以通過第三個函數(shù)參數(shù)來調(diào)整保存圖片的壓縮比的,比如保存圖片為jpg格式,我們?nèi)绻覀儗懗?/p>

第二,jpg格式的圖片讀進內(nèi)存,如果再保存為jpg格式后,容量會被壓縮的,這是jpg格式的特性,怎么調(diào)整壓縮比都避免不了失真(損失圖片質(zhì)量)。

調(diào)整PNG圖像格式的保存質(zhì)量

如果操作的而是png格式的圖像,我們同樣可以調(diào)整其保存的質(zhì)量。

#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);  //這里設(shè)置保存的圖像質(zhì)量級別

    imwrite("test3.png", img,compression_params);    return 0;
}

那如何不損失圖片質(zhì)量地保存圖片,那就得將圖片保存為其他格式的圖片了。現(xiàn)在,就簡單介紹一下我最常用的圖片格式以及他們的特點:

BMP格式(無壓縮)

位圖(外語簡稱:BMP、外語全稱:BitMaP)BMP是一種與硬件設(shè)備無關(guān)的圖像文件格式,使用非常廣。它采用位映射存儲格式,除了圖像深度可選以外,不采用其他任何壓縮,因此,BMP文件所占用的空間很大。

JPEG格式(有損壓縮)

聯(lián)合照片專家組(外語簡稱JPEG外語全稱:Joint Photographic Expert Group)JPEG也是最常見的一種圖像格式,它是由聯(lián)合照片專家組(外語全稱:Joint Photographic Experts Group),文件后輟名為".jpg"或".jpeg",是最常用的圖像文件格式,由一個軟件開發(fā)聯(lián)合會組織制定,是一種有損壓縮格式,能夠?qū)D像壓縮在很小的儲存空間,圖像中重復(fù)或不重要的資料會被丟失,因此容易造成圖像數(shù)據(jù)的損傷。尤其是使用過高的壓縮比例,將使最終解壓縮后恢復(fù)的圖像質(zhì)量明顯降低,如果追求高品質(zhì)圖像,不宜采用過高壓縮比例。但是JPEG壓縮技術(shù)十分先進,它用有損壓縮方式去除冗余的圖像數(shù)據(jù),在獲得極高的壓縮率的同時能展現(xiàn)十分豐富生動的圖像,換句話說,就是可以用最少的磁盤空間得到較好的圖像品質(zhì)。而且JPEG是一種很靈活的格式,具有調(diào)節(jié)圖像質(zhì)量的功能,允許用不同的壓縮比例對文件進行壓縮,支持多種壓縮級別,壓縮比率通常在10:1到40:1之間,壓縮比越大,品質(zhì)就越低;相反地,壓縮比越小,品質(zhì)就越好。

PNG格式(無損壓縮)

便攜式網(wǎng)絡(luò)圖形(外語簡稱PNG、外語全稱:Portable Network Graphics),是網(wǎng)上接受的最新圖像文件格式。PNG能夠提供長度比GIF小30%的無損壓縮圖像文件。它同時提供24位和48位真彩色圖像支持以及其他諸多技術(shù)性支持。由于PNG非常新,所以并不是所有的程序都可以用它來存儲圖像文件,但Photoshop可以處理PNG圖像文件,也可以用PNG圖像文件格式存儲。

http://www.cnblogs.com/skyfsm/p/7136709.html