1. 程式人生 > >【拜小白opencv】30-平滑處理3線性濾波之——高斯濾波

【拜小白opencv】30-平滑處理3線性濾波之——高斯濾波

常言道“溫故而知新”,寫此文章就是對自己目前學習內容的小小的總結與記錄。

本文力求用最簡潔的語言,詳細的程式碼將此部分內容講解清楚,但由於博主同樣是剛剛接觸OpenCV,或許表達上有些瑕疵,還望讀者能夠指教探討,大家共同進步。

博主機器配置為:VS2013+opencv2.4.13+Win-64bit。

若本文能給讀者帶來一點點啟示與幫助,我就很開心了。

=========================分割線========================

1-高斯濾波

  • 高斯濾波(高斯平滑)是一種線性平滑濾波,適用於消除高斯噪聲,廣泛應用於影象處理的減噪過程。
  • 通俗的講,高斯濾波就是對整幅影象進行加權平均的過程,每一個畫素點的值,都由其本身和鄰域內的其他畫素值經過加權平均後得到。
  • 高斯濾波是最有用的濾波器 (儘管不是最快的)。高斯平滑濾波器對於抑制服從正態分佈的噪聲非常有效

那麼問題來了,什麼是高斯濾波?

首先,它引入了數學中的高斯函式(正態分佈函式)(PS:對於平面圖像來說,往往用到的是二維函式)。


高斯濾波的思路就是:對高斯函式進行離散化,以離散點上的高斯函式值為權值,對我們採集到的灰度矩陣的每個畫素點做一定範圍鄰域內的加權平均,即可有效消除高斯噪聲

離散的高斯卷積核H:(2k+1)×(2k+1)維,其元素計算方法為:


其中Sigma為方差,k確定核矩陣的維數。

通過上述公式,我們可以方便地求出高斯模板,從而進行高斯濾波處理。這裡不得不提

在影象處理中,高斯濾波一般有兩種實現方式一是用離散化視窗滑窗卷積,另一種通過傅立葉變換。最常見的就是第一種滑窗實現,只有當離散化的視窗非常大,用滑窗計算量非常大(即使用可分離濾波器的實現)的情況下,可能會考慮基於傅立葉變化的實現方法。

本文只介紹前者,實際上前者運用也是最多的。那什麼叫離散化視窗滑窗處理呢?我們把這個方法分成四個關鍵詞:“離散化”“視窗”“滑窗”“卷積”,接下來一一解釋這些名詞:

  • “離散化”:上面已經提到了離散的高斯卷積核,實際上就是將高斯函式進行離散化,方便程式計算高斯模板;
  • “視窗”:這個視窗比喻得很形象,實際上我的理解就是M*N維的高斯模板;
  • “滑窗”:有了這個高斯模板,接下來是結合我們待處理的灰度資料,處理一個接著一個的畫素點。例如說,處理完(1,1)這個點之後,接下來要處理(1,2)這個資料點,那麼模板相當於右移了一個畫素點,那麼我們可以把這個過程形象地看作是滑窗。在碰上待處理影象的邊緣時,往往處理不了,此時要進行特殊處理,比如說在檢測到邊緣時,複製原來的灰度資料,即不處理;
  • “卷積”:在高數裡有過這個概念,然而在這個地方,卷積遠遠沒有書上的那麼複雜,實際上就是待處理影象的各畫素灰度資料與模板對應元素的數值的加權和的運算過程,就稱之為卷積。

 有了以上解釋之後,我們可以把“離散化”和“視窗”看成是第一個步驟,可以稱之為預處理,通過對高斯函式離散化得到的函式來程式設計得到你所需要的高斯模板,也就是視窗;把“滑窗”和“卷積”看作是第二個步驟,可以稱之為處理過程,通過“滑窗”的方式來進行“卷積”過程。


實際上,在OpenCV中處理起來沒這麼複雜,因為已經將高斯濾波封裝在GaussianBlur()函式中。

=========================分割線==================

2-GaussianBlur()函式——高斯濾波

OpenCV將高斯濾波封裝在GaussianBlur()函式中,作用是輸入一副影象對其進行高斯濾波。下面來看下GaussianBlur()函式的定義:

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

引數說明
  • 引數1:輸入要處理的影象。
  • 引數2:得到處理後的輸出影象,與輸入影象有一樣的尺寸和型別。
  • 引數3:高斯核心的大小。一般用Size(w,h)來表示核心大小,其中w為畫素寬度,h為畫素高度,w與h可以不同,但必須是正數和奇數,或者為0.
  • 引數4:表示高斯核函式在X方向的標準偏差。
  • 引數5:表示高斯核函式在Y方向的標準偏差。
  • 引數6:用於推斷影象外部畫素的某種邊界模式,有預設值BORDER_DEFAULT,我們一般不用管它。
======================分割線==================

3-程式碼演示

/*
	線性濾波——高斯濾波
*/

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

int main()
{
	//------------【1】讀取源影象並檢查影象是否讀取成功------------   
	Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\boat1.jpg");
	if (!srcImage.data)
	{
		cout << "讀取圖片錯誤,請重新輸入正確路徑!\n";
		system("pause");
		return -1;
	}
	imshow("【源影象】", srcImage);
	//------------【2】對影象進行高斯濾波處理------------   
	Mat dstImage;
	GaussianBlur(srcImage, dstImage, Size(7, 7), 0, 0);
	imshow("【高斯濾波】", dstImage);
	waitKey(0);
	return 0;
}

=========================分割線======================

4-顯示結果


=======================分割線====================

5-程式說明

=====================END================