高斯滤波法,利用高斯函数计算高斯核,利用高斯核处理图像。高斯函数在滤除高斯噪音以及模糊方面效果较好,实现该函数的核心在于高斯核的计算。高斯函数的一维形式如公式(1)所示:
高斯核的计算:
private double[,] Kernerl()
{
double sum = 0;
double[,] kernel = new double[_k, _k];
for (int i = -_halfK; i <= _halfK; i++)
{
for (int j = -_halfK; j <= _halfK; j++)
{
//sigma控制图像的模糊程度,值越大,模糊效果越明显
//省略公式前的常数A,减少计算量
double g = Math.Exp(-((i * i + j * j) / (2 * _sigma * _sigma)));
kernel[i + _halfK, j + _halfK] = g;
sum += g;
}
}
for (int i = 0; i < _k; i++)
{
for (int j = 0; j < _k; j++)
{
kernel[i, j] /= sum;
}
}
return kernel;
}
用高斯核遍历整幅图像,从而实现模糊效果:
private void gaussion(Bitmap bit)
{
_kernel = Kernerl();
byte[,] grayData = Image2Byte(_bit);
for (int y = _halfK; y < _h - _halfK; y++)
{
for (int x = _halfK; x < _w - _halfK; x++)
{
int sum = 0;
for (int j = -_halfK; j <= _halfK; j++)
for (int i = -_halfK; i <= _halfK; i++)
sum += (int)(grayData[x + i, y + j] * _kernel[i + _halfK, j + _halfK]);
Color c = Color.FromArgb(sum, sum, sum);
bit.SetPixel(x, y, c);
}
}
}
实际上高斯函数在x和y方向的滤波可分开进行,这样可降低复杂度,提高计算效率。
如有需要完整代码可留言。