![1bfd87433d9797740cfd805cb717a69f.png](https://img-blog.csdnimg.cn/img_convert/1bfd87433d9797740cfd805cb717a69f.png)
![4b03b0dfbf5ce91e6897c99830873b0a.png](https://img-blog.csdnimg.cn/img_convert/4b03b0dfbf5ce91e6897c99830873b0a.png)
![ed5d3c8b3449cf81ae99c05f316b8861.png](https://img-blog.csdnimg.cn/img_convert/ed5d3c8b3449cf81ae99c05f316b8861.png)
![711a760b49a7a6e964babd353c7fcc89.png](https://img-blog.csdnimg.cn/img_convert/711a760b49a7a6e964babd353c7fcc89.png)
小数形式的模板,就是直接计算得到的值,没有经过任何的处理;
整数形式的,则需要进行归一化处理,将模板左上角的值归一化为1,下面会具体介绍。使用整数的模板时,需要在模板的前面加一个系数,系数为
也就是模板系数和的倒数。
void generateGaussianTemplate(double window[][11], int ksize, double sigma)
{
static const double pi = 3.1415926;
int center = ksize / 2; // 模板的中心位置,也就是坐标的原点
double x2, y2;
for (int i = 0; i < ksize; i++)
{
x2 = pow(i - center, 2);
for (int j = 0; j < ksize; j++)
{
y2 = pow(j - center, 2);
double g = exp(-(x2 + y2) / (2 * sigma * sigma));
g /= 2 * pi * sigma;
window[i][j] = g;
}
}
double k = 1 / window[0][0]; // 将左上角的系数归一化为1
for (int i = 0; i < ksize; i++)
{
for (int j = 0; j < ksize; j++)
{
window[i][j] *= k;
}
}
}
需要一个二维数组,存放生成的系数(这里假设模板的最大尺寸不会超过11);第二个参数是模板的大小(不要超过11);第三个参数就比较重要了,是高斯分布的标准差。 生成的过程,首先根据模板的大小,找到模板的中心位置ksize/2。然后就是遍历,根据高斯分布的函数,计算模板中每个系数的值。 需要注意的是,最后归一化的过程,使用模板左上角的系数的倒数作为归一化的系数(左上角的系数值被归一化为1),模板中的每个系数都乘以该值(左上角系数的倒数),然后将得到的值取整,就得到了整数型的高斯滤波器模板。 下面截图生成的是,大小为3×3,σ=0.83×3,σ=0.8的模板
![f501e3ec454326efe9aeec82e79968b5.png](https://img-blog.csdnimg.cn/img_convert/f501e3ec454326efe9aeec82e79968b5.png)