Gaussian Function基礎


摘要

    論文中遇到很重要的一個元素就是高斯核函數,但是必須要分析出高斯函數的各種潛在屬性,本文首先參考相關材料給出高斯核函數的基礎,然後使用matlab自動保存不同參數下的高斯核函數的變化gif動圖,同時分享出源代碼,這樣也便於後續的論文寫作。


高斯函數的基礎

2.1 一維高斯函數

高斯函數,Gaussian Function, 也簡稱爲Gaussian,一維形式如下:


對於任意的實數a,b,c,是以著名數學家Carl Friedrich Gauss的名字命名的。高斯的一維圖是特徵對稱“bell curve”形狀,a是曲線尖峯的高度,b是尖峯中心的座標,c稱爲標準方差,表徵的是bell鍾狀的寬度。


高斯函數廣泛應用於統計學領域,用於表述正態分佈,在信號處理領域,用於定義高斯濾波器,在圖像處理領域,二維高斯核函數常用於高斯模糊Gaussian Blur,在數學領域,主要是用於解決熱力方程和擴散方程,以及定義Weiertrass Transform。

從上圖可以看出,高斯函數是一個指數函數,其log函數是對數凹二次函數 whose logarithm a concave quadratic function。

高斯函數的積分是誤差函數error function,儘管如此,其在整個實線上的反常積分能夠被精確的計算出來,使用如下的高斯積分


同理可得


當且僅當

上式積分爲1,在這種情況下,高斯是正態分佈隨機變量的概率密度函數,期望值μ=b,方差delta^2 = c^2,即



2.2 二維高斯函數

    二維高斯函數,形如


A是幅值,x。y。是中心點座標,σσy是方差,圖示如下,A = 1, xo = 0, yo = 0, σx = σy = 1



2.3 高斯函數分析

這一節使用matlab直觀的查看高斯函數,在實際編程應用中,高斯函數中的參數有

ksize 高斯函數的大小

sigma 高斯函數的方差

center 高斯函數尖峯中心點座標

bias 高斯函數尖峯中心點的偏移量,用於控制截斷高斯函數

爲了方便直觀的觀察高斯函數參數改變而結果也不一樣,下面的代碼實現了參數的自動遞增,並且將所有的結果圖保存爲gif圖像,首先貼出完整代碼:

[plain] view plain copy
 print?
  1.  function mainfunc()  
  2. % 測試高斯函數,遞增的方法實現高斯函數參數的改變對整個高斯函數的影響,  
  3. % 並自動保存爲gif格式輸出。  
  4. % created by zhao.buaa 2016.09.28  
  5.   
  6. %% 保存gif動畫  
  7. item = 10;      % 迭代次數  
  8. dt = 1;             % 步長大小  
  9. ksize =20;      % 高斯大小  
  10. sigma = 2;      % 方差大小  
  11. % filename = ['ksize-' num2str(ksize) '--' num2str(ksize+dt*item) '-sigma-' num2str(sigma) '.gif']; %必須預先建立gif文件  
  12. filename = ['ksize-' num2str(ksize)  '-sigma-' num2str(sigma) '--' num2str(sigma+dt*item) '.gif']; %必須預先建立gif文件  
  13.   
  14. % main loop  
  15. for i = 1:item  
  16.     center  = round(ksize/2);          % 中心點  
  17.     bias       = ksize*10/10;              % 偏移中心點量  
  18.     ksigma = ksigma(ksize, sigma, center, bias);    % 構建核函數  
  19.     tname  = ['ksize-' num2str(ksize) '-sigma-' num2str(sigma) '-center-' num2str(center)];  
  20.     figure(i), mesh(ksigma), title(tname);  
  21.     %設置固定的x-y-z座標範圍,便於觀察,axis([xmin xmax ymin ymax zmin zmax])  
  22.     axis([0 ksize 0 ksize 0 0.008]);  view([0, 90]);% 改變可視角度     
  23.     % ksize 遞增  
  24. %     ksize = ksize + 10;  
  25.     % sigma 遞增  
  26.     sigma = sigma + dt;       
  27.       
  28.     % 自動保存爲gif圖像  
  29.     frame = getframe(i);  
  30.     im = frame2im(frame);  
  31.     [I,map] = rgb2ind(im,256);  
  32.     if i==1  
  33.         imwrite(I,map,filename,'gif','Loopcount',inf, 'DelayTime',0.4);  
  34.     else  
  35.         imwrite(I,map,filename,'gif','WriteMode','append','DelayTime',0.4);  
  36.     end  
  37. end;  
  38.   
  39. close all;  
  40.   
  41.   
  42. %% 截斷高斯核函數,截斷的程度取決於參數bias  
  43. function ksigma = ksigma(ksize, sigma, center,bias)  
  44. %ksize = 80;    sigma = 15;  
  45. ksigma=fspecial('gaussian',ksize, sigma);   % 構建高斯函數  
  46. [m, n] =size(ksigma);  
  47. for i = 1:m  
  48.     for j = 1:n  
  49.         if(  (i<center-bias)||(i>center+bias)||(j<center-bias)||(j>center+bias)  )  
  50.             ksigma(i,j) = 0;  
  51.         end;  
  52.     end;  
  53. end;  

結果圖:

固定ksize爲20,sigma從1-9,固定center在高斯中間,並且bias偏移量爲整個半徑,即原始高斯函數。

隨着sigma的增大,整個高斯函數的尖峯逐漸減小,整體也變的更加平緩,則對圖像的平滑效果越來越明顯。

保持參數不變,對上述高斯函數進行截斷,即truncated gaussian function,bias的大小爲ksize*3/10,則結果如下圖:


truncated gaussian function的作用主要是對超過一定區域的原始圖像信息不再考慮,這就保證在更加合理的利用靠近高斯函數中心點的周圍像素,同時還可以改變高斯函數的中心座標,如下圖:


爲了便於觀察截斷的效果,改變了可視角度。


高斯核函數卷積

    論文中使用gaussian與feature map做卷積,目前的結果來看,要做到隨着到邊界的距離改變高斯函數的截斷參數,因爲圖像的邊緣如果使用原始高斯函數,就會在邊界地方出現特別低的一圈,原因也很簡單,高斯函數在與原始圖像進行高斯卷積的時候,圖像邊緣外爲0計算的,那麼如何解決邊緣問題呢?

先看一段代碼:

[plain] view plain copy
 print?
  1. % 截斷高斯核函數  
  2. ksize = 40; ksigma=fspecial('gaussian',  ksize, 6);  
  3. [m, n] =size(ksigma);  
  4. for i = 1:m  
  5.     for j = 1:n  
  6.         if( i<25 )  
  7.            ksigma(i,j) = 0;  
  8.         end;  
  9.     end;  
  10. end;  
  11. figure, mesh(ksigma);  

在i,即row上對高斯核函數進行截斷,bias爲半徑大小,則如圖6

並且對下圖7進行卷積,

首先卷積核爲原始未截斷高斯核函數,則結果如圖8

可以看出,在圖像邊緣處的卷積結果出現不想預見的結果,邊緣處的值出現大幅度減少的情況,這是高斯核函數在邊緣處將圖像外的部分當成0計算的結果,因此,需要對高斯核函數進行針對性的截斷處理,但是前提是要掌握bias的規律,下面就詳細分析。

如果使用圖6的高斯核函數與圖7做卷積操作,則如圖9:

可以看出,相比較於圖8,與高斯核函數相對應的部分出現了變化,也就是說:

[plain] view plain copy
 print?
  1. if( i<25 )  
  2.    ksigma(i,j) = 0;  
  3. end;  

靠近邊緣的時候,改變 i 或 j 的值,即可保證邊緣處的平滑處理。但是這樣改變高斯核函數,使用matlab不是很好解決這個問題,還是使用將待處理圖像邊緣向外部擴展bias的大小,與標準高斯核函數做卷積,再將超過原始圖像大小的部分剪切掉,目前來看在使用matlab中imfilter函數做卷積運算最合適且最簡單的處理方法了,先寫在這裏,此部分並不是論文中的核心部分,只是數值運算的技巧性編程方法。

發佈了106 篇原創文章 · 獲贊 488 · 訪問量 140萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章