欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ OpenCV學(xué)習(xí)之圖像金字塔與圖像融合詳解

 更新時(shí)間:2022年03月02日 09:28:43   作者:FrigidWinter  
圖像金字塔分為兩種:高斯金字塔和拉普拉斯金字塔。圖像金字塔在保持細(xì)節(jié)的條件下進(jìn)行圖像融合等多尺度編輯操作非常有用。本文將利用圖像金字塔實(shí)現(xiàn)圖像融合,需要的可以參考一下

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)文章

最新評(píng)論