影象處理 二維高斯分佈
阿新 • • 發佈:2019-01-07
為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的模板如下,也是對高斯曲面的一個整數除法形式的近似。