1.二维高斯函数形式
A是幅值,(xo,y0)为中心点坐标,σx σy是方差,图示如下,A=1,(X0,Y0)=(0,0),σx = σy = 1
2.高斯函数分析
在实际编程应用中,高斯函数的参数包括--
ksize -- 高斯函数的大小
sigma -- 高斯函数的方差
center -- 高斯函数尖峰中心点的坐标
bias -- 高斯函数尖峰中心点的偏移量,用于控制截断高斯函数
假设固定ksize为20,sigma从1-9,固定center在高斯中间,并且bias偏移量为整个半径,即原始高斯函数。
随着sigma的增大,整个高斯函数的尖峰逐渐减小,整体也变得更加平缓,对图像的平滑效果会越来越明显。
3.高斯核函数卷积
“sigma表示标准差,如果标准差比较小,相当于图像点运算,平滑效果不明显;反之,标准差比较大,相当于平均模板,比较模糊”
这样一个曲线与x轴围成的图形面积为1。sigma(标准差)决定了这个图形的宽度,给出下述结论:sigma越大,则图形越宽,尖峰越小,图形较为平缓;sigma越小,则图形越窄,越集中,中间部分也就越尖,图形变化比较剧烈。即如果sigma越大,表示该密度分布一定比较分散,由于面积为1,于是尖峰部分减小,宽度越宽(分布越分散);当sigma越小时,说明密度分布较为集中,尖峰越尖,宽度越窄。
所以,sigma越大,分布越分散,各部分比重差别不大,于是生成的模板各元素值差别不大,类似于平均模板;sigma越小,分布越集中,中间部分所占比重远远高于其他部分,反映到高斯模板上就是中心元素值远远大于其他元素值,相当于中间值的点运算。
4.高斯模板
高斯模板实际上也就是模拟高斯函数的特征,具有对称性并且数值由中心向四周不断减小。
double** createG(int iSize, double sigma){
double **guass;
double sum = 0;
double x2 = 0;
double y2 = 0;
int center = (iSize - 1) / 2;
guass = new double*[iSize]; //注意,double*[k]表示一个有10个元素的指针数组
for (int i = 0; i < iSize; ++i){
guass[i] = new double[iSize];
}
for (int i = 0; i<iSize; i++){
//使用x2,y2降低了运算速度,提高了程序的效率
x2 = pow(double(i - center), 2);
for (int j = 0; j<iSize; j++){
y2 = pow(double(j - center), 2);
sum += guass[i][j] = exp(-(x2 + y2) / (2 * sigma*sigma));
}
}
if (sum != 0){
//归一化
for (int i = 0; i<iSize; i++){
for (int j = 0; j<iSize; j++){
guass[i][j] /= sum;
}
}
}
return guass;
}