基于opencv和c++的图像处理:直方图均衡化

    一般而言,图片有RGB三通道,每个通道用一个byte表示,取值范围在0到255之间。对于每个通道,我们都可以计算图像的直方图,其实就是统计每个像素值的出现频率,如下图所示:


       直方图均衡化的效果,即把原图的三通道的直方图变成均匀分布,每种像素值出现的次数都差不多,下面是直方图均衡化后的效果(直方图是用光影查看的,生成效果图的代码见后):

        


可以看到,图片的直方图很均匀。

直方图均衡化的代码:

[cpp]  view plain copy
  1. bool GFImage::HistogramEqualization()  
  2. {  
  3.     vector<vector<uchar> > pixMaps;  
  4.     CalculateMapFunByHisEq(pixMaps);  
  5.     for (int ch = 0; ch < GetChannel(); ch++)  
  6.     {  
  7.         uchar * pData = GetData();  
  8.         for (int r = 0;r < GetHeight(); r++)  
  9.         {  
  10.             uchar * pLine = pData + r * GetWidthStep();  
  11.             for (int c = 0; c < GetWidth(); c++)  
  12.             {  
  13.                 uchar val = pLine[GetChannel() * c + ch];  
  14.                 pLine[GetChannel() * c + ch] = pixMaps[ch][val];  
  15.             }  
  16.         }  
  17.     }  
  18.     return true;  
  19. }  

[cpp]  view plain copy
  1. bool GFImage::CalculateMapFunByHisEq(vector<vector<uchar> >& vMappings) const  
  2. {  
  3.     vMappings.resize(GetChannel());  
  4.     for (int i = 0; i < vMappings.size(); i++)  
  5.     {  
  6.         vMappings[i].resize(256);  
  7.     }  
  8.   
  9.     vector<GFHistogram> vHistograms;  
  10.     vHistograms.resize(GetChannel());  
  11.     for (int i = 0;i < GetChannel(); i++)  
  12.     {  
  13.         vHistograms[i].Calculate(*this, 256, i);  
  14.     }  
  15.     double tmp;  
  16.     for (int ch = 0; ch < GetChannel(); ch++)  
  17.     {  
  18.         tmp = vHistograms[ch].GetFrequencyAt(0) * 255;  
  19.         vMappings[ch][0] = (uchar)tmp;  
  20.         for (int j = 1;j < 256; j++)  
  21.         {  
  22.             tmp = tmp + vHistograms[ch].GetFrequencyAt(j) * 255;  
  23.             vMappings[ch][j] = (uchar)tmp;  
  24.         }  
  25.     }  
  26.     return true;  
  27. }  

调用时

[cpp]  view plain copy
  1. string strImagePath = "lena.jpg";  
  2. GFImage image1(strImagePath);  
  3. image1.ShowImage("ori");  
  4. image1.HistogramEqualization();  
  5. image1.ShowImage("res");  
  6. cv::waitKey();    

其中GFImage封装了opencv的图像类,GFHistogram是自定义的直方图类。详细代码可参考 这里



转自http://blog.csdn.net/wutongthucs/article/details/8118199

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值