开发者社区> 技术小胖子> 正文

直方图均衡化

简介:
+关注继续查看

  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 EqualizeHistProcess()

  {

    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::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());


    //1统计每一个灰度值的个数

    int colorDistributionInfoArray[256] = {0};

    unsigned char* p = rbuf.buf();

    for (int i=0; i<rbuf.width()*rbuf.height()*3; i++)

    {

      colorDistributionInfoArray[*p]++;

      p++;

    }


    //2计算每一个灰度值个数占总数的百分比

    double colorDistributionRateArray[256] = {0};

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

    {

      colorDistributionRateArray[i] = (double)colorDistributionInfoArray[i]/(rbuf.width()*rbuf.height()*3);

    }


    //3进行累积分布

    double colorDistributionAccumulateArray[256] = {0};

    colorDistributionAccumulateArray[0] = colorDistributionRateArray[0];

    for (int i=1; i<256; i++)

    {

      colorDistributionAccumulateArray[i] += colorDistributionAccumulateArray[i-1];

      colorDistributionAccumulateArray[i] += colorDistributionRateArray[i];

    }


    //4根据累积分布概率重新调整每一级灰度的值

    int newColorDistributionArray[256] = {0};

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

    {

      double result = 255 * colorDistributionAccumulateArray[i];

      if (result>255)

      {

        result = 255;

      }

      newColorDistributionArray[i] = result;

    }


    //5修改图片每一个像素的灰度值

    p= rbuf.buf();

    for (int i=0; i<rbuf.width()*rbuf.height()*3; i++)

    {

      *p = newColorDistributionArray[*p];

      p++;

    }

  }




    本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1732378,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
常见滤波(高斯滤波、均值滤波等)的简单理解
常见滤波(高斯滤波、均值滤波等)的简单理解
6 0
OpenCV_07 直方图:灰度直方图+直方图均衡化
直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中。其中, bin 为直方图中经常用到的一个概念,可以译为 “直条” 或 “组距”,其数值是从数据中计算出的特征统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。
37 0
灰度直方图及直方图均衡化
灰度直方图及直方图均衡化
21 0
Canny算子与霍夫变换检测圆与直线
Canny算子与霍夫变换检测圆与直线
107 0
Matalb-图像均值滤波,中值滤波,梯度锐化(sobel算子)的实现
Matalb-图像均值滤波,中值滤波,梯度锐化(sobel算子)的实现
64 0
【图像去噪】基于双边滤波实现灰度和彩色图像去噪附matlab代码
【图像去噪】基于双边滤波实现灰度和彩色图像去噪附matlab代码
145 0
均值滤波、高斯滤波、高斯双边滤波
均值滤波、高斯滤波、高斯双边滤波
38 0
# TODO.3.高斯双边滤波 (照片变清楚了)
# TODO.3.高斯双边滤波 (照片变清楚了)
22 0
OpenCV 中值滤波与双边滤波
OpenCV 中值滤波与双边滤波
192 0
【图像去噪】基于高斯滤波、均值滤波、中值滤波、双边滤波四种滤波实现椒盐噪声图像去噪附matlab代码
【图像去噪】基于高斯滤波、均值滤波、中值滤波、双边滤波四种滤波实现椒盐噪声图像去噪附matlab代码
181 0
+关注
技术小胖子
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载