實(shí)操教程|OpenCV中保存不同深度圖像的技巧

極市導(dǎo)讀
?本文詳解了OpenCV中保存不同深度圖像的兩種方法。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺的最前沿
什么是圖像深度
很多人開始學(xué)習(xí)OpenCV之后,接觸前面幾個(gè)API就包括imwrite函數(shù),而且很快知道了如何去保存Mat對(duì)象為圖像,常規(guī)代碼如下:
imwrite("D:/result.png?",?dst);
其中dst是Mat對(duì)象。
這樣保存的圖像默認(rèn)是每個(gè)通道8位的字節(jié)圖像,常見的RGB圖像是圖像深度為24,這個(gè)可以通過(guò)windows下查看圖像屬性獲得,截圖如下:

如果每個(gè)通道占16位的話,RGB圖像深度就會(huì)變成48,如果每個(gè)通道占32位的話,深度就會(huì)變成96,顯然圖像深度越大,圖像文件也會(huì)越多,加載時(shí)候消耗的內(nèi)存也會(huì)越多,所以O(shè)penCV中默認(rèn)讀寫圖像都是每個(gè)通道8位(單字節(jié))圖像。
重溫imwrite函數(shù)
假設(shè)我們想保存圖像為16位或者32位浮點(diǎn)數(shù)圖像時(shí)候,我們?cè)撛趺慈プ?,在開始之前我們首先再次復(fù)習(xí)一下OpenCV中保存圖像的API函數(shù)-imwrite
bool?cv::imwrite(
???const?String?&??filename,
???InputArray?img,
???const?std::vector?&??params?=?std::vector()
)
Filename?參數(shù)為聲明的文件保存路徑
Img參數(shù)表示的是將要保存的Mat圖像對(duì)象
Params?表示的是保存圖像時(shí)的選項(xiàng),
這些選項(xiàng)包括PNG/JPG/WEBP/TIFF壓縮質(zhì)量、格式選擇等,可以分為如下四個(gè)大類
ImwriteEXRTypeFlags
ImwriteFlags
ImwritePAMFlags
ImwritePNGFlags,
之前寫過(guò)一篇文章是關(guān)于在保持時(shí)候如何使用這些選項(xiàng)對(duì)圖像進(jìn)行適當(dāng)?shù)膲嚎s處理,這里關(guān)于Params參數(shù)使用方式就不再贅述,主要是基于key-value方式添加到vector中去即可。
imwrite函數(shù)在關(guān)于保存為不同深度格式時(shí)候的圖像類型支持說(shuō)明如下:
8位的圖像(CV_8U),支持png/jpg/bmp/webp等各種常見圖像格式
16位的圖像(CV_16U),支持png/jpeg2000/TIFF格式
32位的圖像(CV_32F),支持PFM/TIFF/OpenEXR/TIFF/HDR
在要保存為指定格式之前,可以通過(guò)convertTo或者cvtCOLOR進(jìn)行圖像類型或者通道轉(zhuǎn)換之后,再調(diào)用imwrite進(jìn)行保存。
各種不同深度保存
16位圖像保存
轉(zhuǎn)換之后,如果直接保存,代碼如下:
//?加載圖像
Mat?src?=?imread("D:/flower.png",?IMREAD_UNCHANGED);
printf("depth?%d?\n",?src.depth());
//?轉(zhuǎn)為為16位圖像
Mat?dst;
src.convertTo(dst,?CV_16U);
imshow("flower16",?dst);
imwrite("D:/flower-16.png",?dst);
轉(zhuǎn)換之后,歸一化之后再保存,代碼如下:
//?加載圖像
Mat?src?=?imread("D:/flower.png",?IMREAD_UNCHANGED);
printf("depth?%d?\n",?src.depth());
//?轉(zhuǎn)為為16位圖像
Mat?dst;
src.convertTo(dst,?CV_16U);
//?歸一化再保存
normalize(dst,?dst,?0,?256?*?256,?NORM_MINMAX);
imwrite("D:/flower-16.png",?dst);
imshow("flower-16",?dst);
兩者效果對(duì)比如下:

32位圖像保存
//?加載圖像
Mat?src?=?imread("D:/flower.png",?IMREAD_UNCHANGED);
printf("depth?%d?\n",?src.depth());
//?轉(zhuǎn)為為16位圖像
Mat?dst;
src.convertTo(dst,?CV_32F);
//?歸一化再保存
normalize(dst,?dst,?0,?1.0,?NORM_MINMAX);
imwrite("D:/flower-32.png",?dst);
imshow("flower-32",?dst);
對(duì)上述各種不同深度的圖像,必須通過(guò)下面的方式才可以正確讀取
Mat?src?=?imread("D:/flower.png",?IMREAD_UNCHANGED);
其中IMREAD_UNCHANGED表示不對(duì)原圖像做任何改變。
公眾號(hào)后臺(tái)回復(fù)“數(shù)據(jù)集”獲取30+深度學(xué)習(xí)數(shù)據(jù)集下載~

#?CV技術(shù)社群邀請(qǐng)函?#

備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測(cè)-深圳)
即可申請(qǐng)加入極市目標(biāo)檢測(cè)/圖像分割/工業(yè)檢測(cè)/人臉/醫(yī)學(xué)影像/3D/SLAM/自動(dòng)駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群
每月大咖直播分享、真實(shí)項(xiàng)目需求對(duì)接、求職內(nèi)推、算法競(jìng)賽、干貨資訊匯總、與?10000+來(lái)自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動(dòng)交流~

