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++;

    }

  }