0021-用OpenCV的pyrUp和pyrDown函式計算影象金字塔(向上/下采樣)
阿新 • • 發佈:2018-11-16
影象金字塔是一個影象集合,集合中所有的影象都源於同一個原始影象,通過對原始影象進行連續取樣得到影象集合。
常見的有兩種影象金字塔,即高斯金字塔和拉普拉斯金字塔。
高斯金字塔:向下降取樣影象。金字塔從i層生成第i+1層,先用高斯核對Gi進行卷積,然後,刪除所有偶數行和偶數列。這樣,新得到的影象面積會變為源影象的四分之一。迴圈上述過程,即可產生整個金字塔。
拉普拉斯金字塔:從低層影象中向上取樣重建影象。影象首先在每個維度上擴大為原來的兩倍,新增的行以0填充,然後與指定的濾波器進行卷積(實際上是一個在每一維度上都擴大為2倍的過濾器)去估計“丟失”畫素的近似值。得到後的影象與原來的影象相比會模糊一些,丟失了一些資訊。
在OpenCV中給了兩個函式,pyrUp和pyrDown函式分別用於實現拉普拉斯金字塔和高斯金字塔的上取樣和下采樣
使用示例程式碼如下:
程式碼中用到的影象下載連結:http://pan.baidu.com/s/1bQSvls 密碼:dlil
影象處理開發資料、影象處理開發需求、影象處理接私活掙零花錢,可以搜尋公眾號"qxsf321",並關注!
//opencv版本:OpenCV3.0 //VS版本:VS2013 //Author:qxsf321.net #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/imgproc/types_c.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/highgui/highgui_c.h> #include <iostream> using namespace cv; using namespace std; //全域性變數 Mat src, dst, tmp; char* window_name = "pyrDown and pyrUp Demo"; int main(int argc, char** argv) { //測試影象 src = imread("jin_dong.jpg"); if (!src.data) { printf(" No data! -- Exiting the program \n"); return -1; } tmp = src; dst = tmp; //建立顯示視窗 namedWindow(window_name, CV_WINDOW_AUTOSIZE); imshow(window_name, dst); //迴圈 while (true) { int c; c = waitKey(10); if ((char)c == 27) { break; } if ((char)c == 'u') { pyrUp(tmp, dst, Size(tmp.cols * 2, tmp.rows * 2)); printf("pryUp : Image x 2 \n"); } else if ((char)c == 'd') { pyrDown(tmp, dst, Size(tmp.cols / 2, tmp.rows / 2)); printf("pyrDown : Image / 2 \n"); } imshow(window_name, dst); tmp = dst; } return 0; }
程式碼說明:
程式執行後,按“u”鍵則會對影象進行一次“上取樣”處理,並顯示結果;按“d”鍵則會對影象進行一次“下采樣”處理,並顯示結果。按“Esc”鍵退出程式。
執行結果我錄成了視訊,大家可以看一看。
視訊線上播放地址(注意可以選擇高清版哦):http://v.youku.com/v_show/id_XMz ... j.8428770.3416059.1
視訊檔案下載連結:http://pan.baidu.com/s/1o7IwxUa 密碼:vmul