直方图均衡化原理和编码实现(C/C++)

时间:2021-05-21 02:04:55

参考链接:http://hi.baidu.com/ghymark/item/ce52f8a7f9a18b298919d3a2

 

2.直方图均衡化

 

直方图均衡化是通过灰度变换将一幅图象转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数的过程。

设灰度变换 s=f(r)为斜率有限的非减连续可微函数,它将输入图象A(x,y)转换为输出图象B(x,y),输入图象的直方图为HA(r),输出图象的直方图为HB(s),则它们的关系可由如下过程导出:


 

 

例如,下图是直方图均衡化后的飞机图片及其直方图,可见其直方图与原图的直方图相比是很均衡的,但必须说明的是,离散情况下不可能作到绝对的一致。

直方图均衡化原理和编码实现(C/C++) 直方图均衡化原理和编码实现(C/C++)

 

代码实现:

 

void HistNormolize(unsigned char **pImg, unsigned char**pNormImg,int width,int height)
{
 int hist[256];
 float  fpHist[256];
 float eqHistTemp[256];
 int eqHist[256];
 int size = height *width;
 int i ,j;

 memset(&hist,0x00,sizeof(int)*256);
 memset(&fpHist,0x00,sizeof(float)*256);
 memset(&eqHistTemp,0x00,sizeof(float)*256);

 for (i = 0;i < height; i++)//计算差分矩阵直方图
 {
  for (j = 0; j <width; j++)
  {
   unsigned charGrayIndex = pImg[i][j];
   hist[GrayIndex]++ ;
  }
 }

 for (i = 0; i< 256;i++)   // 计算灰度分布密度
 {
  fpHist[i] = (float)hist[i] /(float)size;
 }
 for ( i = 1; i< 256;i++)   // 计算累计直方图分布
 {
  if (i == 0)
  {
   eqHistTemp[i]= fpHist[i];
  }
  else
  {
   eqHistTemp[i]= eqHistTemp[i-1] + fpHist[i];
  }
 }

 //累计分布取整,保存计算出来的灰度映射关系
 for (i = 0; i< 256; i++)
 {
  eqHist[i] = (int)(255.0 *eqHistTemp[i] + 0.5);
 }

 for (i = 0;i < height; i++)//进行灰度映射 均衡化
 {
  for (j = 0; j <width; j++)
  {
   unsigned charGrayIndex = pImg[i][j];
   pNormImg[i][j]= eqHist[GrayIndex];
  }
 }

}