天下

记录修行的印记

灰度图像高斯平滑

灰度图像高斯平滑
图像平滑用于去除图像中的噪声。高斯平滑,就是将每个像素的灰度值用其领域的加权平均值代替。该算法简单,能够有效去除高斯噪声。
平滑模板:
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;
}

posted on 2016-07-13 17:25 天下 阅读(507) 评论(0)  编辑 收藏 引用 所属分类: 图像处理


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2016年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(4)

随笔分类(378)

随笔档案(329)

链接

最新随笔

搜索

最新评论