1. 程式人生 > >影象處理 二維高斯分佈

影象處理 二維高斯分佈


為X,Y的相關係數!為0;σ1=σ2=σ

二維高斯曲面的公式(x,y代表畫素的模板座標,模板中心位置為原點)


根據這個公式,我們可以計算得到不同σ的高斯模板。下面是C語言程式實現:

當σ即半徑為0.7時:

#include "stdafx.h"
#include <fstream>
#include <math.h>
#include <iomanip>
using namespace std;
#define N 4
#define PI 3.141592653
int _tmain(int argc, _TCHAR* argv[])
{
    char* path = "C:\\path1.txt";
    ofstream fout(path);
    double a[2 * N + 1][2 * N + 1];    // 高斯模板;
    double r = 1;                     // 高斯半徑;
    double A = 1 / (2 * PI * r * r);
    if (fout)
    {
        for (int i = -1 * N; i <= N; i++)
        {
            for (int j = -1 * N; j <= N; j++)
            {
                a[i + N][j + N] = A*exp((-1)*(i*i + j*j) / (2 * r*r));
                fout << setiosflags(ios::fixed) << setprecision(6) << a[i + N][j + N] << "   ";
            }
            fout << endl;
        }
    }
    fout.close();
    return 0;
}
最後得到的結果如下圖所示

那麼,我們還有個問題,如何確定模板的大小與標準差之間的關係。經過我們的不斷驗證,即改變上述的σ和模板大小的值,可以得知。當σ越大時,要求的模板也就是越大。即當σ為1時,我們可以得到如下的高斯模板:

上圖的意思是,與水平面平行的x,y平面,也就是上面高斯模板中的座標(x,y),z軸表示的灰度值,也就是上面高斯模板中的灰度值。

通過上圖我們可以得知,7*7的模板已經不能滿足我們,我們需要9*9的模板,這時如果用5*5的模板,則會取中間部分的5*5模板。模板和σ的選擇取決於我們影象的大小。如果影象是幾萬的解析度,則需要高斯模板和σ值都要很大,如果幾十的解析度,用很小的如3*3的模板或者5*5的模板就可以了,這時σ一般可以取0.5左右(也就是matlab裡fspecial函式裡預設的σ值)。

得到的繪出的高斯曲面:


現在眾所周知用的3*3或者5*5的模板,都是對高斯曲面的一個整數除法形式的近似,也就是對高斯半徑約為0.849時的一個近似。

1 2 1 
2 4 2 /16 
1 2 1

16代表的是權重,即模板內所有的數之和。5*5的模板如下,也是對高斯曲面的一個整數除法形式的近似。