//高斯平滑处理方法
//inputImage 输入图像
// outputImage 输出图像
//sigema 均方差
private void gaussSmooth(double[]inputImage,out double[] outputImage,double sigema)
{
//方差
double std2 = 2 * sigema * sigema;
//半径=3sigema
int radius = Convert.ToInt16(Math.Ceiling(3 * sigema));
int filterWidth = 2 * radius + 1;
double[] filter = new double[filterWidth];
outputImage = new double[inputImage.Length];
//限定输入的情况为方阵的情况下得到的图像的宽度和高度
int length = Convert.ToInt16(Math.Sqrt(inputImage.Length));
double[] tempImage = new double[inputImage.Length];
double sum = 0;
//产生一维高斯函数
for (int i = 0; i < filterWidth; i++)
{
int xx = (i - radius) * (i - radius);
filter[i] = Math.Exp(-xx / std2);
sum += filter[i];
}
//归一化
for (int i = 0; i < filterWidth; i++)
{
filter[i] = filter[i] / sum;
}
//水平方向滤波
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length; j++)
{
double temp = 0;
for (int k = -radius; k <= radius; k++)
{
//循环拓展
int rem = (Math.Abs(j + k) % length);
//计算卷积和
temp += inputImage[i * length + rem] * filter[k + radius];
}
tempImage[i + length + j] = temp;
}
}
//垂直方向滤波
for (int j = 0; j < length; j++)
{
for (int i = 0; i < length; i++)
{
double temp = 0;
for (int k = -radius ; k <=radius; k++)
{
//循环拓展
int rem = (Math.Abs(i + k) )% length;
//计算卷积和
temp += tempImage[rem * length + j] * filter[k + radius];
}
outputImage[i * length + j] = temp;
}
}
}
C#高斯平滑算法 :二维高斯卷积代码实例
最新推荐文章于 2024-06-07 16:47:31 发布