• 图像处理之基础---滤波器之高斯低通滤波器3c代码实现yuv,rgb


    ()高斯理论简介

    ()

    ()代码实现

    四 使用高斯滤波器进行图像的平滑

    ()高斯简介

    http://research.microsoft.com/en-us/um/people/kahe/eccv10/ 何凯明 matlab 实现

    http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html 阮一峰

    http://www.zwbk.org/MyLemmaShow.aspx?lid=126233  中文百科独特解释

    http://academic.mu.edu/phys/matthysd/web226/Lab02.htm

    http://www.360doc.com/content/12/0921/17/10724725_237428926.shtml 有历程

    http://blog.csdn.net/l_inyi/article/details/8915116 实现opencv

    http://www.cnblogs.com/JohnShao/archive/2011/06/02/2067800.html 工业级应用

    http://blog.csdn.net/zddblog/article/details/7450033  高斯模糊小结

    生成高斯核

    /*************************************************************************
    *
    * 函数名称:
    *   MakeGauss()
    *
    * 输入参数:
    *   double sigma                                            - 高斯函数的标准差
    *   double **pdKernel                                        - 指向高斯数据数组的指针
    *   int *pnWindowSize                                        - 数据的长度
    *
    * 返回值:
    *   无
    *
    * 说明:
    *   这个函数可以生成一个一维的高斯函数的数字数据,理论上高斯数据的长度应
    *   该是无限长的,但是为了计算的简单和速度,实际的高斯数据只能是有限长的
    *   pnWindowSize就是数据长度
    *  
    *************************************************************************
    */
    void MakeGauss(double sigma, double **pdKernel, int *pnWindowSize)
    {
        // 循环控制变量
        int i   ;
        // 数组的中心点
        int nCenter;

        // 数组的某一点到中心点的距离
        double  dDis  ;

        double PI = 3.14159;
        // 中间变量
        double  dValue;
        double  dSum  ;
        dSum = 0 ;
        // 数组长度,根据概率论的知识,选取[-3*sigma, 3*sigma]以内的数据。
        // 这些数据会覆盖绝大部分的滤波系数
        *pnWindowSize = 1 + 2 * ceil(3 * sigma);
        // 中心
        nCenter = (*pnWindowSize) / 2;
        // 分配内存
        *pdKernel = new double[*pnWindowSize] ;
        for(i=0; i< (*pnWindowSize); i++)
        {
            dDis = (double)(i - nCenter);
            dValue = exp(-(1/2)*dDis*dDis/(sigma*sigma)) / (sqrt(2 * PI) * sigma );
            (*pdKernel)[i] = dValue ;
            dSum += dValue;
        }
        // 归一化
        for(i=0; i<(*pnWindowSize) ; i++)
        {
            (*pdKernel)[i] /= dSum;
        }
    }

    高斯滤波

    /*************************************************************************
    *
    * 函数名称:
    *   GaussianSmooth()
    *
    * 输入参数:
    *   unsigned char * pUnchImg                - 指向图象数据的指针
    *   int nWidth                                            - 图象数据宽度
    *   int nHeight                                        - 图象数据高度
    *   double dSigma                                    - 高斯函数的标准差
    *   unsigned char * pUnchSmthdImg    - 指向经过平滑之后的图象数据
    *
    * 返回值:
    *   无
    *
    * 说明:
    *   为了抑止噪声,采用高斯滤波对图象进行滤波,滤波先对x方向进行,然后对
    *   y方向进行。
    *  
    *************************************************************************
    */
    void GaussianSmooth(unsigned char *pUnchImg, int nWidth, int nHeight,
                                            double sigma, unsigned char * pUnchSmthdImg)
    {
        // 循环控制变量
      int y;
        int x;
        int i;
        // 高斯滤波器的数组长度
        int nWindowSize;
        //  窗口长度的1/2
        int    nHalfLen;  
        // 一维高斯数据滤波器
        double *pdKernel ;
        // 高斯系数与图象数据的点乘
        double  dDotMul     ;
        // 高斯滤波系数的总和
        double  dWeightSum     ;         
        // 中间变量
        double * pdTmp ;
        // 分配内存
        pdTmp = new double[nWidth*nHeight];
        // 产生一维高斯数据滤波器
        // MakeGauss(sigma, &dKernel, &nWindowSize);
        MakeGauss(sigma, &pdKernel, &nWindowSize) ;
        // MakeGauss返回窗口的长度,利用此变量计算窗口的半长
        nHalfLen = nWindowSize / 2;
      // x方向进行滤波
        for(y=0; y<nHeight; y++)
        {
            for(x=0; x<nWidth; x++)
            {
                dDotMul        = 0;
                dWeightSum = 0;
                for(i=(-nHalfLen); i<=nHalfLen; i++)
                {
                    // 判断是否在图象内部
                    if( (i+x) >= 0  && (i+x) < nWidth )
                    {
                        dDotMul += (double)pUnchImg[y*nWidth + (i+x)] * pdKernel[nHalfLen+i];
                        dWeightSum += pdKernel[nHalfLen+i];
                    }
                }
                pdTmp[y*nWidth + x] = dDotMul/dWeightSum ;
            }
        }
        // y方向进行滤波
        for(x=0; x<nWidth; x++)
        {
            for(y=0; y<nHeight; y++)
            {
                dDotMul        = 0;
                dWeightSum = 0;
                for(i=(-nHalfLen); i<=nHalfLen; i++)
                {
                    // 判断是否在图象内部
                    if( (i+y) >= 0  && (i+y) < nHeight )
                    {
                        dDotMul += (double)pdTmp[(y+i)*nWidth + x] * pdKernel[nHalfLen+i];
                        dWeightSum += pdKernel[nHalfLen+i];
                    }
                }
                pUnchSmthdImg[y*nWidth + x] = (unsigned char)(int)dDotMul/dWeightSum ;
            }
        }

        // 释放内存
        delete []pdKernel;
        pdKernel = NULL ;
        delete []pdTmp;
        pdTmp = NULL;
    }

    http://www.cnblogs.com/IamEasy_Man/archive/2010/08/17/1801477.html 纯c实现

    void gaussianFilter(uchar* data, int width, int height)
    02 {
    03     int i, j, index, sum;
    04     int templates[9] = { 1, 2, 1,
    05                          2, 4, 2,
    06                          1, 2, 1 };
    07     sum = height * width * sizeof(uchar);
    08     uchar *tmpdata = (uchar*)malloc(sum);
    09     memcpy((char*)tmpdata,(char*)data, sum);
    10     for(i = 1;i < height - 1;i++)
    11     {
    12         for(j = 1;j < width - 1;j++)
    13         {
    14             index = sum = 0;
    15             for(int m = i - 1;m < i + 2;m++)
    16             {
    17                 for(int n = j - 1; n < j + 2;n++)
    18                 {
    19                     sum +=
    20                         tmpdata[m * width + n] *
    21                         templates[index++];
    22                 }
    23             }
    24             data[i * width + j] = sum / 16;
    25         }
    26     }
    27     free(tmpdata);
    28 }

     一个模板

    http://www.360doc.com/content/12/0921/16/10724725_237423041.shtml

    //**********************************************************************
    //模板操作
    //图像信息头
    //图像数据
    //模板大小       以0开始
    //模板中心元素   以0开始
    //模板数据
    //模板系数
    //**********************************************************************
    BOOL ImgTemplate(BITMAPINFO* pbmpinfo,BYTE* pbmpdata,CSize TemplateSize,CSize TemplateCertel ,int *template_box,float coef)
    {

        LONG imagewidth=pbmpinfo->bmiHeader.biWidth;
        LONG imageheigth=pbmpinfo->bmiHeader.biHeight;

            LONG i=0,j=0,k=0,heigth=0,width=0;

        //data is not null
        if (pbmpdata == NULL)
        {
            return FALSE;
        }
        //image size
        if (imageheigth <= TemplateSize.cy || imagewidth <= TemplateSize.cx)
        {
            return FALSE;
        }
        if (TemplateCertel.cx < 0 ||  TemplateCertel.cy < 0 || TemplateCertel.cx > TemplateSize.cx || TemplateCertel.cy > TemplateSize.cy)
        {
           return FALSE;
        }
        //color must be gray
        if (pbmpinfo->bmiHeader.biBitCount != 8)
        {
                AfxMessageBox("只对灰度图像进行操作!");
            return FALSE;
        }
        //image size
        LONG  Linebyte =( pbmpinfo->bmiHeader.biBitCount * imagewidth +31)/32*4;
        LONG  ImageSize=Linebyte * imageheigth;
       
        //分配空间
        BYTE *pNewbmpdata=(BYTE*)malloc(ImageSize);
       
        //copy data
        if (pNewbmpdata == NULL)
        {
       
            return FALSE;
        }
       
        memcpy(pNewbmpdata,pbmpdata,ImageSize);

       
        BYTE *psrc=NULL;
        BYTE *pdest=NULL;
           
        LONG result=0;


        for (heigth = TemplateCertel.cy ; heigth < imageheigth - TemplateSize.cy + TemplateCertel.cy + 1  ;heigth++  )
        {
                   
            for ( width = TemplateCertel.cx ; width < imagewidth - TemplateSize.cx + TemplateCertel.cx + 1 ; width++)
            {
                psrc  = (unsigned char *)pbmpdata+(ImageSize-Linebyte-
                    heigth*Linebyte)+width;
               
                pdest = (unsigned char *)pNewbmpdata+(ImageSize-Linebyte-
                    heigth*Linebyte)+width;

                j=0;
                result=0;

                for ( i =  - TemplateCertel.cy ; i <  TemplateSize.cy - TemplateCertel.cy   ;i++)
                {
                    for (k =  - TemplateCertel.cx ; k <  TemplateSize.cx -TemplateCertel.cy  ;k++)
                    {
                                result += (LONG)(*(psrc + i * Linebyte + k)) * template_box[j++];
                    }
                }

                            result = (LONG)(result  *  coef);

                if (result>255)
                {
                    result=255;
                }
                if (result<0)
                {
                    result=0;
                }
                *pdest=(unsigned char)result;
               
            }
        }   
        memcpy(pbmpdata,pNewbmpdata,ImageSize);
        free(pNewbmpdata);
        return TRUE;
    }

    http://www.2cto.com/kf/201306/220419.html 对美女图像的缩小 图像处理之高斯金字塔java

    http://bbs.csdn.net/topics/360109272 

    http://blog.csdn.net/fanner01/article/details/6525270 Gaussian Smoothing Filter高斯平滑滤波器

    http://blog.csdn.net/zhengtu009/article/details/21862353 滤波器设计,包括相关高斯建模,跟踪!

    http://wenku.baidu.com/link?url=Z9F4EUkVxkYIAlbi7cueVEyu-rStz-4tgDvri1MM83F2RPW2vLk-xSQX7pN0lfrZ0ADsMuo6OkEEbBq2Sy4sKYUTntvOhv7r15K8gBUi_-G 基于dm6437的 canny 边缘检测

    http://www.google.co.uk/patents/US6046654 高斯专利

    http://d.wanfangdata.com.cn/Periodical_gxjs200703024.aspx  一种尺度自适应调整的高斯滤波器设计方法

    http://www.cvchina.info/2010/05/07/diving-into-gaussian-filter-implementation/  高斯函数计算中sigma的确定!!!

    http://www.cnblogs.com/JohnShao/archive/2011/06/02/2067800.html 高斯二维转一维

    http://www.cnblogs.com/JohnShao/archive/2011/08/24/2151463.html

    http://blog.csdn.net/hhygcy/article/details/4329056 c++实现

    http://blog.csdn.net/l_inyi/article/details/8915116 opencv  实现

    http://www.verydemo.com/demo_c113_i8816.html matlab 实现

    http://blog.csdn.net/pyramide/article/details/5588880  高斯卷积4种实现方法

    http://www.tudou.com/programs/view/NsvOZtjS1Zo/#http://www.tudou.com/programs/view/BxfgcVCnzk8/ 高斯滤波游戏中的应用魔兽

    http://www.geeks3d.com/20100909/shader-library-gaussian-blur-post-processing-filter-in-glsl/  美女图片3d 效果

     http://prideout.net/archive/bloom/ pengl

    http://blog.csdn.net/pyramide/article/details/5588979 高斯简介

  • 相关阅读:
    【Linux】【Services】【Configuration】puppet
    【Linux】【Services】【Web】Haproxy
    【Linux】【Services】【Project】Haproxy Keepalived Postfix实现邮件网关Cluster
    【Linux】【Services】【Web】Nginx基础
    【Linux】【Services】【Project】Cobbler自动化装机
    【Linux】【Services】【Package】rpm包制作
    【Linux】【Services】【nfs】nfs安装与配置
    Bootstrap框架--DataTables列表示例--添加判断
    安全整改相关内容
    tomcat禁用PUT,DELETE等一些不必要的HTTP方法
  • 原文地址:https://www.cnblogs.com/pengkunfan/p/4042137.html
Copyright © 2020-2023  润新知