直方图均衡化

简介:

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



相关文章
|
16天前
|
计算机视觉
直方图均衡化
直方图均衡化是一种图像处理技术,通过改变图像灰度级分布,增强图像对比度。手动实现包括计算灰度直方图、像素总数、灰度分布频率、累积分布频率,然后归一化映射到新灰度级,最终得到增强对比度的图像。该方法适用于改善灰度集中或明暗对比不明显的图像,但全局处理可能导致背景干扰增强,丢失细节,且某些图像可能过度增强。局部直方图均衡化可作为改进方案。
12 1
|
7月前
|
计算机视觉 Python
直方图与直方图均衡化
直方图与直方图均衡化
|
10天前
|
计算机视觉
图像直方图
以下是内容摘要: 本文介绍了直方图在图像处理中的应用,包括图像增强和图像分割。直方图均衡化用于改善图像的亮度分布,而根据直方图可获取分割阈值以实现图像分割。此外,直方图对比有助于图像分类。直方图是表示图像亮度分布的图表,通过分析直方图的峰值可判断图像属于低调、中间调还是高调。直方图均衡化则能将图像转换为灰度分布更均匀的新图像。
10 0
|
6月前
|
C++
C++-灰度图上色GrayToColor
C++-灰度图上色GrayToColor
|
9月前
|
数据可视化 算法 数据挖掘
使用Gabor滤镜对图像进行纹理分割
演示如何使用纹理分割根据纹理识别区域。目标是将狗从浴室地板上分开。由于浴室地板的规则、周期性图案与狗皮毛规则、光滑的纹理之间的质地差异,这种分割在视觉上很明显。
90 0
|
10月前
常见滤波(高斯滤波、均值滤波等)的简单理解
常见滤波(高斯滤波、均值滤波等)的简单理解
76 0
|
11月前
|
API 计算机视觉 Python
OpenCV_07 直方图:灰度直方图+直方图均衡化
直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中。其中, bin 为直方图中经常用到的一个概念,可以译为 “直条” 或 “组距”,其数值是从数据中计算出的特征统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。
125 0
|
11月前
|
资源调度 算法 API
OpenCV_06 图像平滑:图像噪声+图像平滑+滤波
由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。
102 0
|
计算机视觉
灰度直方图及直方图均衡化
灰度直方图及直方图均衡化
67 0
|
计算机视觉 异构计算