Mat CCMVBDlg::gaussian_kernal(int sigma) //sigma既
是高斯核半径,又是真正的sigma
{
int dim = ceil(2.0 * sigma + 1); //高斯核大小为dim*dim
Mat K(dim, dim, CV_32FC1);
//生成二维高斯核
'oat s2 = 2.0 * sigma * sigma;
for(int i = (-sigma); i <= sigma; i++)
{
int m = i + sigma;
for (int j = (-sigma); j <= sigma; j++)
{
int n = j + sigma;
'oat v = exp(-(1.0*i*i + 1.0*j*j) / s2);
K.ptr<'oat>(m)[n] = v;
}
}
Scalar all = sum(K);
Mat gaussK;
K.convertTo(gaussK, CV_32FC1, (1/all[0]));
return gaussK;
}
//再来一个既含有高斯核直径kernelSize,又有单独的sigma的版本:
//double sigma0 = (halfSize - 1)/ 2.0;
Mat CCMVBDlg::gaussian_kernal(int kernelSize, double
sigma0)
{
int halfSize = (kernelSize-1)/ 2;
Mat K(kernelSize, kernelSize, CV_32FC1);
//生成二维高斯核
double s2 = 2.0 * sigma0 * sigma0;
double g=1/sqrt(2*CV_PI*sigma0 * sigma0);
if(kernelSize%2!=0)
{for(int i = (-halfSize); i <= halfSize; i++)