天天看點

【CS】高斯模糊GaussianBlur原理與實踐

高斯模糊算法GaussianBlur原理與實踐

e-mail:[email protected]

在學習SIFT算法時接觸到了高斯模糊,之前有所耳聞,一直沒有認真了解“模糊”和“平滑”的原理。本篇文章簡單介紹高斯模糊的原理,以及通過opencv中高斯模糊算法進行實際程式設計。 高斯模糊 模糊的原理可以了解為将每一個像素點設定成它周邊領域内像素的均值,均值可以是平均值、中值等等,比如以下示意圖。

【CS】高斯模糊GaussianBlur原理與實踐

左圖中心像素點值為2,周圍3×3領域内的像素點都為1,取平均值為1,将其設定為中心像素點的值,成為右圖的形式。 這種簡單平均進行模糊顯然是不合理的,因為實際上一幅圖像基本都是連續的,這也意味着越相鄰的像素點之間的關系越密切,權重應該越高,越疏遠的像素點之間的關系也越疏遠,權重應該越低。是以我們應該使用權重平均的方法進行模糊。 正态分布是一種鐘形曲線,那麼越接近中心,取值越大,反之越小。

【CS】高斯模糊GaussianBlur原理與實踐

由于圖像是二維的,高斯模糊則将二維正态分布作為權重配置設定的模式。

【CS】高斯模糊GaussianBlur原理與實踐

将中心點作為原點,是以二維正态分布的密度函數,即二維高斯函數公式如下:

【CS】高斯模糊GaussianBlur原理與實踐

那麼由此即可計算每一個像素點的權重了。假設σ=1.5,模糊半徑為1,那麼此時權重矩陣如下:

【CS】高斯模糊GaussianBlur原理與實踐

  這9個點的權重相加後不為1,做歸一化處理,即每個權重/9個權重的和作為該像素的新權重,可以得到下圖所示的權重矩陣:

【CS】高斯模糊GaussianBlur原理與實踐

然後進行模糊計算:假設中心像素值為25,其周圍模糊半徑為1的的像素值如下圖所示:

【CS】高斯模糊GaussianBlur原理與實踐

那麼每個像素點乘以對應的權重值,得到下圖所示的矩陣:

【CS】高斯模糊GaussianBlur原理與實踐

再将這個9個資料相加,作為中心像素點的值。如果原圖是RGB圖像,則将三個通道的值分别進行模糊計算即可。 對于邊界上的像素點,進行模糊時,隻需将已有的一側的點拷貝到另一側,構成完成的矩陣即可。

C++代碼 代碼還是非常簡單,直接調用即可。而關于該算法的原理還是非常值得借鑒。

<span style="font-family:Microsoft YaHei;font-size:14px;">#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;


int main()
{
	Mat image = imread("building.jpg");
	Mat out ;	
	GaussianBlur(image,out,Size(3,3),4);	
	imshow("GaussianBlur",out);
	//imwrite("blur.jpg",out);
	waitKey();
	return 0;
}</span>
           

運作結果 原圖:

【CS】高斯模糊GaussianBlur原理與實踐

高斯模糊處理後:

【CS】高斯模糊GaussianBlur原理與實踐