直方图均衡化

简介:

  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,如需转载请自行联系原作者



相关文章
|
29天前
|
计算机视觉
直方图均衡化
直方图均衡化是一种图像处理技术,通过改变图像灰度级分布,增强图像对比度。手动实现包括计算灰度直方图、像素总数、灰度分布频率、累积分布频率,然后归一化映射到新灰度级,最终得到增强对比度的图像。该方法适用于改善灰度集中或明暗对比不明显的图像,但全局处理可能导致背景干扰增强,丢失细节,且某些图像可能过度增强。局部直方图均衡化可作为改进方案。
18 1
|
2天前
|
资源调度 API 计算机视觉
【OpenCV】—非线性滤波:中值滤波、双边滤波
【OpenCV】—非线性滤波:中值滤波、双边滤波
|
2天前
|
存储 编解码 资源调度
【OpenCV】—线性滤波:方框滤波、均值滤波、高斯滤波
【OpenCV】—线性滤波:方框滤波、均值滤波、高斯滤波
|
22天前
|
计算机视觉
图像直方图
以下是内容摘要: 本文介绍了直方图在图像处理中的应用,包括图像增强和图像分割。直方图均衡化用于改善图像的亮度分布,而根据直方图可获取分割阈值以实现图像分割。此外,直方图对比有助于图像分类。直方图是表示图像亮度分布的图表,通过分析直方图的峰值可判断图像属于低调、中间调还是高调。直方图均衡化则能将图像转换为灰度分布更均匀的新图像。
11 0
|
5月前
|
算法 计算机视觉
OpenCV对图像进行Otsu二值分割、Canny边缘检测、Harris角点检测实战(附源码)
OpenCV对图像进行Otsu二值分割、Canny边缘检测、Harris角点检测实战(附源码)
36 0
|
7月前
|
C++
C++-灰度图上色GrayToColor
C++-灰度图上色GrayToColor
|
12月前
|
资源调度 算法 API
OpenCV_06 图像平滑:图像噪声+图像平滑+滤波
由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。
103 0
|
12月前
|
API 计算机视觉 Python
OpenCV_07 直方图:灰度直方图+直方图均衡化
直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中。其中, bin 为直方图中经常用到的一个概念,可以译为 “直条” 或 “组距”,其数值是从数据中计算出的特征统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。
126 0
|
计算机视觉
CV15 轮廓检测:霍夫变换原理及应用
虽然图二中有多个交点,但我们主要关注的是三线相交的情况,这也是霍夫变换的后处理的基本方式:选择由尽可能多直线汇成的点
71 0
|
计算机视觉
灰度直方图及直方图均衡化
灰度直方图及直方图均衡化
68 0