近日在用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圖像文件格式存儲。