Skip to content

Commit 2bffb06

Browse files
committedNov 13, 2018
HDR
1 parent 0c2e26e commit 2bffb06

File tree

1 file changed

+214
-0
lines changed

1 file changed

+214
-0
lines changed
 

‎HDR.cpp

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
#include "function.h"
2+
3+
void simple_color_balance(float ** input_img, float ** out_img, int rows, int cols) {
4+
float max_value = 0;
5+
float min_value = 256;
6+
for (int i = 0; i < rows; i++) {
7+
for (int j = 0; j < cols; j++) {
8+
max_value = max(max_value,input_img[i][j]);
9+
min_value = min(min_value, input_img[i][j]);
10+
}
11+
}
12+
if (max_value <= min_value) {
13+
for (int i = 0; i < rows; i++) {
14+
for (int j = 0; j < cols; j++) {
15+
out_img[i][j] = max_value;
16+
}
17+
}
18+
}
19+
else {
20+
float scale = 255.0 / (max_value - min_value);
21+
for (int i = 0; i < rows; i++) {
22+
for (int j = 0; j < cols; j++) {
23+
if (input_img[i][j] < min_value) {
24+
out_img[i][j] = 0;
25+
}
26+
else if (input_img[i][j] > max_value) {
27+
out_img[i][j] = 255;
28+
}
29+
else {
30+
out_img[i][j] = scale * (input_img[i][j] - min_value);
31+
}
32+
}
33+
}
34+
}
35+
}
36+
37+
int HDR(cv::Mat input_img, cv::Mat out_img) {
38+
int rows = input_img.rows;
39+
int cols = input_img.cols;
40+
//DouImg
41+
float ***DouImg;
42+
DouImg = new float **[rows];
43+
for (int i = 0; i < rows; i++) {
44+
DouImg[i] = new float *[cols];
45+
for (int j = 0; j < cols; j++) {
46+
DouImg[i][j] = new float[3];
47+
}
48+
}
49+
for (int i = 0; i < rows; i++) {
50+
for (int j = 0; j < cols; j++) {
51+
DouImg[i][j][0] = (float)input_img.at<Vec3b>(i, j)[0];
52+
DouImg[i][j][1] = (float)input_img.at<Vec3b>(i, j)[1];
53+
DouImg[i][j][2] = (float)input_img.at<Vec3b>(i, j)[2];
54+
}
55+
}
56+
//Lw
57+
float **Lw;
58+
Lw = new float *[rows];
59+
for (int i = 0; i < rows; i++) {
60+
Lw[i] = new float [cols];
61+
}
62+
for (int i = 0; i < rows; i++) {
63+
for (int j = 0; j < cols; j++) {
64+
Lw[i][j] = 0;
65+
}
66+
}
67+
//B
68+
float **B;
69+
B = new float *[rows];
70+
for (int i = 0; i < rows; i++) {
71+
B[i] = new float[cols];
72+
}
73+
for (int i = 0; i < rows; i++) {
74+
for (int j = 0; j < cols; j++) {
75+
B[i][j] = (float)input_img.at<Vec3b>(i, j)[0];
76+
}
77+
}
78+
//G
79+
float **G;
80+
G = new float *[rows];
81+
for (int i = 0; i < rows; i++) {
82+
G[i] = new float[cols];
83+
}
84+
for (int i = 0; i < rows; i++) {
85+
for (int j = 0; j < cols; j++) {
86+
G[i][j] = (float)input_img.at<Vec3b>(i, j)[1];
87+
}
88+
}
89+
//R
90+
float **R;
91+
R = new float *[rows];
92+
for (int i = 0; i < rows; i++) {
93+
R[i] = new float[cols];
94+
}
95+
for (int i = 0; i < rows; i++) {
96+
for (int j = 0; j < cols; j++) {
97+
R[i][j] = (float)input_img.at<Vec3b>(i, j)[2];
98+
}
99+
}
100+
//Lwmax
101+
float Lwmax = 0.0;
102+
//Lw
103+
for (int i = 0; i < rows; i++) {
104+
for (int j = 0; j < cols; j++) {
105+
Lw[i][j] = 0.299 * R[i][j] + 0.587 * G[i][j] + 0.114 * B[i][j];
106+
if (Lw[i][j] == 0) {
107+
Lw[i][j] = 1;
108+
}
109+
Lwmax = max(Lw[i][j], Lwmax);
110+
}
111+
}
112+
//Lw_sum
113+
float Lw_sum = 0;
114+
//log_Lw
115+
float **log_Lw;
116+
log_Lw = new float *[rows];
117+
for (int i = 0; i < rows; i++) {
118+
log_Lw[i] = new float[cols];
119+
}
120+
for (int i = 0; i < rows; i++) {
121+
for (int j = 0; j < cols; j++) {
122+
log_Lw[i][j] = log(0.001 + Lw[i][j]);
123+
Lw_sum += log_Lw[i][j];
124+
}
125+
}
126+
//Lwaver
127+
float Lwaver = exp(Lw_sum / (rows * cols));
128+
//Lg
129+
float **Lg;
130+
Lg = new float *[rows];
131+
for (int i = 0; i < rows; i++) {
132+
Lg[i] = new float[cols];
133+
}
134+
for (int i = 0; i < rows; i++) {
135+
for (int j = 0; j < cols; j++) {
136+
Lg[i][j] = log(Lw[i][j] / Lwaver + 1) / log(Lwmax / Lwaver + 1);
137+
}
138+
}
139+
//gain
140+
float **gain;
141+
gain = new float *[rows];
142+
for (int i = 0; i < rows; i++) {
143+
gain[i] = new float[cols];
144+
}
145+
for (int i = 0; i < rows; i++) {
146+
for (int j = 0; j < cols; j++) {
147+
gain[i][j] = Lg[i][j] / Lw[i][j];
148+
}
149+
}
150+
//gain*B, gain*G, gain*R
151+
for (int i = 0; i < rows; i++) {
152+
for (int j = 0; j < cols; j++) {
153+
B[i][j] *= gain[i][j];
154+
G[i][j] *= gain[i][j];
155+
R[i][j] *= gain[i][j];
156+
}
157+
}
158+
simple_color_balance(B, B, rows, cols);
159+
simple_color_balance(G, G, rows, cols);
160+
simple_color_balance(R, R, rows, cols);
161+
162+
for (int i = 0; i < rows; i++) {
163+
for(int j = 0; j < cols; j++){
164+
out_img.at<Vec3b>(i, j)[0] = uchar((int)B[i][j]);
165+
out_img.at<Vec3b>(i, j)[1] = uchar((int)G[i][j]);
166+
out_img.at<Vec3b>(i, j)[2] = uchar((int)R[i][j]);
167+
}
168+
}
169+
//Free
170+
//DouImg
171+
for (int i = 0; i < rows; i++) {
172+
for (int j = 0; j < cols; j++) {
173+
delete DouImg[i][j];
174+
}
175+
delete DouImg[i];
176+
}
177+
delete DouImg;
178+
//Lw
179+
for (int i = 0; i < rows; i++) {
180+
delete[] Lw[i];
181+
}
182+
delete Lw;
183+
//log_Lw
184+
for (int i = 0; i < rows; i++) {
185+
delete[] log_Lw[i];
186+
}
187+
delete log_Lw;
188+
//B
189+
for (int i = 0; i < rows; i++) {
190+
delete[] B[i];
191+
}
192+
delete B;
193+
//G
194+
for (int i = 0; i < rows; i++) {
195+
delete[] G[i];
196+
}
197+
delete G;
198+
//R
199+
for (int i = 0; i < rows; i++) {
200+
delete[] R[i];
201+
}
202+
delete R;
203+
//Lg
204+
for (int i = 0; i < rows; i++) {
205+
delete[] Lg[i];
206+
}
207+
delete Lg;
208+
//gain
209+
for (int i = 0; i < rows; i++) {
210+
delete[] gain[i];
211+
}
212+
delete gain;
213+
return 0;
214+
}

0 commit comments

Comments
 (0)