OpenCV学习笔记(十):图像金字塔Pyramid和图像缩放:pyrDown(),pyrUp(),resize()
OpenCV學習筆記(十):圖像金字塔Pyramid和圖像縮放:pyrDown(),pyrUp(),resize()
一、圖像金字塔定義:
圖像金字塔是圖像中多尺度表達的一種,最主要用于圖像的分割,是一種以多分辨率來解釋圖像的有效但概念簡單的結構。
金字塔的底部是待處理圖像的高分辨率表示,而頂部是低分辨率的近似。我們將一層一層的圖像比喻成金字塔,層級越高,則圖像越小,分辨率越低。
兩種類型的圖像金字塔:
1、高斯金字塔(Gaussianpyramid)——主要的圖像金字塔,用來向下降采樣圖像,圖像縮小,丟失信息。
高斯金字塔是通過高斯平滑和亞采樣獲得一些列下采樣圖像:
1)對圖像G_i進行高斯內核卷積;
2)將所有偶數行和列去除;
3)pyrUp函數:對圖像向上采樣,圖像尺寸加倍(執行高斯金字塔的向上采樣操作,其實它也可以用于拉普拉斯金字塔)
4)pyrDown函數:對圖像向下采樣,圖像尺寸減半(執行了高斯金字塔建造的向下采樣操作)
2、拉普拉斯金字塔(Laplacianpyramid)——向上采樣重建一個圖像,圖像放大,在數字圖像處理中也即是預測殘差,可以對圖像進行最大程度的還原。
如果想放大圖像,則需要通過向上取樣操作得到:
1)將圖像在每個方向擴大為原來的兩倍,新增的行和列以0填充
2)使用先前同樣的內核(乘以4)與放大后的圖像卷積,獲得 “新增像素”的近似值
一、圖像縮放resize( )函數:
此函數將源圖像精確地轉換為指定尺寸的目標圖像。
void resize(InputArray src, // 輸入圖像 OutputArray dst, // 輸出圖像 Size dsize, // 輸出圖像的大小,如果它等于零,自動計算 double fx=0, // 沿水平軸的縮放系數 double fy=0, // 沿垂直軸的縮放系數 int interpolation=INTER_LINEAR // 用于指定插值方式 ) INTER_NEAREST - 最近鄰插值 INTER_LINEAR - 線性插值(默認值) INTER_AREA - 區域插值(利用像素區域關系的重采樣插值)(縮小圖像推薦) INTER_CUBIC –三次樣條插值(超過4×4像素鄰域內的雙三次插值) INTER_LANCZOS4 -Lanczos插值(超過8×8像素鄰域的Lanczos插值)示例代碼:
#include <opencv2/opencv.hpp>using namespace cv; using namespace std;#define WINDOW_NAME "【程序窗口】" //為窗口標題定義的宏 Mat g_srcImage, g_dstImage, g_tmpImage;int main() {//顯示幫助文字ShowHelpText();//載入原圖//工程目錄下需要有一張名為1.jpg的測試圖像,且其尺寸需被2的N次方整除,N為可以縮放的次數g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/6.6 pyrUp_pyrDown 圖像金字塔/2.jpg");if( !g_srcImage.data ){printf("Oh,no,讀取srcImage錯誤~! \n");return false;}else{printf("讀入圖像尺寸:Width*Height=%d*%d \n",g_srcImage.cols,g_srcImage.rows);}// 創建顯示窗口namedWindow( WINDOW_NAME, WINDOW_AUTOSIZE );imshow(WINDOW_NAME, g_srcImage);//參數賦值g_tmpImage = g_srcImage;g_dstImage = g_tmpImage;int key =0;//輪詢獲取按鍵信息while(1){key=waitKey(9) ;//讀取鍵值到key變量中//根據key變量的值,進行不同的操作switch(key){case 27://按鍵ESCcase 'q'://按鍵Qreturn 0;break;// 圖片放大case 'a'://按鍵A按下,調用pyrUp函數case '3':pyrUp( g_tmpImage, g_dstImage, Size( g_tmpImage.cols*2, g_tmpImage.rows*2 ) );printf( ">檢測到按鍵【A】/【3】被按下,開始進行基于【pyrUp】函數的圖片放大:圖片尺寸×2 \n" );break;case 'w'://按鍵W按下,調用resize函數case '1':resize(g_tmpImage,g_dstImage,Size( g_tmpImage.cols*2, g_tmpImage.rows*2 ));printf( ">檢測到按鍵【W】/【1】被按下,開始進行基于【resize】函數的圖片放大:圖片尺寸×2 \n" );break;//圖片縮小case 'd': //按鍵D按下,調用pyrDown函數case '4': //按鍵4按下,調用pyrDown函數pyrDown( g_tmpImage, g_dstImage, Size( g_tmpImage.cols/2, g_tmpImage.rows/2 ));printf( ">檢測到按鍵【D】/【4】被按下,開始進行基于【pyrDown】函數的圖片縮小:圖片尺寸/2\n" );break;case 's': //按鍵S按下,調用resize函數case '2'://按鍵2按下,調用resize函數resize(g_tmpImage,g_dstImage,Size( g_tmpImage.cols/2, g_tmpImage.rows/2 ));printf( ">檢測到按鍵【S】/【2】被按下,開始進行基于【resize】函數的圖片縮小:圖片尺寸/2\n" );break;}//經過操作后,顯示變化后的圖imshow( WINDOW_NAME, g_dstImage );//將g_dstImage賦給g_tmpImage,方便下一次循環g_tmpImage = g_dstImage;} }輸出一些幫助信息
static void ShowHelpText() {printf("\n\t歡迎來到OpenCV圖像金字塔和resize示例程序~\n\n");printf( "\n\n\t按鍵操作說明: \n\n""\t\t鍵盤按鍵【ESC】或者【Q】- 退出程序\n""\t\t鍵盤按鍵【1】或者【W】- 進行基于【resize】函數的圖片放大\n""\t\t鍵盤按鍵【2】或者【S】- 進行基于【resize】函數的圖片縮小\n""\t\t鍵盤按鍵【3】或者【A】- 進行基于【pyrUp】函數的圖片放大\n""\t\t鍵盤按鍵【4】或者【D】- 進行基于【pyrDown】函數的圖片縮小\n"); }結果:
總結
以上是生活随笔為你收集整理的OpenCV学习笔记(十):图像金字塔Pyramid和图像缩放:pyrDown(),pyrUp(),resize()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dubbo学习总结——思维导图
- 下一篇: MATLAB编辑GUI界面