嗯,今天的源碼解析就到這里吧,原理部分學完,深入OpenCV源碼部分也學完,相信大家應該對OpenCV中的線性濾波有了比較詳細的認識,已經躍躍欲試想看這個幾個函數用起來可以得出什么效果了。
這一部分的內容就是為了大家能快速上手boxFilter、blur和GaussianBlur這三個函數所準備的。還等什么呢,開始吧。
<1>boxFilter函數——方框濾波
boxFilter的函數作用是使用方框濾波(box filter)來模糊一張圖片,由src輸入,dst輸出。
函數原型如下:
[cpp] view plain copyprint?
C++: void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT ) ![]()
C++: void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
參數詳解如下:
第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。該函數對通道是獨立處理的,且可以處理任意通道數的圖片,但需要注意,待處理的圖片深度應該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。第二個參數,OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。第三個參數,int類型的ddepth,輸出圖像的深度,-1代表使用原圖深度,即src.depth()。第四個參數,Size類型的ksize,內核的大小。一般這樣寫Size( w,h )來表示內核的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小第五個參數,Point類型的anchor,表示錨點(即被平滑的那個點),注意他有默認值Point(-1,-1)。如果這個點坐標是負值的話,就表示取核的中心為錨點,所以默認值Point(-1,-1)表示這個錨點在核的中心。第六個參數,bool類型的normalize,默認值為true,一個標識符,表示內核是否被其區域歸一化(normalized)了。第七個參數,int類型的borderType,用于推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。
調用代碼示范如下:
[cpp] view plain copyprint?
//載入原圖 Mat image=imread("2.jpg"); //進行均值濾波操作 Mat out; boxFilter(image, out, -1,Size(5, 5)); 
//載入原圖 Mat image=imread("2.jpg"); //進行均值濾波操作 Mat out; boxFilter(image, out, -1,Size(5, 5));
用上面三句核心代碼架起來的完整程序代碼:
[cpp] view plain copyprint?
//-----------------------------------【頭文件包含部分】--------------------------------------- // 描述:包含程序所依賴的頭文件 //---------------------------------------------------------------------------------------------- #include "opencv2/core/core.hpp" #include"opencv2/highgui/highgui.hpp" #include"opencv2/imgproc/imgproc.hpp" //-----------------------------------【命名空間聲明部分】--------------------------------------- // 描述:包含程序所使用的命名空間 //----------------------------------------------------------------------------------------------- using namespace cv; //-----------------------------------【main( )函數】-------------------------------------------- // 描述:控制臺應用程序的入口函數,我們的程序從這里開始 //----------------------------------------------------------------------------------------------- int main( ) { //載入原圖 Mat image=imread("2.jpg"); //創建窗口 namedWindow("均值濾波【原圖】" ); namedWindow("均值濾波【效果圖】"); //顯示原圖 imshow("均值濾波【原圖】", image ); //進行濾波操作 Mat out; boxFilter(image, out, -1,Size(5, 5)); //顯示效果圖 imshow("均值濾波【效果圖】" ,out ); waitKey(0 ); } 
//-----------------------------------【頭文件包含部分】---------------------------------------// 描述:包含程序所依賴的頭文件//----------------------------------------------------------------------------------------------#include "opencv2/core/core.hpp"#include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp" //-----------------------------------【命名空間聲明部分】---------------------------------------// 描述:包含程序所使用的命名空間//----------------------------------------------------------------------------------------------- using namespace cv; //-----------------------------------【main( )函數】--------------------------------------------// 描述:控制臺應用程序的入口函數,我們的程序從這里開始//-----------------------------------------------------------------------------------------------int main( ){ //載入原圖 Mat image=imread("2.jpg"); //創建窗口 namedWindow("均值濾波【原圖】" ); namedWindow("均值濾波【效果圖】"); //顯示原圖 imshow("均值濾波【原圖】", image ); //進行濾波操作 Mat out; boxFilter(image, out, -1,Size(5, 5)); //顯示效果圖 imshow("均值濾波【效果圖】" ,out ); waitKey(0 ); }運行效果圖(內核大小Size(5, 5)):

<2>blur函數——均值濾波
blur的作用是對輸入的圖像src進行均值濾波后用dst輸出。
函數原型如下:
[cpp] view plain copyprint?
C++: void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT ) ![]()
C++: void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )參數詳解如下:
第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。該函數對通道是獨立處理的,且可以處理任意通道數的圖片,但需要注意,待處理的圖片深度應該為CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。第二個參數,OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標圖。第三個參數,Size類型(對Size類型稍后有講解)的ksize,內核的大小。一般這樣寫Size( w,h )來表示內核的大小( 其中,w 為像素寬度, h為像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小第四個參數,Point類型的anchor,表示錨點(即被平滑的那個點),注意他有默認值Point(-1,-1)。如果這個點坐標是負值的話,就表示取核的中心為錨點,所以默認值Point(-1,-1)表示這個錨點在核的中心。第五個參數,int類型的borderType,用于推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT,我們一般不去管它。
調用代碼示范:
[cpp] view plain copyprint?
//載入原圖 Mat image=imread("1.jpg"); //進行均值濾波操作 Mat out; blur(image, out, Size(7, 7)); 
//載入原圖 Mat image=imread("1.jpg"); //進行均值濾波操作 Mat out; blur(image, out, Size(7, 7));為了大家的理解和應用方便,還是給出用上面三句核心代碼架起來完整程序的代碼:
[cpp] view plain copyprint?
//-----------------------------------【頭文件包含部分】--------------------------------------- // 描述:包含程序所依賴的頭文件 //---------------------------------------------------------------------------------------------- #include "opencv2/core/core.hpp" #include"opencv2/highgui/highgui.hpp" #include"opencv2/imgproc/imgproc.hpp" #include <stdio.h> //-----------------------------------【命名空間聲明部分】--------------------------------------- // 描述:包含程序所使用的命名空間 //----------------------------------------------------------------------------------------------- using namespace cv; //-----------------------------------【main( )函數】-------------------------------------------- // 描述:控制臺應用程序的入口函數,我們的程序從這里開始 //----------------------------------------------------------------------------------------------- int main( ) { //載入原圖 Mat image=imread("1.jpg"); //創建窗口 namedWindow("均值濾波【原圖】" ); namedWindow("均值濾波【效果圖】"); //顯示原圖 imshow("均值濾波【原圖】", image ); //進行濾波操作 Mat out; blur(image, out, Size(7, 7)); //顯示效果圖 imshow("均值濾波【效果圖】" ,out ); waitKey(0 ); } 
//-----------------------------------【頭文件包含部分】---------------------------------------// 描述:包含程序所依賴的頭文件//----------------------------------------------------------------------------------------------#include "opencv2/core/core.hpp"#include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp"#include <stdio.h> //-----------------------------------【命名空間聲明部分】---------------------------------------// 描述:包含程序所使用的命名空間//----------------------------------------------------------------------------------------------- using namespace cv; //-----------------------------------【main( )函數】--------------------------------------------// 描述:控制臺應用程序的入口函數,我們的程序從這里開始//-----------------------------------------------------------------------------------------------int main( ){ //載入原圖 Mat image=imread("1.jpg"); //創建窗口 namedWindow("均值濾波【原圖】" ); namedWindow("均值濾波【效果圖】"); //顯示原圖 imshow("均值濾波【原圖】", image ); //進行濾波操作 Mat out; blur(image, out, Size(7, 7)); //顯示效果圖 imshow("均值濾波【效果圖】" ,out ); waitKey(0 ); }運行效果圖(內核大小Size(7, 7)):

<3>GaussianBlur函數——高斯濾波
GaussianBlur函數的作用是用高斯濾波器來模糊一張圖片,對輸入的圖像src進行高斯濾波后用dst輸出。
函數原型如下:
[cpp] view plain copyprint?
C++: void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT ) ![]()
C++: void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )
參數詳解如下:
第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。它可以是單獨的任意通道數的圖片,但需要注意,圖片深度應該為CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。第二個參數,OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標圖。第三個參數,Size類型的ksize高斯內核的大小。其中ksize.width和ksize.height可以不同,但他們都必須為正數和奇數?;蛘撸鼈兛梢允橇愕?,它們都是由sigma計算而來。第四個參數,double類型的sigmaX,表示高斯核函數在X方向的的標準偏差。第五個參數,double類型的sigmaY,表示高斯核函數在Y方向的的標準偏差。若sigmaY為零,就將它設為sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height計算出來。為了結果的正確性著想,最好是把第三個參數Size,第四個參數sigmaX和第五個參數sigmaY全部指定到。第六個參數,int類型的borderType,用于推斷圖像外部像素的某種邊界模式。注意它有默認值BORDER_DEFAULT。
調用示例:
[cpp] view plain copyprint?
//載入原圖 Mat image=imread("1.jpg"); //進行濾波操作 Mat out; GaussianBlur( image, out, Size( 5, 5 ), 0, 0 ); 
//載入原圖 Mat image=imread("1.jpg"); //進行濾波操作 Mat out; GaussianBlur( image, out, Size( 5, 5 ), 0, 0 ); 用上面三句核心代碼架起來的完整程序代碼:
[cpp] view plain copyprint?
//-----------------------------------【頭文件包含部分】--------------------------------------- // 描述:包含程序所依賴的頭文件 //---------------------------------------------------------------------------------------------- #include "opencv2/core/core.hpp" #include"opencv2/highgui/highgui.hpp" #include"opencv2/imgproc/imgproc.hpp" #include <stdio.h> //-----------------------------------【命名空間聲明部分】--------------------------------------- // 描述:包含程序所使用的命名空間 //----------------------------------------------------------------------------------------------- using namespace cv; //-----------------------------------【main( )函數】-------------------------------------------- // 描述:控制臺應用程序的入口函數,我們的程序從這里開始 //----------------------------------------------------------------------------------------------- int main( ) { //載入原圖 Mat image=imread("1.jpg"); //創建窗口 namedWindow("均值濾波【原圖】" ); namedWindow("均值濾波【效果圖】"); //顯示原圖 imshow("均值濾波【原圖】", image ); //進行均值濾波操作 Mat out; GaussianBlur(image, out, Size( 3, 3 ), 0, 0 ); //顯示效果圖 imshow("均值濾波【效果圖】" ,out ); waitKey(0 ); } 
//-----------------------------------【頭文件包含部分】---------------------------------------// 描述:包含程序所依賴的頭文件//----------------------------------------------------------------------------------------------#include "opencv2/core/core.hpp"#include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp"#include <stdio.h> //-----------------------------------【命名空間聲明部分】---------------------------------------// 描述:包含程序所使用的命名空間//----------------------------------------------------------------------------------------------- using namespace cv; //-----------------------------------【main( )函數】--------------------------------------------// 描述:控制臺應用程序的入口函數,我們的程序從這里開始//-----------------------------------------------------------------------------------------------int main( ){ //載入原圖 Mat image=imread("1.jpg"); //創建窗口 namedWindow("均值濾波【原圖】" ); namedWindow("均值濾波【效果圖】"); //顯示原圖 imshow("均值濾波【原圖】", image ); //進行均值濾波操作 Mat out; GaussianBlur(image, out, Size( 3, 3 ), 0, 0 ); //顯示效果圖 imshow("均值濾波【效果圖】" ,out ); waitKey(0 ); }運行效果圖(內核大小Size(5, 5)):

四、圖像線性濾波綜合示例程序
依然是每篇文章都會配給大家的一個詳細注釋的博文配套示例程序,把這篇文章中介紹的知識點以代碼為載體,展現給大家。
這個示例程序中可以用軌跡條來控制三種線性濾波的核參數值,通過滑動滾動條,就可以控制圖像在三種線性濾波下的模糊度,有一定的可玩性。廢話不多說,上代碼吧:
[cpp] view plain copyprint?
//-----------------------------------【程序說明】---------------------------------------------- // 程序名稱::【OpenCV入門教程之八】線性濾波專場:方框濾波、均值濾波與高斯濾波 配套源碼 // 開發所用OpenCV版本:2.4.8 // 2014年3月31 日 Create by 淺墨 //------------------------------------------------------------------------------------------------ //-----------------------------------【頭文件包含部分】--------------------------------------- // 描述:包含程序所依賴的頭文件 //---------------------------------------------------------------------------------------------- #include <opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> //-----------------------------------【命名空間聲明部分】--------------------------------------- // 描述:包含程序所使用的命名空間 //----------------------------------------------------------------------------------------------- using namespace std; using namespace cv; //-----------------------------------【全局變量聲明部分】-------------------------------------- // 描述:全局變量聲明 //----------------------------------------------------------------------------------------------- Mat g_srcImage,g_dstImage1,g_dstImage2,g_dstImage3;//存儲圖片的Mat類型 int g_nBoxFilterValue=3; //方框濾波參數值 int g_nMeanBlurValue=3; //均值濾波參數值 int g_nGaussianBlurValue=3; //高斯濾波參數值 //-----------------------------------【全局函數聲明部分】-------------------------------------- // 描述:全局函數聲明 //----------------------------------------------------------------------------------------------- //軌跡條的回調函數 static void on_BoxFilter(int, void *); //方框濾波 static void on_MeanBlur(int, void *); //均值濾波 static void on_GaussianBlur(int, void *); //高斯濾波 //-----------------------------------【main( )函數】-------------------------------------------- // 描述:控制臺應用程序的入口函數,我們的程序從這里開始 //----------------------------------------------------------------------------------------------- int main( ) { //改變console//-----------------------------------【程序說明】----------------------------------------------// 程序名稱::【OpenCV入門教程之八】線性濾波專場:方框濾波、均值濾波與高斯濾波 配套源碼// 開發所用OpenCV版本:2.4.8// 2014年3月31 日 Create by 淺墨//------------------------------------------------------------------------------------------------ //-----------------------------------【頭文件包含部分】---------------------------------------// 描述:包含程序所依賴的頭文件//----------------------------------------------------------------------------------------------#include <opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <iostream> //-----------------------------------【命名空間聲明部分】---------------------------------------// 描述:包含程序所使用的命名空間//----------------------------------------------------------------------------------------------- using namespace std;using namespace cv; //-----------------------------------【全局變量聲明部分】--------------------------------------// 描述:全局變量聲明//-----------------------------------------------------------------------------------------------Mat g_srcImage,g_dstImage1,g_dstImage2,g_dstImage3;//存儲圖片的Mat類型int g_nBoxFilterValue=3; //方框濾波參數值int g_nMeanBlurValue=3; //均值濾波參數值int g_nGaussianBlurValue=3; //高斯濾波參數值 //-----------------------------------【全局函數聲明部分】--------------------------------------// 描述:全局函數聲明//-----------------------------------------------------------------------------------------------//軌跡條的回調函數static void on_BoxFilter(int, void *); //方框濾波static void on_MeanBlur(int, void *); //均值濾波static void on_GaussianBlur(int, void *); //高斯濾波 //-----------------------------------【main( )函數】--------------------------------------------// 描述:控制臺應用程序的入口函數,我們的程序從這里開始//-----------------------------------------------------------------------------------------------int main( ){ //改變console字體顏色 system("color5E"); //載入原圖 g_srcImage= imread( "1.jpg", 1 ); if(!g_srcImage.data ) { printf("Oh,no,讀取srcImage錯誤~!/n"); return false; } //克隆原圖到三個Mat類型中 g_dstImage1= g_srcImage.clone( ); g_dstImage2= g_srcImage.clone( ); g_dstImage3= g_srcImage.clone( ); //顯示原圖 namedWindow("【<0>原圖窗口】", 1); imshow("【<0>原圖窗口】",g_srcImage); //=================【<1>方框濾波】================== //創建窗口 namedWindow("【<1>方框濾波】", 1); //創建軌跡條 createTrackbar("內核值:", "【<1>方框濾波】",&g_nBoxFilterValue, 40,on_BoxFilter ); on_MeanBlur(g_nBoxFilterValue,0); imshow("【<1>方框濾波】", g_dstImage1); //================================================ //=================【<2>均值濾波】================== //創建窗口 namedWindow("【<2>均值濾波】", 1); //創建軌跡條 createTrackbar("內核值:", "【<2>均值濾波】",&g_nMeanBlurValue, 40,on_MeanBlur ); on_MeanBlur(g_nMeanBlurValue,0); //================================================ //=================【<3>高斯濾波】===================== //創建窗口 namedWindow("【<3>高斯濾波】", 1); //創建軌跡條 createTrackbar("內核值:", "【<3>高斯濾波】",&g_nGaussianBlurValue, 40,on_GaussianBlur ); on_GaussianBlur(g_nGaussianBlurValue,0); //================================================ //輸出一些幫助信息 cout<<endl<<"/t嗯。好了,請調整滾動條觀察圖像效果~/n/n" <<"/t按下“q”鍵時,程序退出~!/n" <<"/n/n/t/t/t/tby淺墨"; //按下“q”鍵時,程序退出 while(char(waitKey(1))!= 'q') {} return 0;} //-----------------------------【on_BoxFilter( )函數】------------------------------------// 描述:方框濾波操作的回調函數//-----------------------------------------------------------------------------------------------static void on_BoxFilter(int, void *){ //方框濾波操作 boxFilter(g_srcImage, g_dstImage1, -1,Size( g_nBoxFilterValue+1, g_nBoxFilterValue+1)); //顯示窗口 imshow("【<1>方框濾波】", g_dstImage1);} //-----------------------------【on_MeanBlur( )函數】------------------------------------// 描述:均值濾波操作的回調函數//-----------------------------------------------------------------------------------------------static void on_MeanBlur(int, void *){ //均值濾波操作 blur(g_srcImage, g_dstImage2, Size( g_nMeanBlurValue+1, g_nMeanBlurValue+1),Point(-1,-1)); //顯示窗口 imshow("【<2>均值濾波】", g_dstImage2);} //-----------------------------【on_GaussianBlur( )函數】------------------------------------// 描述:高斯濾波操作的回調函數//-----------------------------------------------------------------------------------------------static void on_GaussianBlur(int, void *){ //高斯濾波操作 GaussianBlur(g_srcImage, g_dstImage3, Size( g_nGaussianBlurValue*2+1,g_nGaussianBlurValue*2+1 ), 0, 0); //顯示窗口 imshow("【<3>高斯濾波】", g_dstImage3);}最后是一些運行截圖,原圖:

方框濾波:

均值濾波:

高斯濾波:

本篇文章到這里就基本結束了,最后放出文章配套示例程序的打包下載地址(共四個程序),
OK,今天的內容大概就是這些,我們下篇文章見: