模仿matlab里的fspecial()函数,创建一个自定义空间高斯滤波器模板。
基本原理:二维高斯核函数的基本形式是这样滴:
通常我们的坐标都是x和y整数,要产生一个3x3的滤波器,我们要以中心为基础取样,这样第一个值为(-1,-1),以后依次排序到(1,1)。这样就可以产生一个mxn的滤波器模板了。
基于opencv的程序如下:
CvMatguss(int size,float sigma)
{
float w = 2.0sigmasigma;
CvMatK = cvCreateMat(size,size,CV_32FC1);
int m = size / 2;
int n = size / 2;
for (int i = (-m); i <= m;i++)
{
int row = i + m;
for (int j = (-n); j <= n;j++)
{
int col = j + n;
float v = exp(-(1.0ii + 1.0jj) / w);
cvmSet(K,row,col,v);
}
}
CvScalar p;
p = cvSum(K);
cvConvertScale(K, K, 1 / p.val[0], 0);
return K;
}
void printarry(CvMatzero)
{
for (int i = 0; i < zero->height; i++)
{
//float p = (float*)(zero->data.ptr + i*zero->step);
for (int j = 0; j width; j++)
{
float value = cvGetReal2D(zero, i, j);
//float value = *(p + j);
printf("%f “, value);
}
printf(”\n");
}
}
void main()
{
CvMat*K = guss(3, 0.5);
printarry(K);
system(“pause”);
}
结果和matlab的fspecial(‘gaussian’, [3 3],0.5)进行对比如图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/f186b19f79f868e55d6daad54727d6c5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2a454c2ad34d5387138af730bb8263dd.png)