pyrDown和pyrUp函数
pyrDown函數(shù):
函數(shù)的作用:
對(duì)圖像進(jìn)行濾波然后進(jìn)行下采樣
函數(shù)調(diào)用形式:
void?pyrDown(InputArray?src, OutputArray?dst, const Size&?dstsize=Size(), int?borderType=BORDER_DEFAULT?)
參數(shù)詳解:
InputArray?src:表示輸入圖像
?OutputArray?dst:表示輸出圖像
const Size&?dstsize=Size():表示輸出圖像的大小
?int?borderType=BORDER_DEFAULT:表示圖像邊界的處理方式
函數(shù)的操作過(guò)程:、
-
1、與高斯內(nèi)核卷積:
-
2、將所有偶數(shù)行和列去除。
pyrUp函數(shù)
函數(shù)功能:
對(duì)圖像進(jìn)行高斯濾波,然后進(jìn)行上采樣;
函數(shù)調(diào)用形式:
void?pyrUp(InputArray?src, OutputArray?dst, const Size&?dstsize=Size(), int?borderType=BORDER_DEFAULT?)
參數(shù)跟上面函數(shù)一樣;
opencv代碼:
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <math.h> #include <stdlib.h> #include <stdio.h>using namespace cv;/// 全局變量 Mat src, dst, tmp; char* window_name = "Pyramids Demo";/*** @函數(shù) main*/ int main( int argc, char** argv ) {/// 指示說(shuō)明printf( "\n Zoom In-Out demo \n " );printf( "------------------ \n" );printf( " * [u] -> Zoom in \n" );printf( " * [d] -> Zoom out \n" );printf( " * [ESC] -> Close program \n \n" );/// 測(cè)試圖像 - 尺寸必須能被 2^{n} 整除src = imread( "../images/chicky_512.jpg" );if( !src.data ){ printf(" No data! -- Exiting the program \n");return -1; }tmp = src;dst = tmp;/// 創(chuàng)建顯示窗口namedWindow( window_name, CV_WINDOW_AUTOSIZE );imshow( window_name, dst );/// 循環(huán)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( "** Zoom In: Image x 2 \n" );}else if( (char)c == 'd' ){ pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) );printf( "** Zoom Out: Image / 2 \n" );}imshow( window_name, dst );tmp = dst;}return 0; }
-
裝載圖像(此處路徑由程序設(shè)定,用戶無(wú)需將圖像路徑當(dāng)作參數(shù)輸入)
/// 測(cè)試圖像 - 尺寸必須能被 2^{n} 整除 src = imread( "../images/chicky_512.jpg" ); if( !src.data ){ printf(" No data! -- Exiting the program \n");return -1; } -
創(chuàng)建兩個(gè)Mat實(shí)例, 一個(gè)用來(lái)儲(chǔ)存操作結(jié)果(dst), 另一個(gè)用來(lái)存儲(chǔ)零時(shí)結(jié)果(tmp)。
Mat src, dst, tmp; /* ... */ tmp = src; dst = tmp; -
創(chuàng)建窗口顯示結(jié)果
namedWindow( window_name, CV_WINDOW_AUTOSIZE ); imshow( window_name, dst ); -
執(zhí)行無(wú)限循環(huán),等待用戶輸入。
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( "** Zoom In: Image x 2 \n" );}else if( (char)c == 'd' ){ pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) );printf( "** Zoom Out: Image / 2 \n" );}imshow( window_name, dst );tmp = dst; }如果用戶按?ESC?鍵程序退出。 此外,它還提供兩個(gè)選項(xiàng):
-
向上采樣 (按 ‘u’)
pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 )函數(shù)?pyrUp?接受了3個(gè)參數(shù):
- tmp: 當(dāng)前圖像, 初始化為原圖像?src?。
- dst: 目的圖像( 顯示圖像,為輸入圖像的兩倍)
- Size( tmp.cols*2, tmp.rows*2 )?: 目的圖像大小, 既然我們是向上采樣,?pyrUp?期待一個(gè)兩倍于輸入圖像(?tmp?)的大小。
-
向下采樣(按 ‘d’)
pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 )類似于?pyrUp, 函數(shù)?pyrDown?也接受了3個(gè)參數(shù):
- tmp: 當(dāng)前圖像, 初始化為原圖像?src?。
- dst: 目的圖像( 顯示圖像,為輸入圖像的一半)
- Size( tmp.cols/2, tmp.rows/2 )?:目的圖像大小, 既然我們是向下采樣,?pyrDown?期待一個(gè)一半于輸入圖像(?tmp)的大小。
-
注意輸入圖像的大小(在兩個(gè)方向)必須是2的冥,否則,將會(huì)顯示錯(cuò)誤。
-
最后,將輸入圖像?tmp?更新為當(dāng)前顯示圖像, 這樣后續(xù)操作將作用于更新后的圖像。
tmp = dst;
-
總結(jié)
以上是生活随笔為你收集整理的pyrDown和pyrUp函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Laplacian函数
- 下一篇: opencv中图像的基本结构 类型的定