直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法.
函数 cvEqualizeHist 采用如下法则对输入图像进行直方图均衡化:
1,计算图像的直方图hist[256]
2,对直方图做归一化处理
3,对直方图做积分图
4,对原图用积分图做映射
void EqualizeHist(unsigned char *gray, int width, int height, float minValue) {
int i, j;
unsigned char *pbuf = NULL;
float hist[256] = {0.0f};
float fn[256] = {0.0f};
Histogram(gray, width, height, hist);
int min, max;//最小最大值
for(i = 0; i < 256; i++) {
if(hist[i] > minValue) {
min = i;
break;
}
}
for(i = 255; i >= 0; i--) {
if(hist[i] > minValue) {
max = i;
break;
}
}
fn[0] = hist[0];//直方图的积分图
for(i = 1; i < 256; i++) {
fn[i] = fn[i - 1] + hist[i];
}
//图像关于直方图的映射
for(j = 0; j < height; j++) {
pbuf = gray + j * width;
for(i = 0; i < width; i++, pbuf++) {
*pbuf = fn[*pbuf] * (max - min) + min;
}
}
}
其中Histogram为归一化的直方图
void Histogram(unsigned char *gray, int width, int height, float hist[256]) {
int i, j;
int histogram[256] = {0};
float size = (float)width * height;
unsigned char *pBuf = NULL;
//图像直方统计
for (j = 0; j < height; j++) {
pBuf = gray + j * width;
for (i = 0; i < width; i++, pBuf++) {
histogram[*pBuf] += 1;
}
}
//直方图归一化
for(i = 0; i < 256; i++) {
hist[i] = histogram[i] / size;
}
}