1. 程式人生 > >高斯(核)函式簡介

高斯(核)函式簡介

轉自:http://keendawn.blog.163.com/blog/static/88880743200922411743299


函式的基本概念



所謂徑向基函式 (Radial Basis Function 簡稱 RBF), 就是某種沿徑向對稱的標量函式。 通常定義為 空間中任一點x到某一中心xc之間歐氏距離的單調函式 , 可記作 k(||x-xc||), 其作用往往是區域性的 , 即當x遠離xc時函式取值很小。最常用的徑向基函式是高斯核函式 ,形式為 k(||x-xc||)=exp{- ||x-xc||^2/(2*σ)^2) } 其中xc為核函式中心,σ為函式的寬度引數

 , 控制了函式的徑向作用範圍。


高斯函式具有五個重要的性質,這些性質使得它在早期影象處理中特別有用.這些性質表明,高斯平滑濾波器無論在空間域還是在頻率域都是十分有效的低通濾波器,且在實際影象處理中得到了工程人員的有效使用.高斯函式具有五個十分重要的性質,它們是:


(1)二維高斯函式具有旋轉對稱性,即濾波器在各個方向上的平滑程度是相同的.一般來說,一幅影象的邊緣方向是事先不知道的,因此,在濾波前是無法確定一個方向上比另一方向上需要更多的平滑.旋轉對稱性意味著高斯平滑濾波器在後續邊緣檢測中不會偏向任一方向.


(2) 高斯函式是單值函式.這表明,高斯濾波器用畫素鄰域的加權均值來代替該點的畫素值,而每一鄰域畫素點權值是隨該點與中心點的距離單調增減的.這一性質是很 重要的,因為邊緣是一種影象區域性特徵,如果平滑運算對離運算元中心很遠的畫素點仍然有很大作用,則平滑運算會使影象失真.


(3)高斯函式的付立葉變換頻譜是單瓣的.正如下面所示,這一性質是高斯函式付立葉變換等於高斯函式本身這一事實的直接推論.影象常被不希望的高頻訊號所汙染(噪聲和細紋理).而所希望的影象特徵(如邊緣),既含有低頻分量,又含有高頻分量.高斯函式付立葉變換的單瓣意味著平滑影象不會被不需要的高頻訊號所汙染,同時保留了大部分所需訊號.


(4)高斯濾波器寬度(決定著平滑程度)是由引數σ表徵的,而且σ和平滑程度的關係是非常簡單的.σ越大,高斯濾波器的頻帶就越寬,平滑程度就越好.通過調節平滑程度引數σ,可在影象特徵過分模糊(過平滑)與平滑影象中由於噪聲和細紋理所引起的過多的不希望突變數(欠平滑)之間取得折衷.


(5)由於高斯函式的可分離性,大高斯濾波器可以得以有效地實現.二維高斯函式卷積可以分兩步來進行,首先將影象與一維高斯函式進行卷積,然後將卷積結果與方向垂直的相同一維高斯函式卷積.因此,二維高斯濾波的計算量隨濾波模板寬度成線性增長而不是成平方增長.


函式的表示式和圖形


在這裡編輯公式很麻煩,所以這裡就略去了。可以參看相關的書籍,僅給出matlab繪圖的程式碼


alf=3;


n=7;%定義模板大小


n1=floor((n+1)/2);%確定中心


for i=1:n



a(i)= exp(-((i-n1).^2)/(2*alf^2));



for j=1:n



b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*alf))/(4*pi*alf);



end


end


subplot(121),plot(a),title('一維高斯函式' )


subplot(122),surf(b),title('二維高斯函式' )


 影象濾波


影象濾波的基本概念


影象常常被強度隨機訊號(也稱為噪聲)所汙染.一些常見的噪聲有椒鹽(Salt & Pepper)噪聲、脈衝噪聲、高斯噪聲等.椒鹽噪聲含有隨機出現的黑白強度值.而脈衝噪聲則只含有隨機的白強度值(正脈衝噪聲)或黑強度值(負脈衝噪聲).與前兩者不同,高斯噪聲含有強度服從高斯或正態分佈的噪聲.研究濾波就是為了消除噪聲干擾。


影象濾波總體上講包括空域濾波和頻域濾波。頻率濾波需要先進行傅立葉變換至頻域處理然後再反變換回空間域還原影象,空域濾波是直接對影象的資料做空間變換達到濾波的目的。它是一種鄰域運算,即輸出影象中任何畫素的值都是通過採用一定的演算法,根據輸入影象中對用畫素周圍一定鄰域內畫素的值得來的。如果輸出畫素是輸入畫素鄰域畫素的線性組合則稱為線性濾波(例如最常見的均值濾波和高斯濾波),否則為非線性濾波(中值濾波、邊緣保持濾波等)。


線 性平滑濾波器去除高斯噪聲的效果很好,且在大多數情況下,對其它型別的噪聲也有很好的效果。線性濾波器使用連續窗函式內畫素加權和來實現濾波。特別典型的 是,同一模式的權重因子可以作用在每一個視窗內,也就意味著線性濾波器是空間不變的,這樣就可以使用卷積模板來實現濾波。如果影象的不同部分使用不同的濾 波權重因子,且仍然可以用濾波器完成加權運算,那麼線性濾波器就是空間可變的。任何不是畫素加權運算的濾波器都屬於非線性濾波器.非線性濾波器也可以是空 間不變的,也就是說,在影象的任何位置上可以進行相同的運算而不考慮影象位置或空間的變化。


影象濾波的計算過程分析


濾波通常是用卷積或者相關來描述,而線性濾波一般是通過卷積來描述的。他們非常類似,但是還是會有不同。下面我們來根據相關和卷積計算過程來體會一下他們的具體區別:


卷積的計算步驟:


(1)       卷積核繞自己的核心元素順時針旋轉180


(2)       移動卷積核的中心元素,使它位於輸入影象待處理畫素的正上方


(3)       在旋轉後的卷積核中,將輸入影象的畫素值作為權重相乘


(4)       第三步各結果的和做為該輸入畫素對應的輸出畫素


相關的計算步驟:


1
移動相關核的中心元素,使它位於輸入影象待處理畫素的正上方


2
將輸入影象的畫素值作為權重,乘以相關核


3
將上面各步得到的結果相加做為輸出



可以看出他們的主要區別在於計算卷積的時候,卷積核要先做旋轉。而計算相關過程中不需要旋轉相關核。


例如: magic(3) =[8 1 6;3 5 7;4 9 2],旋轉180度後就成了[2 9 4;7 5 3;6 1 8]


 高斯平滑濾波器的設計


  高斯函式的最佳逼近由二項式展開的係數決定,換句話說,用楊輝三角形(也稱Pascal三角形)的第n行作為高斯濾波器的一個具有n個點的一維逼近,例如,五點逼近為:


1 4 6 4 1


它們對應於Pascal三角形的第5行. 這一模板被用來在水平方向上平滑影象.在高斯函式可分離性性質中曾指出,二維高斯濾波器能用兩個一維高斯濾波器逐次卷積來實現,一個沿水平方向,一個沿垂 直方向.實際中,這種運算可以通過使用單個一維高斯模板,對兩次卷積之間的影象和最後卷積的結果影象進行轉置來完成.
這一技術在模板尺寸N約為10時的濾波效果極好.對較大的濾波器,二項式展開係數對大多數計算機來說都太多.但是,任意大的高斯濾波器都能通過重複使用小高斯濾波器來實現.高斯濾波器的二項式逼近的σ可用高斯函式擬合二項式係數的最小方差來計算.


   設計高斯濾波器的另一途徑是直接從離散高斯分佈中計算模板權值。為了計算方便,一般希望濾波器權值是整數。在模板的一個角點處取一個值,並選擇一個K使該 角點處值為1。通過這個係數可以使濾波器整數化,由於整數化後的模板權值之和不等於1,為了保證影象的均勻灰度區域不受影響,必須對濾波模板進行權值規範 化。



  高斯濾波器的取樣值或者高斯濾波器的二項式展開係數可以形成離散高斯濾波器.當用離散高斯濾波器進行卷積時,其結果是一個更大的高斯離散濾波器.若一幅影象用N*N離散高斯濾波器進行平滑,接著再用M*M離散高斯濾波器平滑的話,那麼平滑結果就和用(N+M-1)*(N+M-1)離散高斯濾波器平滑的結果一樣.換言之,在楊輝三角形中用第N行和第M行卷積形成了第N+M-1行.


 使用高斯濾波器進行影象的平滑


   如果適應卷積運算對影象進行濾波,在matlab中可以通過2個不同的函式來實現conv2imfliter。他們的呼叫方式如下:


Img_n = conv2(Img,g,'same');  和
Img_n = imfilter(Img,g,'conv');


這兩種函式處理的結果是完全一樣的。



    
imfiler函式在預設的情況下,對影象的濾波計算用的是相關


Img_n = imfilter(Img,g);%使用相關運算濾波


下面是一個簡單的例子展示了使用相同的高斯濾波核函式,相關運算和卷積運算對影象平滑的效果可以直接後邊附的程式檢視。



由結果可以看出相關運算和卷積運算的在用於影象平滑濾波時效果差別不大。當模板大小N>50的時候。邊界的係數已經非常小,對運算起到的作用和微乎其微,所以平滑的結果差別已經非常細微,肉眼幾乎難以察覺。


example.m


clear all


I = imread('lena.bmp');


Img = double(I);


alf=3;


n=10;%定義模板大小


n1=floor((n+1)/2);%計算中心


for i=1:n



for j=1:n



b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*alf))/(4*pi*alf);



end


end


Img_n = uint8(conv2(Img,b,'same'));


K=uint8(imfilter(Img,b));


Img_n2=uint8(imfilter(Img,b,'conv'));


J=(Img_n2)-Img_n;


flag=mean(J(:))


subplot(131),imshow(I);title('原圖')


subplot(132),imshow(Img_n);title('卷積運算圖')


subplot(133),imshow(K);title('相關運算圖')


figure(2),surf(b);




怎樣將高斯核表示式離散化?

對於一個均值為零的高斯卷積核,知道其方差,怎樣求出其離散表達形式,
例如matlab中,輸入filter=fspecial('gaussian',3,1)
會得到:
filter =

0.0751 0.1238 0.0751
0.1238 0.2042 0.1238
0.0751 0.1238 0.0751
請問這是怎麼求出來的?

~~~~~~~~~~~~~~~~~~~~~~~~~
自己琢磨了一下,寫了一個程式,與matlab的程式結果一致。
sigma=3; %sigma
delta=1; %取值步長為1
width=9; %卷積核尺寸
filter=zeros(width,width);
for i=-1*floor(width/2):floor(width/2)
for j=-1*floor(width/2):floor(width/2)
filter(i+1+floor(width/2),j+1+floor(width/2))=exp(-1*((i*delta)^2+(j*delta)^2)/(2*sigma^2))/(2*sigma^2);
end
end

filtersum=sum(sum(filter));
filter=filter/filtersum;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
my note: 實際上在第一篇文章中,理解透了“
徑向基函式 ”的概念原理,以及其後對高斯核函式的matlab程式碼實現,就可以掌握  連續濾波器函式->離散模板化 的方法。