1. 程式人生 > >用opencv模仿matlab中的fspecial()函式建立一個自定義空間高斯濾波器模板

用opencv模仿matlab中的fspecial()函式建立一個自定義空間高斯濾波器模板

模仿matlab裡的fspecial()函式,建立一個自定義空間高斯濾波器模板。
基本原理:二維高斯核函式的基本形式是這樣滴:

通常我們的座標都是x和y整數,要產生一個3x3的濾波器,我們要以中心為基礎取樣,這樣第一個值為(-1,-1),以後依次排序到(1,1)。這樣就可以產生一個mxn的濾波器模板了。
基於opencv的程式如下:
CvMatguss(int size,float sigma)
{
float w = 2.0
sigmasigma;
CvMat
K = 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.0i

i + 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)進行對比如圖所示: