Skip to content

Commit 78cd3cc

Browse files
committed
Add Real-time adaptive contrast enhancement for imaging sensors.cpp
1 parent df36d3e commit 78cd3cc

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@
2626
- Inrbl.cpp C++复现了《改进非线性亮度提升模型的逆光图像恢复》这篇论文,可以做逆光图像恢复。算法原理请看:https://blog.csdn.net/just_sort/article/details/86681325
2727
- unevenLightCompensate.cpp C++复现了《一种基于亮度均衡的图像阈值分割技术》这篇论文的光照补偿部分,可以对光照不均匀,曝光,逆光图像做亮度均衡,效果不错。原理请看:https://blog.csdn.net/just_sort/article/details/88551771
2828
- Adaptive correction algorithm for illumination inhomogeneity image based on two-dimensional gamma function.cpp C++复现了《基于二维伽马函数的光照不均匀图像自适应校正算法》这篇论文,对光照不均匀的图像有较好的校正效果,且不会像Retiex那样出现光晕。原理请看:https://blog.csdn.net/just_sort/article/details/88569129
29+
- Real-time adaptive contrast enhancement for imaging sensors.cpp C++复现了《Real-time adaptive contrast enhancement for imaging sensors》这篇论文,实时自适应局部对比度增强算法。原理请看:https://blog.csdn.net/just_sort/article/details/85208124
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//自适应对比度增强算法,C表示对高频的直接增益系数,n表示滤波半径,maxCG表示对CG做最大值限制
2+
Mat ACE(Mat src, int C = 3, int n = 3, float MaxCG = 7.5){
3+
int row = src.rows;
4+
int col = src.cols;
5+
Mat meanLocal; //图像局部均值
6+
Mat varLocal; //图像局部方差
7+
Mat meanGlobal; //全局均值
8+
Mat varGlobal; //全局标准差
9+
blur(src.clone(), meanLocal, Size(n, n));
10+
Mat highFreq = src - meanLocal;
11+
varLocal = highFreq.mul(highFreq);
12+
varLocal.convertTo(varLocal, CV_32F);
13+
for(int i = 0; i < row; i++){
14+
for(int j = 0; j < col; j++){
15+
varLocal.at<float>(i, j) = (float)sqrt(varLocal.at<float>(i, j));
16+
}
17+
}
18+
meanStdDev(src, meanGlobal, varGlobal);
19+
Mat gainArr = meanGlobal / varLocal; //增益系数矩阵
20+
for(int i = 0; i < row; i++){
21+
for(int j = 0; j < col; j++){
22+
if(gainArr.at<float>(i, j) > MaxCG){
23+
gainArr.at<float>(i, j) = MaxCG;
24+
}
25+
}
26+
}
27+
printf("%d %d\n", row, col);
28+
gainArr.convertTo(gainArr, CV_8U);
29+
gainArr = gainArr.mul(highFreq);
30+
Mat dst1 = meanLocal + gainArr;
31+
Mat dst2 = meanLocal + C * highFreq;
32+
return dst1;
33+
}
34+
35+
int main(){
36+
Mat src = imread("../test.png");
37+
vector <Mat> now;
38+
split(src, now);
39+
int C = 150;
40+
int n = 5;
41+
float MaxCG = 3;
42+
Mat dst1 = ACE(now[0], C, n, MaxCG);
43+
Mat dst2 = ACE(now[1], C, n, MaxCG);
44+
Mat dst3 = ACE(now[2], C, n, MaxCG);
45+
now.clear();
46+
Mat dst;
47+
now.push_back(dst1);
48+
now.push_back(dst2);
49+
now.push_back(dst3);
50+
cv::merge(now, dst);
51+
imshow("origin", src);
52+
imshow("result", dst);
53+
imwrite("../result.jpg", dst);
54+
waitKey(0);
55+
return 0;
56+
}

0 commit comments

Comments
 (0)