灰度图像高斯平滑
图像平滑用于去除图像中的噪声。高斯平滑,就是将每个像素的灰度值用其领域的加权平均值代替。该算法简单,能够有效去除高斯噪声。
平滑模板:
1 2 1
2 4 2
1 2 1
// 高斯平滑
// 1. pImageData 图像数据
// 2. nWidth 图像宽度
// 3. nHeight 图像高度
// 4. nWidthStep 图像行大小
void SmoothGauss(unsigned char *pImageData, int nWidth, int nHeight, int nWidthStep)
{
int i = 0;
int j = 0;
unsigned char *pLine[3] = { NULL, NULL, NULL };
int nTemplate[9] = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
for (j = 1; j < nHeight - 1; j++)
{
pLine[0] = pImageData + nWidthStep * (j - 1); //上1行地址
pLine[1] = pImageData + nWidthStep * j; //当前行地址
pLine[2] = pImageData + nWidthStep * (j + 1); //下1行地址
int nValue = 0;
for (i = 1; i < nWidth - 1; i++)
{
nValue = (pLine[0][i-1] * nTemplate[0] +
pLine[0][i] * nTemplate[1] +
pLine[0][i+1] * nTemplate[2] +
pLine[1][i-1] * nTemplate[3] +
pLine[1][i] * nTemplate[4] +
pLine[1][i+1] * nTemplate[5] +
pLine[2][i-1] * nTemplate[6] +
pLine[2][i] * nTemplate[7] +
pLine[2][i+1] * nTemplate[8]) / 16;
pLine[0][i-1] = (unsigned char) nValue;
}
}
}
来源:http://blog.csdn.net/wqvbjhc/article/details/6065526
/*
nR:窗口大小
*/
void GaussianSmooth2(uchar *pSrcImg, int nW, int nH,int nR, float sigma, uchar* pDstImg)
{
if(NULL==pSrcImg)
return;
int i,j,x,y;
// 高斯滤波器的数组长度
// 一维高斯数据滤波器
int nSize = nR*nR;
int nHalfLen = nR/2; // 窗口长度的1/2
float *pdKernel = new float[nSize];
// 高斯系数与图象数据的点乘
float dDotMul = 0.0 ;
// 高斯滤波系数的总和
float dWeightSum = 0.0;
float t = 0.0;
for (i=0;i<nSize;i++)
{
t = exp(-((i-nHalfLen)*(i-nHalfLen))/(2*sigma*sigma));
pdKernel[i] = t;
dWeightSum += t;
}
for (i=0;i<nSize;i++)
{
pdKernel[i]/=dWeightSum;
}
memcpy(pDstImg,pSrcImg,nW*nH);
for(y=nHalfLen; y<nH-nHalfLen; y++)
{
for(x=nHalfLen; x<nW-nHalfLen; x++)
{
dDotMul = 0.0;
for(i=-nHalfLen; i<=nHalfLen; i++)
{
for (j=-nHalfLen; j<=nHalfLen; j++)
{
dDotMul += (pdKernel[(nHalfLen+i)*3 +j+nHalfLen]*(float(pSrcImg[(y+i)*nW+ (j+x)])));
}
}
pDstImg[y*nW + x] = (int) (dDotMul);
}
}
delete [] pdKernel;
}