生成结果:
代码如下:
private void creategaos_Click(object sender, EventArgs e)
{
//生成二维高斯滤波系数//
int nWidowSize = 3;
// double nSigma = 0.4;
double nSigma = 1.0;
// double nSigma = 1.4;
// double* pdKernal_2 = new double[nWidowSize*nWidowSize]; //定义二维高斯核数组
double[] pdKernal_2 = new double[3 * 3];
double dSum_2 = 0.0; //求和,进行归一化
///二维高斯函数公式
x*x+y*y ///
-1*-------------- ///
1 2*nSigma*nSigma ///
---------------- e ///
2*pi*nSigma*nSigma ///
///
int nCenter = (nWidowSize) / 2;
for (int i = 0; i < nWidowSize; i++)
{
for (int j = 0; j < nWidowSize; j++)
{
int nDis_x = i - nCenter;
int nDis_y = j - nCenter;
double temp= (nDis_x * nDis_x + nDis_y * nDis_y);
double 指数 = Math.Exp(-(1 / 2.0) * temp / (nSigma * nSigma));
pdKernal_2[i + j * nWidowSize] = 指数 / (2 * 3. * nSigma * nSigma);
dSum_2 += pdKernal_2[i + j * nWidowSize];
}
}
for (int i = 0; i < nWidowSize; i++)
{
for (int j = 0; j < nWidowSize; j++) //进行归一化
{
pdKernal_2[i + j * nWidowSize] /= dSum_2;
}
}
}
我们常用的高斯模板是(左),对比我们放大100的程序生成结果(右):
我想,用右边的gaos生成操作像素,应该也是可以的,试一试?
对一个像素buffer[i*w+h]操作如下:
int n0 = (j * w + i);
gaosbuffer[n0] = (byte)((7*buffer[n0 - w - 1] + 12 * buffer[n0 - w] +7* buffer[n0 - w + 1] +
12 * buffer[n0 - 1] + 20 * buffer[n0] + 12 * buffer[n0 + 1] +
7*buffer[n0 + w - 1] + 12 * buffer[n0 + w] + 7*buffer[n0 + w + 1]) / 100);