C++ OpenCV學(xué)習(xí)之圖像金字塔與圖像融合詳解
1 金字塔
平時(shí)你聽(tīng)到、見(jiàn)到的金字塔是什么樣的?
這樣?
還是這樣?
實(shí)際上除了這些,還有圖像金字塔
圖像金字塔有什么用?為什么要稱作圖像金字塔?本文帶你研究這些問(wèn)題。
2 什么是圖像金字塔?
正如生物視覺(jué)系統(tǒng)會(huì)處理分層次的尺寸一樣,計(jì)算機(jī)視覺(jué)系統(tǒng)實(shí)現(xiàn)多分辨率圖像處理的基礎(chǔ)是圖像金字塔。
考慮這樣一個(gè)場(chǎng)景:輸入系統(tǒng)一幅圖像來(lái)檢測(cè)人臉。由于事先并不知道人臉在這張圖片中可能的尺寸,所以需要根據(jù)輸入生成一個(gè)不同大小圖像組成的金字塔(應(yīng)用時(shí)常用向量存儲(chǔ)),掃描不同層次來(lái)檢測(cè)可能的人臉。
此外,圖像金字塔在保持細(xì)節(jié)的條件下進(jìn)行圖像融合等多尺度編輯操作非常有用。
圖像金字塔分為兩種:
高斯金字塔
高斯金字塔是最基本的圖像金字塔,用于獲得原圖像尺度連續(xù)的的降采樣序列。高斯金字塔共分O組(Octave),每組分為S層(Layer)。組內(nèi)各層圖像分辨率相同但尺度逐層遞增;組間圖像按隔點(diǎn)降采樣取得。
拉普拉斯金字塔
拉普拉斯金字塔通過(guò)高斯差分得到殘差圖像序列,用于圖像重建、圖像融合、特征點(diǎn)檢測(cè)等。具體做法如圖所示:構(gòu)造高斯金字塔,每組圖像內(nèi)相鄰兩層相減得到殘差圖像序列,從而得到拉普拉斯金字塔。所以高斯金字塔每組有s+3層,而拉普拉斯金字塔每組只有s層。
3 圖像金字塔有什么用?
前面已經(jīng)提到,圖像金字塔的作用主要有:
- 圖像重建
- 圖像多尺度特征檢測(cè)
- 圖像修復(fù)
- 圖像融合
- …
下面給出一個(gè)基于圖像金字塔的圖像融合算法。
1.選擇待融合圖像A與B,以及融合掩碼M,并重采樣使之具有相同大??;
2.分別取得A、B的拉普拉斯金字塔,以及M的高斯金字塔;
3.使用M的高斯金字塔作為加權(quán),對(duì)A、B的每層特征進(jìn)行融合,得到融合金字塔;
4.融合金字塔仍為拉普拉斯金字塔,對(duì)其圖像重建得到融合圖像。
上面的圖可能有點(diǎn)抽象,看看下面的例子。
4 OpenCV實(shí)戰(zhàn)圖像金字塔
主函數(shù)非常簡(jiǎn)單易懂
int main() { Mat img_1 = imread("1.jpg", 1); Mat img_2 = imread("2.jpg", 1); Mat dstImg; imgFusion(img_1, img_2, dstImg, 0.2); waitKey(0); return 0; }
試試效果
原圖
融合效果圖
是不是毫無(wú)違和感?其中關(guān)鍵的融合函數(shù)imgFusion()具體是如何實(shí)現(xiàn)的呢?
void imgFusion(Mat leftImg, Mat rightImg, Mat& dstImg, float threshold) { vector<Mat> gaussPyrLeft, gaussPyrRight, laplacePyrLeft, laplacePyrRight; // 聲明高斯金字塔數(shù)據(jù)結(jié)構(gòu) vector<Mat> maskGaussPyr; // 聲明掩碼的高斯金字塔 vector<Mat> blendLapPyr; // 聲明融合拉普拉斯金字塔 Mat imgHighest; // 聲明圖像融合的起點(diǎn)圖像 Mat mask = Mat::zeros(PYRHEIGHT, PYRWIDTH, CV_32FC1); // 構(gòu)造掩碼,大小與金字塔原圖像相同 mask(Range::all(), Range(mask.cols * threshold, mask.cols)) = 1.0; cvtColor(mask, mask, COLOR_GRAY2BGR); // 將掩碼顏色通道拓展,以適配原圖像 buildGaussPyr(mask, maskGaussPyr, 3); // 建立掩碼的高斯金字塔 resize(leftImg, leftImg, Size(PYRWIDTH, PYRHEIGHT)); resize(rightImg, rightImg, Size(PYRWIDTH, PYRHEIGHT)); leftImg.convertTo(leftImg, CV_32F); //轉(zhuǎn)換成CV_32F, 用于和mask類型匹配,且CV_32F 類型精度高, 有利于計(jì)算 rightImg.convertTo(rightImg, CV_32F); // 建立高斯金字塔與拉普拉斯金字塔 buildGaussPyr(leftImg, gaussPyrLeft, 3); buildGaussPyr(rightImg, gaussPyrRight, 3); buildLaplacePyr(gaussPyrLeft, laplacePyrLeft, 3); buildLaplacePyr(gaussPyrRight, laplacePyrRight, 3); // 確定起點(diǎn)圖像 imgHighest = gaussPyrLeft.back().mul(maskGaussPyr.back()) + ((gaussPyrRight.back()).mul(Scalar(1.0, 1.0, 1.0) - maskGaussPyr.back())); // 融合拉普拉斯金字塔 blendLaplacePyr(laplacePyrLeft, laplacePyrRight, maskGaussPyr, blendLapPyr); // 融合圖像重建 dstImg = imgLaplaceBlend(imgHighest, blendLapPyr); dstImg.convertTo(dstImg, CV_8UC3); imshow("imgProcess::seamOpt_laplace", dstImg); }
完整源碼 提取碼:1234
到此這篇關(guān)于C++ OpenCV學(xué)習(xí)之圖像金字塔與圖像融合詳解的文章就介紹到這了,更多相關(guān)C++ OpenCV圖像金字塔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 數(shù)字的反轉(zhuǎn)實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了C++ 數(shù)字的反轉(zhuǎn)實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06C++ 使用VS Code運(yùn)行程序時(shí)終端輸出中文亂碼的解決辦法
這篇文章主要介紹了C++ 使用VS Code運(yùn)行程序時(shí)終端輸出中文亂碼的解決辦法 ,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07C語(yǔ)言中關(guān)于計(jì)算字符串長(zhǎng)度的幾種方式
這篇文章主要介紹了C語(yǔ)言中關(guān)于計(jì)算字符串長(zhǎng)度的幾種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08數(shù)據(jù)結(jié)構(gòu)之Treap詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之Treap詳解,本文講解了Treap的基本知識(shí)、Treap的基本操作、Treap的高級(jí)操作技巧等,需要的朋友可以參考下2014-08-08c++中的字節(jié)序與符號(hào)位的問(wèn)題
這篇文章主要介紹了c++中的字節(jié)序與符號(hào)位的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法(路徑規(guī)劃算法)
這篇文章主要介紹了C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法,RRT算法整體框架主要分為rand、near、new三點(diǎn)的建立和near與new之間的安全性檢查,需要的朋友可以參考下2022-05-05使用C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組Vector
這篇文章主要為大家詳細(xì)介紹了使用C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組Vector的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01C++?中的?JSON?序列化和反序列化及結(jié)構(gòu)體與枚舉類型的處理方法
在?C++?編程中,處理?JSON?數(shù)據(jù)是一項(xiàng)常見(jiàn)任務(wù),特別是在需要與其他系統(tǒng)或前端進(jìn)行數(shù)據(jù)交換時(shí),本文將詳細(xì)介紹如何使用?nlohmann::json?庫(kù)對(duì)結(jié)構(gòu)體和枚舉類型進(jìn)行序列化和反序列化,感興趣的朋友一起看看吧2024-11-11