算法原理
彩色均衡化(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;
}
原圖
算法缺點
- 變換後圖像的亮度級減少,某些細節資訊丢失。
- 某些圖像經過處理後對比度過分被增強。