高斯滤波是一种服从正态分布的滤波器,邻域的权重大小与距离相关,有一个阈值,值越大表示平滑度越高,滤波器的权重分布峰图就越矮。
权重的计算公式如下:
对于权重的计算,如果是对于小size的卷积核,那么计算比较简单,那么对于大尺寸的卷积核,则计算较为复杂,提出一种简单的计算方式,建立了数组和卷积核坐标的转换关系,实现数组循环计算。如下图所示为数组坐标和卷积核坐标的位置关系。
直接上程序,程序采用c#,并使用了halcon辅助运算
/// <summary>
/// 输出固定size的卷积核值,存储方式为矩阵方式,并进行了归一化处理
/// </summary>
/// <param name="_size">滤波核的大小</param>
/// <param name="nor">阈值 默认取1.5</param>
/// <param name="conv">输出的卷积核</param>
/// <returns></returns>
public bool ComPut_Gauss_ConvKernel(int _size,double nor,out double[,] conv)
{
if((_size%2)==0)
{
conv = new double[3, 3];
return false;
}
double sum = 0;
double[] Array2CovMatrix=new double[6];
double phi = 90;
HTuple phiRad = new HTuple();
HTuple SinPhi = new HTuple();
HTuple CosPhi = new HTuple();
HOperatorSet.TupleRad(phi,out phiRad);
HOperatorSet.TupleSin(phiRad, out SinPhi);
HOperatorSet.TupleCos(phiRad, out CosPhi);
Array2CovMatrix[0] = CosPhi.D;
Array2CovMatrix[1] = SinPhi.D;
Array2CovMatrix[3] = -SinPhi.D;
Array2CovMatrix[4] = CosPhi.D;
Array2CovMatrix[2] = -(_size-1)/2;
Array2CovMatrix[5] = (_size-1)/2;
conv = new double[_size, _size];
for (int i = 0; i < _size; i++)
{
for (int j = 0; j < _size; j++)
{
//应该是以中点为圆心
HOperatorSet.AffineTransPoint2d(Array2CovMatrix, i, j, out HTuple x, out HTuple y);
ComPut_gauss_conv(x.D, y.D, nor, out double value);
conv[i, j] = value;
sum += conv[i, j];
}
}
//归一化
for (int i = 0; i < _size; i++)
{
for (int j = 0; j < _size; j++)
{
conv[i, j] /= sum;
}
}
return true;
}
/// <summary>
/// 计算某个位置的高斯核的权重值
/// </summary>
/// <param name="x">卷积核的位置坐标</param>
/// <param name="y">卷积核的位置坐标</param>
/// <param name="nor">阈值</param>
/// <param name="_value">权重值</param>
/// <returns></returns>
public bool ComPut_gauss_conv(double x,double y,double nor,out double _value)
{
double _value1 = 1/(2 * Math.PI * Math.Pow(nor, 2));
double _value2 = -(Math.Pow(x, 2) + Math.Pow(y, 2)) / (2 * Math.Pow(nor, 2));
_value = _value1 *Math.Exp(_value2);
return true;
}