高斯模版生成代碼


二維高斯分佈公式:

二維高斯分佈公式



    int k = 2;
    int row = 2*k + 1;
    int col = 2*k + 1;
    double sigma = 1;
    double *array = new double[row*col];
    double dFenzi = 0.0;
    double pi = 3.1415926;
    
    for (int j=1; j<=row; j++)
    {
        for (int i=1; i<=col; i++)
        {
            dFenzi = pow((i-k-1), 2) +  pow((j-k-1), 2);
            array[(j-1)*row+i-1] = exp(-dFenzi/(2*sigma))/(2*pi*sigma);
            printf("%0.4f\t",array[(j-1)*row+i-1]);
        }
        printf("\n");
    }
    
    //把高斯模版轉爲整數
    int *iarray = new int[row*col];
    for (int j=1; j<=row; j++)
    {
        for (int i=1; i<=col; i++)
        {
            iarray[(j-1)*row+i-1] =  floor(array[(j-1)*row+i-1] * (1 / array[0]));
            printf("%-5d\t",iarray[(j-1)*row+i-1]);
        }
        printf("\n");
    }


     別人寫的,寫的蠻好的:

    

void GetGaussianKernel(double **gaus, const int size,const double sigma)
{
    const double PI=4.0*atan(1.0); //圓周率π賦值
    int center=size/2;
    double sum=0;
    for(int i=0;i<size;i++)
    {
        for(int j=0;j<size;j++)
        {
            gaus[i][j]=(1/(2*PI*sigma*sigma))*exp(-((i-center)*(i-center)+(j-center)*(j-center))/(2*sigma*sigma));
            sum+=gaus[i][j];
        }
    }
    
    for(int i=0;i<size;i++)
    {
        for(int j=0;j<size;j++)
        {
            gaus[i][j]/=sum;
            cout<<gaus[i][j]<<"  ";
        }
        cout<<endl<<endl;
    }
    return ;
}

假定σ=1.5,則模糊半徑爲1的權重矩陣如下:

這裏寫圖片描述

這9個點的權重總和等於0.4787147,如果只計算這9個點的加權平均,還必須讓它們的權重之和等於1,因此上面9個值還要分別除以0.4787147,得到最終的權重矩陣:

這裏寫圖片描述

有了權重矩陣,就可以計算高斯模糊的值了。 
中心點以及周邊n個點,每個點乘以自己的權重值並將這些值相加,就是中心點的高斯模糊的值。對所有點重複這個過程,就得到了高斯模糊後的圖像。



   

    

  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章