博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高斯滤波器平滑图像代码
阅读量:6760 次
发布时间:2019-06-26

本文共 3221 字,大约阅读时间需要 10 分钟。

说明

    以下的所有代码针对BGR像素排列的渲染缓存

灰度化代码

  void GrayScaleProcess(unsigned char*  pBuf, int width, int height)

  {

    for (int i=0; i<height; i++)

    {

      for (int j=0; j<width;j=j+1)

      {

        unsigned char* p = pBuf;

        p = p + i*width*3+j*3;

        unsigned char b = *(p);

        unsigned char g = *(p+1);

        unsigned char r = *(p+2);

        unsigned char gray = 0.3*r+0.59*g+0.11*b;

        *(p) = gray;

        *(p+1) = gray;

        *(p+2) = gray;

      }

    }

  }

高斯滤波代码

  void GaussianFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)

  {

    int templates[25] = { 

      1, 4, 7, 4, 1, 

      4, 16, 26, 16, 4, 

      7, 26, 41, 26, 7,

      4, 16, 26, 16, 4, 

      1, 4, 7, 4, 1 };

      memcpy ( smooth, corrupted, width*height*3*sizeof(unsigned char) );

      for (int j=2;j<height-2;j++)

      {

        for (int i=6;i<width*3;i=i+3)

        {

          int sum = 0;

          int index = 0;

          for ( int m=j-2; m<j+3; m++)

          {

            for (int n=i-6; n<=i+6; n=n+3)

            {

              sum += corrupted [ m*width*3 + n] * templates[index] ;

              index++;

            }

          }

          sum /= 273;

          if (sum > 255)

            sum = 255;

          smooth [ j*width*3+i ] = sum;

          smooth [ j*width*3+i+1 ] = sum;

          smooth [ j*width*3+i+2 ] = sum;

        }

      }

  }

在AGG中的源代码效果对比

 void GaussianFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)

  {

    int templates[25] = { 

      1, 4, 7, 4, 1, 

      4, 16, 26, 16, 4, 

      7, 26, 41, 26, 7,

      4, 16, 26, 16, 4, 

      1, 4, 7, 4, 1 };

      memcpy ( smooth, corrupted, width*height*3*sizeof(unsigned char) );

      for (int j=2;j<height-2;j++)

      {

        for (int i=6;i<width*3;i=i+3)

        {

          int sum = 0;

          int index = 0;

          for ( int m=j-2; m<j+3; m++)

          {

            for (int n=i-6; n<=i+6; n=n+3)

            {

              sum += corrupted [ m*width*3 + n] * templates[index] ;

              index++;

            }

          }

          sum /= 273;

          if (sum > 255)

            sum = 255;

          smooth [ j*width*3+i ] = sum;

          smooth [ j*width*3+i+1 ] = sum;

          smooth [ j*width*3+i+2 ] = sum;

        }

      }

  }

  void GrayScaleProcess(unsigned char*  pBuf, int width, int height)

  {

    for (int i=0; i<height; i++)

    {

      for (int j=0; j<width;j=j+1)

      {

        unsigned char* p = pBuf;

        p = p + i*width*3+j*3;

        unsigned char b = *(p);

        unsigned char g = *(p+1);

        unsigned char r = *(p+2);

        unsigned char gray = 0.3*r+0.59*g+0.11*b;

        *(p) = gray;

        *(p+1) = gray;

        *(p+2) = gray;

      }

    }

  }

  void GaussianFilterTest()

  {

    agg::rendering_buffer &rbuf = rbuf_window();

    agg::pixfmt_bgr24 pixf(rbuf);

    typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;

    renderer_base_type renb(pixf);

    agg::rasterizer_scanline_aa<> ras;

    agg::scanline_u8 sl;

    ren_bas.clear(agg::rgba8(255,255,255));

    agg::ellipse ell(100,100,150,150); 

    agg::pixel_map pm_img;

    if(!pm_img.load_from_bmp("E:/docs/agg2/beauty.bmp")) return;

    agg::rendering_buffer rbuf_img(pm_img.buf(), pm_img.width(), pm_img.height(), -pm_img.stride());

    agg::pixfmt_bgr24 pixf_img(rbuf_img);

    rbuf.copy_from(rbuf_img);

    GrayScaleProcess(rbuf.buf(), rbuf.width(), rbuf.height());

    unsigned char* smooth = (unsigned char*)malloc(3600*1058*3);

    int num = sizeof(smooth);

    memset(smooth, 0x00, 3600*1058*3);

    GaussianFilter(pm_img.buf(), smooth, pm_img.width(), pm_img.height());

    unsigned char* bufPtr = rbuf.buf();

    int smoothPtr=0;

    for (int i=pm_img.height(); i<2*pm_img.height(); i++)

    {

      unsigned char* curHorizenPtr = bufPtr + i*rbuf.width()*3;

      for (int j=0; j<pm_img.width()*3; j++)

      {

        *curHorizenPtr = smooth[smoothPtr];

        curHorizenPtr++;

        smoothPtr++;

      }

    }

    ::free(smooth);

    return;

  }

     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1730529,如需转载请自行联系原作者
你可能感兴趣的文章
Spring简介
查看>>
new Function()
查看>>
man page分類與說明
查看>>
站立会议3
查看>>
Libvirt 版本降级过程记录 4.5.0 to 3.9.0
查看>>
net core 的Generic Host 之Generic Host Builder
查看>>
SQL Server性能杀手
查看>>
1157: 零起点学算法64——回型矩阵
查看>>
Ubuntu系统清理瘦身
查看>>
How to Analyze Java Thread Dumps
查看>>
SQL-58 获取有奖金的员工相关信息。
查看>>
整数转为罗马数字
查看>>
ubuntu 本地和服务器scp文件传输
查看>>
bitmap
查看>>
image has dependent child images
查看>>
Vim常用的命令
查看>>
redis权限认证及登录
查看>>
判断表是否存在 存储
查看>>
rox + openbox + fbpanel + conky打造又快又稳的桌面
查看>>
“蚁族” 的生活方式画像
查看>>