1、二维高斯函数
G
(
x
,
y
)
=
1
2
π
σ
2
exp
(
−
x
2
+
y
2
2
σ
2
)
G(x,y)=\frac{1}{2\pi {{\sigma }^{2}}}\exp \left( -\frac{{{x}^{2}}+{{y}^{2}}}{2{{\sigma }^{2}}} \right)
G(x,y)=2πσ21exp(−2σ2x2+y2)
2、坐标
(
x
,
y
)
(x,y)
(x,y)(以5×5卷积核为例)
3、Matlab实现
sigma1=2;
k=5; % kernel大小
pai=3.1415926;
kernel=zeros(k);
m=(k+1)/2;
sigma=2*sigma1*sigma1;
for i=-1*(k-1)/2:(k-1)/2
for j=-1*(k-1)/2:(k-1)/2
kernel(i+m,j+m)=(-1/(pai*sigma))*exp(-1*(i^2+j^2)/(sigma));
end
end
kernel=kernel./sum(kernel,'all') % 归一化
结果与Matlab函数fspecial()生成的高斯卷积核一致,卷积核如图所示:
4、OpenCV实现
int main()
{
double sigma = 2, pai = 3.1415926;
int k = 5, m = (k + 1) / 2, n = m - 1; // k-高斯卷积核大小
Mat kernel = Mat::zeros(Size(k, k), CV_64FC1);
double *p, Ksum;
sigma = 2 * sigma * sigma;
for (int i = -1 * n; i <= n; i++)
{
p = kernel.ptr<double>(i + n);
for (int j = -1 * n; j <= n; j++)
{
p[j + n] = (1 / (pai*sigma)) * exp(-1 * (i * i + j * j) / sigma);
}
}
Ksum = sum(kernel).val[0];
kernel = kernel.mul(1/Ksum);
cout << kernel << endl;
getchar();
return 0;
}