1、算法原理
直方图均衡化是一种非线性的灰度变换,主要是用来拉伸图像的灰度动态范围,提高图像对比度。直方图均衡化的具体数学推导这里不做介绍,这里,我们只用“白话”的形式介绍一下累积分布函数(CDF)这个概念。说到分布,肯定就会牵涉到随机变量。假如,我们把一幅图像的像素值看做是随机变量,那么为了描述整副图像的灰度的分布情况,我们可以将每个灰度等级在图像中出现的次数统计出来(即直方图),将直方图除以像素总个数,即可得到每个灰度等级出现的概率(归一化直方图),也就是随机变量的分布函数。回过头来,累积分布函数中分布函数就理解了,那么,累积就好理解了。累积即累加,在得到归一化直方图后,累积分布函数即为归一化直方图的累加和。
2、算法实现
(1)、直方图统计
//函数名:HistogramEqual
//功能:直方图均衡化功能实现
//参数:
//pInputOutputData : 输入输出图像数据指针
//nWidth:图像宽度
//nHeight:图像高度
//备注:该函数仅支持8位单通道灰度图像进行处理。
void HistogramEqual(unsigned char* pInputOutputData, int nWidth, int nHeight)
{
const int GRAY8_MAX = 256;
//统计直方图
float szHistogram[GRAY8_MAX] = {0.0};
for (int m = 0; m < nWidth*nHeight; m++)
szHistogram[pInputOutputData[m]]++;
(2)、直方图归一化
//直方图归一化
float fNormal = 1.0f / (nWidth * nHeight);
for (int m = 0; m < GRAY8_MAX; m++)
szHistogram[m] *= fNormal;
(3)、计算累积分