直方图均衡化是增强图像对比度的一种方法。当一幅图像灰度级分布不均的时候,可以通过直方图均衡化来重新分布灰度。
直方图均衡化可以在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];
}
}
直方图均衡化处理结果如下:
原图和原图的直方图
直方图均衡化后的图像和直方图
源码下载:http://download.csdn.net/detail/fang20277/9559614