IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    灰度图像高斯平滑

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


    天下 2016-07-13 17:25 发表评论


沪ICP备19023445号-2号
友情链接