一维正态分布函数:
对应的曲线如下:
其实就是将某一像素点一定半径内的rgb值按照以上权重分布求出此点的rgb值。
图片像素是二维矩阵,修改如下:
对一个二维的像素矩阵可以分别在水平与垂直方向进行一维高斯模糊其效果等同与二维高斯模糊效果,速度更快。
测试图片如下:
代码如下:
void CGSmooth::generateGaussianKeneral( int radius,float sigma )
{
float sigma22 = 2*sigma*sigma;
float pi2 = 2.0*PI;
float sqrtSigmaPi2 = sqrt(pi2) * sigma;
int size = 2*radius + 1;
int index = 0;
m_gaussianKeneral = new float[size];
float sum = 0.0f;
for(int i = -radius; i <= radius; ++i)
{
float distance = i*i;
m_gaussianKeneral[index] = exp((-distance)/sigma22) / sqrtSigmaPi2;
sum += m_gaussianKeneral[index];
++index;
}
for(i = 0; i < size; ++i)
{
m_gaussianKeneral[i] /= sum;
}
}
int CGSmooth::clamp( float v )
{
return (int)(v < 0 ? 0 : ( v > 255 ? 255 : v));
}
void CGSmooth::blur( int inPixels[], int outPixels[], int width, int height )
{
int subCol = 0;
int index = 0, index2 = 0;
float redSum=0, greenSum=0, blueSum=0;
for(int row=0; row < height; row++)
{
int ta = 0, tr = 0, tg = 0, tb = 0;
index = row;
for(int col = 0; col < width; col++)
{
redSum = 0.0f;
greenSum = 0.0f;
blueSum = 0.0f;
for(int m = -m_radius; m <= m_radius; m++)
{
subCol = col + m;
if(subCol < 0 || subCol >= width)
{
subCol = 0;
}
index2 = row * width + subCol;
ta = (inPixels[index2] >> 24) & 0xff;
tr = (inPixels[index2] >> 16) & 0xff;
tg = (inPixels[index2] >> 8) & 0xff;
tb = inPixels[index2] & 0xff;
redSum += (tr * m_gaussianKeneral[m + m_radius]);
greenSum += (tg * m_gaussianKeneral[m + m_radius]);
blueSum += (tb * m_gaussianKeneral[m + m_radius]);
}
outPixels[index] = (ta << 24) | (clamp(redSum) << 16) | (clamp(greenSum) << 8) | clamp(blueSum);
index += height;
}
}
}
代码参考http://blog.csdn.net/jia20003/article/details/9156935