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,并重采樣使之具有相同大?。?/p>
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)文章希望大家以后多多支持腳本之家!
- C++標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)之weak_ptr智能指針用法詳解
- C++ 學(xué)習(xí)筆記實(shí)戰(zhàn)寫(xiě)一個(gè)簡(jiǎn)單的線程池示例
- C++學(xué)習(xí)之如何進(jìn)行內(nèi)存資源管理
- C++中set的用法學(xué)習(xí)
- C++學(xué)習(xí)之命名空間詳解
- C++學(xué)習(xí)之異常機(jī)制詳解
- C++序列操作函數(shù)學(xué)習(xí)最全指南
- C++ OpenCV學(xué)習(xí)之圖像像素值統(tǒng)計(jì)
- C/C++ 多線程的學(xué)習(xí)心得總結(jié)
- C++中的while循環(huán)和for循環(huán)語(yǔ)句學(xué)習(xí)教程
- C++ 學(xué)習(xí)之旅 Windows程序內(nèi)部運(yùn)行原理
- C++入門之基礎(chǔ)語(yǔ)法學(xué)習(xí)教程
- C++ 入門指南:零基礎(chǔ)入門教學(xué)
相關(guān)文章
c語(yǔ)言中單引號(hào)和雙引號(hào)的區(qū)別(順利解決從字符串中提取IP地址的困惑)
c語(yǔ)言中的單引號(hào)和雙引號(hào)可是有很大區(qū)別的,使用之前一定要了解他們之間到底有什么不同,下面小編就給大家詳細(xì)的介紹一下吧,對(duì)此還不是很了解的朋友可以過(guò)來(lái)參考下2013-07-07
詳談c++11 final與override說(shuō)明符
下面小編就為大家?guī)?lái)一篇詳談c++11 final與override說(shuō)明符。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
C語(yǔ)言獲取Linux系統(tǒng)精確時(shí)間的方法
下面小編就為大家?guī)?lái)一篇C語(yǔ)言獲取Linux系統(tǒng)精確時(shí)間的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
C++實(shí)現(xiàn)頁(yè)面的緩沖區(qū)管理器
這篇文章主要介紹了C++實(shí)現(xiàn)頁(yè)面的緩沖區(qū)管理器,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
C++中拷貝構(gòu)造函數(shù)的總結(jié)詳解
深拷貝和淺拷貝可以簡(jiǎn)單理解為:如果一個(gè)類擁有資源,當(dāng)這個(gè)類的對(duì)象發(fā)生復(fù)制過(guò)程的時(shí)候,資源重新分配,這個(gè)過(guò)程就是深拷貝,反之,沒(méi)有重新分配資源,就是淺拷貝2013-09-09
C語(yǔ)言中函數(shù)棧幀的創(chuàng)建和銷毀的深層分析
在C語(yǔ)言中,每一個(gè)正在運(yùn)行的函數(shù)都有一個(gè)棧幀與其對(duì)應(yīng),棧幀中存儲(chǔ)的是該函數(shù)的返回地址和局部變量。從邏輯上講,棧幀就是一個(gè)函數(shù)執(zhí)行的環(huán)境:函數(shù)參數(shù)、函數(shù)的局部變量、函數(shù)執(zhí)行完后返回到哪里等等2022-04-04

