1. 程式人生 > >高斯函式的詳細分析

高斯函式的詳細分析


 

摘要

    論文中遇到很重要的一個元素就是高斯核函式,但是必須要分析出高斯函式的各種潛在屬性,本文首先參考相關材料給出高斯核函式的基礎,然後使用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影象,首先貼出完整程式碼:

 function mainfunc()
% 測試高斯函式,遞增的方法實現高斯函式引數的改變對整個高斯函式的影響,
% 並自動儲存為gif格式輸出。
% created by zhao.buaa 2016.09.28

%% 儲存gif動畫
item = 10;      % 迭代次數
dt = 1;             % 步長大小
ksize =20;      % 高斯大小
sigma = 2;      % 方差大小
% filename = ['ksize-' num2str(ksize) '--' num2str(ksize+dt*item) '-sigma-' num2str(sigma) '.gif']; %必須預先建立gif檔案
filename = ['ksize-' num2str(ksize)  '-sigma-' num2str(sigma) '--' num2str(sigma+dt*item) '.gif']; %必須預先建立gif檔案

% main loop
for i = 1:item
    center  = round(ksize/2);          % 中心點
    bias       = ksize*10/10;              % 偏移中心點量
    ksigma = ksigma(ksize, sigma, center, bias);    % 構建核函式
    tname  = ['ksize-' num2str(ksize) '-sigma-' num2str(sigma) '-center-' num2str(center)];
    figure(i), mesh(ksigma), title(tname);
    %設定固定的x-y-z座標範圍,便於觀察,axis([xmin xmax ymin ymax zmin zmax])
    axis([0 ksize 0 ksize 0 0.008]);  view([0, 90]);% 改變可視角度   
    % ksize 遞增
%     ksize = ksize + 10;
    % sigma 遞增
    sigma = sigma + dt;     
    
    % 自動儲存為gif影象
    frame = getframe(i);
    im = frame2im(frame);
    [I,map] = rgb2ind(im,256);
    if i==1
        imwrite(I,map,filename,'gif','Loopcount',inf, 'DelayTime',0.4);
    else
        imwrite(I,map,filename,'gif','WriteMode','append','DelayTime',0.4);
    end
end;

close all;


%% 截斷高斯核函式,截斷的程度取決於引數bias
function ksigma = ksigma(ksize, sigma, center,bias)
%ksize = 80;    sigma = 15;
ksigma=fspecial('gaussian',ksize, sigma);   % 構建高斯函式
[m, n] =size(ksigma);
for i = 1:m
    for j = 1:n
        if(  (i<center-bias)||(i>center+bias)||(j<center-bias)||(j>center+bias)  )
            ksigma(i,j) = 0;
        end;
    end;
end;

結果圖:

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

隨著sigma的增大,整個高斯函式的尖峰逐漸減小,整體也變的更加平緩,則對影象的平滑效果越來越明顯。

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


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


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


高斯核函式卷積

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

先看一段程式碼:

% 截斷高斯核函式
ksize = 40; ksigma=fspecial('gaussian',  ksize, 6);
[m, n] =size(ksigma);
for i = 1:m
    for j = 1:n
        if( i<25 )
           ksigma(i,j) = 0;
        end;
    end;
end;
figure, mesh(ksigma);

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

並且對下圖7進行卷積,

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

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

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

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

        if( i<25 )
           ksigma(i,j) = 0;
        end;

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