算法原理
彩色均衡化(Equalizer)就是要增大亮度间隔,使其呈均匀化分布,减少反差,从而修正图像中的某些不足的地方,使图像细节变得清晰。图像均衡化的基本思想就是将出现频率较小的亮度级并入到邻近的亮度级中,从而拉开亮度间隔,较少亮度等级,使其呈均匀分布,弱化其反差。
实现方法
对图像进行直方图信息统计,再根据均衡化的基本思想对个亮度级的分布概率做均衡化处理,产生一个256级亮度的映射表,最后对图像进行亮度映射处理。
代码
Mat Equalizer(Mat src) {
int row = src.rows;
int col = src.cols;
int Count[256] = { 0 };
float p[256] = { 0 };
float fSum[256] = { 0 };
int level[256] = { 0 };
int Total = row * col * 3;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
for (int k = 0; k < 3; k++) {
Count[src.at<Vec3b>(i, j)[k]]++;
}
}
}
for (int i = 0; i < 256; i++) {
p[i] = 1.0 * Count[i] / (1.0 * Total);
if (i == 0)
fSum[0] = p[0];
else
fSum[i] = fSum[i - 1] + p[i];
level[i] = saturate_cast<uchar>(255 * fSum[i] + 0.5);
}
Mat dst(row, col, CV_8UC3);
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
for (int k = 0; k < 3; k++) {
dst.at<Vec3b>(i, j)[k] = level[src.at<Vec3b>(i, j)[k]];
}
}
}
return dst;
}
原图
处理后的图
算法缺点
- 变换后图像的亮度级减少,某些细节信息丢失。
- 某些图像经过处理后对比度过分被增强。