OpenCV 圖像金字塔的實現示例

本文主要介紹瞭OpenCV 圖像金字塔,具有一定的參考價值,感興趣的可以瞭解一下

高斯金字塔reduce void cv::pyrDown()
expand void cv::pyrUp()

1.高斯金字塔

圖像金字塔是對一張輸入圖像先模糊再下采樣為原來的高、寬的1/2,不斷重復模糊與下采樣的過程就得到瞭不同分辨率的輸出圖像,疊加在一起就形成瞭圖像金字塔

高斯金字塔便是先進行高斯模糊,再進行reduce和expand操作。高斯金字塔中的較高級別(低分辨率)是通過刪除較低級別(較高分辨率)圖像中的連續行和列而形成的。然後,較高級別的每個像素由基礎級別的5個像素的貢獻與高斯權重形成。通過這樣做,M×N圖像變成M/2×N/2圖像。因此面積減少到原始面積的四分之一。它稱為Octave。

cv::pryDown()

C++ void cv::pyrDown(cv::InputArray src, cv::OutputArray dst, 
                     const cv::Size &dstsize = cv::Size(), int borderType = 4)

cv::pryUp()

C++ void cv::pyrUp(cv::InputArray src, cv::OutputArray dst, 
                   const cv::Size &dstsize = cv::Size(), int borderType = 4)

2.拉普拉斯金字塔

在高斯金字塔的運算過程中,圖像經過卷積和下采樣操作會丟失部分高頻細節信息。為描述這些高頻信息,人們定義瞭拉普拉斯金字塔(Laplacian Pyramid, LP)。用高斯金字塔的每一層圖像減去其上一層圖像上采樣並高斯卷積之後的預測圖像,得到一系列的差值圖像即為 LP 分解圖像。首先要進行金字塔的reduce操作,再expand操作,最後相減得到拉普拉斯金字塔。 L=G-expand(reduce(G))

代碼1:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<imgproc.hpp>
using namespace cv;
using namespace std;
 
int main(int argc, char** argv) {
	Mat image = imread("C:/Users/YY/Pictures/Saved Pictures/1.jpg");
	Mat out;
	imshow("原圖", image);
	pyrDown(image, out);
	imshow("降采樣", out);
	pyrUp(out, out);
	imshow("上采樣", out);
	subtract(image, out, out);
	imshow("拉普拉斯金字塔", out);
	waitKey(0);
	destroyAllWindows();
	return 0;
}

到此這篇關於OpenCV 圖像金字塔的實現示例的文章就介紹到這瞭,更多相關OpenCV 圖像金字塔內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: