图像之二维高斯核

高斯核函数

所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数。通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 , 可记作 k(||x-xc||), 其作用往往是局部的 , 即当x远离xc时函数取值很小。

高斯核函数 - 常用公式
最常用的径向基函数是高斯核函数 ,形式为 k(||x-xc||)=exp{- ||x-xc||^2/(2*σ)^2) } 其中xc为核函数中心,σ为函数的宽度参数 , 控制了函数的径向作用范围。
关于核函数的深入了解,请点击链接[核函数]http://blog.csdn.net/luyafei_89430/article/details/7629906

下面的代码是计算二维高斯核,代码是用纯C写的,可移植性应该不错。计算得到的二维高斯核可以用来对图像进行高斯滤波。由于高斯滤波器是可分的,所以可以用一维高斯核得到二维高斯核(其实中间涉及到一些证明,这里直接借用结论),如代码所示:
 //=======================================================
 // 描述   : 计算二维高斯核    
//======================================================= 
#include 
#include 
#include 
#include 
const double eps=1e-6;;

// 高斯函数
double guassian(double x,double sigma)
{
    return exp(-(x*x)/(2*sigma*sigma+eps));
}

// 计算高斯核
void guassiankernel(double* kernel,int size, double sigma)
{
    double sum=0;
    double* data=kernel;
    int i;
    for(i=0;idouble index=(size>>1)-i;
        if(size&1) // size为奇数
        {
            *(data+i)=guassian(index,sigma);
        }
        else // size为偶数
        {
            index-=0.5;
            *(data+i)=guassian(index,sigma);
        }
        sum+=*(data+i);
    }
    // 归一化
    for(i=0;ivoid matproduct(double a[],double b[],double c[],int m,int n,int p)
{
    int i,j,k;
    for(i=0;ifor(j=0;jdouble sum=0;
            for(k=0;kvoid matshow(double a[],int m,int n)
{
    int i,j;
    for(i=0;ifor(j=0;jprintf("%lf\t",a[i*n+j]);
        }
        printf("\n");;
    }
}

// 计算二维高斯核
void guassiankernel2d(double* kernel,int sizeX,int sizeY,double sigmaX,double sigmaY)
{
    double *matX=(double *)malloc(sizeX*sizeof(double));
    double *matY=(double *)malloc(sizeY*sizeof(double));
    guassiankernel(matX,sizeX,sigmaX);
    guassiankernel(matY,sizeY,sigmaY);
    matproduct(matX,matY,kernel,sizeX,1,sizeY);
    free(matX);
    free(matY);
}

int main()
{
    int sizeX=4;
    int sizeY=3;
    double *kernel=(double *)malloc(sizeX*sizeY*sizeof(double));
    guassiankernel2d(kernel,sizeX,sizeY,1,1);
    matshow(kernel,sizeX,sizeY);
    free(kernel);
    system("pause");
    return 0;
}  

运行结果如下:
图像之二维高斯核_第1张图片

多写代码多总结,加油!

你可能感兴趣的:(C/C++学习笔记,图像处理)