直方图均衡化

直方图均衡化是增强图像对比度的一种方法。当一幅图像灰度级分布不均的时候,可以通过直方图均衡化来重新分布灰度。

直方图均衡化可以在YUV的Y数据上,HSI的I分量,HSV的V分量上处理或者RGB上处理。

直方图均衡化分一下几个步骤:

1、统计每个灰度级出现的像素数量:unsigned chargrayArray[i], int i∈[0,255];

2、计算累计直方图:eqHistTemp[0] = grayArray[0];

for(int i= 0; i < 256; i++)  eqHistTemp[i]=  eqHistTemp[i-1]+grayArray[i];

3、累计分布取整,保存计算出来的灰度映射关系:

for(int i= 0; i < 256; i++)

       eqHist[i] =(int)(255*eqHistTemp[i]/size+0.5);  //size= width * height;

4、进行灰度映射,进行均衡化:

for(int i= 0; i < width * height; i++)

{

       unsigned char GrayIndex = pImg[i];  //pImg[i] 原图

       pHistImg[i] = eqHist[GrayIndex];  //pHistImg[i] 均衡化后的图像

}

完整程序如下:

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

for (i = 0;i < height * width; i++) 
{
unsigned char grayArray = pImg[i];
hist[grayArray] ++ ;
}

eqHistTemp[0] = hist[0];
for ( i = 1; i< 256; i++)   
{
eqHistTemp[i] = eqHistTemp[i-1] + hist[i];
}

for (i = 0; i< 256; i++)
{
eqHist[i] = (int)(255 * eqHistTemp[i] /size + 0.5);
}
for (i = 0;i < height * width; i++) 
{
unsigned char GrayIndex = pImg[i];
pNormImg[i] = eqHist[GrayIndex];

}

直方图均衡化处理结果如下:

直方图均衡化_第1张图片

直方图均衡化_第2张图片

                                                                              原图和原图的直方图


直方图均衡化_第3张图片

直方图均衡化_第4张图片

                                                                        直方图均衡化后的图像和直方图

源码下载:http://download.csdn.net/detail/fang20277/9559614

你可能感兴趣的:(直方图,均衡化,图像处理)