OpenCV - 三種線性濾波的使用

一、方框濾波

方框濾波(box Filter)被封裝在一個名爲boxblur的函數中,即boxblur函數的作用是使用方框濾波器(box filter)來模糊一張圖片。函數原型爲:

void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor = 
	Point(-1, -1), boolnormalize = true, int borderType = BORDER_DEFAULT)

參數詳解:
第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可
第二個參數,OutputArray類型的dst,即目標圖像,需要和源圖片有一樣的尺寸和類型。
第三個參數,int類型的ddepth,輸出圖像的深度,-1代表使用原圖深度,即src.depth()。
第四個參數,Size類型的ksize,內核的大小(Size(w,h),w 爲像素寬度, h爲像素高度)
第五個參數,Point類型的anchor,表示錨點(即被平滑的那個點),注意他有默認值Point(-1,-1)
第六個參數,bool類型的normalize,默認值爲true,表示內核是否被其區域歸一化(normalized)了

第七個參數,int類型的borderType,用於推斷圖像外部像素的某種邊界模式。有默認值BORDER_DEFAULT


二、均值濾波

均值濾波,是最簡單的一種濾波操作,輸出圖像的每一個像素是核窗口內輸入圖像對應像素的像素的平均值( 所有像素加權係數相等),其實說白了它就是歸一化後的方框濾波。函數原型爲:(參數含義與方框濾波相同)

void blur(InputArray src, OutputArraydst, Size ksize, Point anchor = 
         Point(-1,-1), int borderType = BORDER_DEFAULT)


三、高斯濾波

高斯濾波是一種線性平滑濾波,適用於消除高斯噪聲,廣泛應用於圖像處理的減噪過程。高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。函數原型爲:(除第四五個參數不同之外其餘與方框濾波相同,因此只詳細說明第四五個參數)

void GaussianBlur(InputArray src,OutputArray dst, Size ksize, 
    double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT)

參數詳解:

第四個參數,double類型的sigmaX,表示高斯核函數在X方向的的標準偏差。
第五個參數,double類型的sigmaY,表示高斯核函數在Y方向的的標準偏差。若sigmaY爲零,就將它設爲sigmaX,如果sigmaX和sigmaY都是0,那麼就由ksize.width和ksize.height計算出來。


運行調用三種線性濾波函數的代碼以及運行後效果圖如下:

#include <iostream>    
#include <vector>    
#include <opencv2/opencv.hpp>      
#include <opencv2/core/core.hpp>      
#include <opencv2/highgui/highgui.hpp>      
#include <opencv2/imgproc/imgproc.hpp>      
using namespace cv;
using namespace std;

#define WinDow_0 "【原圖】"
#define WinDow_1 "方框濾波"
#define WinDow_2 "均值濾波"
#define WinDow_3 "高斯濾波"

int main()
{
	Mat img = imread("D:\\PhotoMem\\3.jpg");
	if (!img.data)
	{
		printf("圖片讀入路徑有誤!");
		return -1;
	}
	imshow(WinDow_0, img);
	Mat src_boxblur, src_blur, src_gaussianblur;

	/*
	參數img爲輸入的圖像參數
	參數src_boxblur, src_blur, src_gaussianblur分別爲不同濾波輸出的圖像參數
	參數Size(x,y)爲內核大小
	*/

	//方框濾波//
	boxFilter(img, src_boxblur, -1, Size(5, 5));//-1爲輸出圖像的深度(-1表示與原圖像相同)
	imshow(WinDow_1, src_boxblur);

	//均值濾波//
	blur(img, src_blur, Size(5, 5));
	imshow(WinDow_2, src_blur);

	//高斯濾波//
	GaussianBlur(img, src_gaussianblur, Size(5, 5), 0, 0);//第4,5個參數的0,0分別表示高斯核函數在X,Y方向的標準偏差
	imshow(WinDow_3, src_gaussianblur);
	waitKey(0);
}
運行效果比對圖:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章