4 ControlWindow controlWindow;
5 ControlWindow viewWindow;
13 float scope_ratio = 5; // 1 to 100%
15 final int low_scope_speed_ratio = 20;
16 final float low_average_speed_ratio = 0.1;
18 final int high_scope_speed_ratio = 5;
19 final float high_average_speed_ratio = 0.1;
21 int scope_speed_ratio = low_scope_speed_ratio; // 1 to scope
22 float average_speed_ratio = low_average_speed_ratio; // 0 to picture width
24 final int max_lum_class = 30; // 1 to 256
25 int class_th = 20; // class threshold
31 final float delta = 0.01;
32 float[] lut_u = new float[256];
33 float[] lut_n = new float[256];
34 float[] lut_o = new float[256];
44 int view_width, view_height;
49 cp5 = new ControlP5(this);
51 controlWindow = cp5.addControlWindow("Tunewindow", 100, 100, 360, 600)
53 .setBackground(color(40))
56 cp5.addTextlabel("guide")
59 .setColorValue(0xffffffff)
60 .setFont(createFont("Georgia",20))
61 .moveTo(controlWindow)
64 readmeText = cp5.addTextlabel("label")
65 .setText("Select an under exposed photo.")
67 .setColorValue(0xffffffff)
68 .setFont(createFont("Georgia",18))
69 .moveTo(controlWindow)
72 cp5.addSlider("gamma_u")
76 .moveTo(controlWindow)
79 cp5.addSlider("gamma_n")
83 .moveTo(controlWindow)
86 cp5.addSlider("gamma_o")
90 .moveTo(controlWindow)
93 cp5.addSlider("a_value")
97 .moveTo(controlWindow)
100 cp5.addSlider("color_gain")
102 .setPosition(40, 340)
104 .moveTo(controlWindow)
107 cp5.addSlider("scope_ratio")
109 .setPosition(40, 380)
111 .moveTo(controlWindow)
114 cp5.addSlider("class_th")
116 .setPosition(40, 420)
118 .moveTo(controlWindow)
121 cp5.addButton("Save Image")
124 .moveTo(controlWindow)
127 cp5.addButton("Exit")
128 .setPosition(160,500)
130 .moveTo(controlWindow)
133 String imgPath = selectInput();
134 img0 = loadImage(imgPath);
135 readmeText.setText("Select a normal exposed photo.");
137 imgPath = selectInput();
138 img1 = loadImage(imgPath);
140 readmeText.setText("Select an over exposed photo.");
142 imgPath = selectInput();
143 img2 = loadImage(imgPath);
145 writeImg = createImage(img0.width, img0.height, RGB);
147 // long nt = System.nanoTime();
152 // long nt2 = System.nanoTime();
155 // println("time=" +a );
157 readmeText.setText("Completed.");
159 if(img0.width > size_x || img0.height > size_y){
160 float k_width = (float)img0.width / (float)size_x;
161 float k_height = (float)img0.height / (float)size_y;
163 if(k_width > k_height){
168 view_width = (int)(img0.width/k_max);
169 view_height = (int)(img0.height/k_max);
171 view_width = img0.width;
172 view_height = img0.height;
176 public void controlEvent(ControlEvent theEvent) {
177 if(theEvent.isFrom("color_gain")) {
181 if(theEvent.isFrom("gamma_u")) {
185 if(theEvent.isFrom("gamma_n")) {
189 if(theEvent.isFrom("gamma_o")) {
193 if(theEvent.isFrom("Save Image")) {
194 String imgPath = selectOutput();
195 writeImg.save(imgPath);
198 if(theEvent.isFrom("Exit")) {
207 image(writeImg, 0, 0, view_width, view_height);
211 for (int i = 0; i < 256; i++){
212 lut_u[i] = 255*pow(((float)i/255),(1/gamma_u));
215 for (int i = 0; i < 256; i++){
216 lut_n[i] = 255*pow(((float)i/255),(1/gamma_n));
219 for (int i = 0; i < 256; i++){
220 lut_o[i] = 255*pow(((float)i/255),(1/gamma_o));
227 hdr_img_r = new int[img0.height*img0.width];
228 hdr_img_g = new int[img0.height*img0.width];
229 hdr_img_b = new int[img0.height*img0.width];
235 for(int i = 0; i < img0.width*img0.height; i++){
236 color tmp_color0 = img0.pixels[i];
237 color tmp_color1 = img1.pixels[i];
238 color tmp_color2 = img2.pixels[i];
241 (int)((lut_u[(int)red(tmp_color0)] + lut_n[(int)red(tmp_color1)] + lut_o[(int)red(tmp_color2)])*color_gain/3);
243 (int)((lut_u[(int)green(tmp_color0)] + lut_n[(int)green(tmp_color1)] + lut_o[(int)green(tmp_color2)])*color_gain/3);
245 (int)((lut_u[(int)blue(tmp_color0)] + lut_n[(int)blue(tmp_color1)] + lut_o[(int)blue(tmp_color2)])*color_gain/3);
247 // hdr_img_r[i] = hdr_img_r[i]/3*color_gain;
248 // hdr_img_g[i] = hdr_img_g[i]/3*color_gain;
249 // hdr_img_b[i] = hdr_img_b[i]/3*color_gain;
254 for(int y = 0; y < img0.height; y++){
255 for(int x = 0; x < img0.width; x++){
256 int pos = x + y*img0.width;
257 color tmp_color = color(hdr_img_r[pos], hdr_img_g[pos], hdr_img_b[pos]);
258 set(x, y, tmp_color);
271 int scope = (int)(sqrt(img0.height*img0.width) * scope_ratio/100);
272 int scope_speed = (int)(scope * scope_speed_ratio/100)+1;
273 int average_speed = (int)(sqrt(img0.height*img0.width) * average_speed_ratio/100);
276 // println("scope= " + scope);
277 // println("scope_speed= " + scope_speed);
278 // println("average_speede= " + average_speed);
281 int tmp = average_speed;
284 int[] lum = new int[img0.height*img0.width];
285 float[] lum_local = new float[img0.height*img0.width];
286 // int[] lum_local = new int[img0.height*img0.width];
287 int[] lum_class = new int[img0.height*img0.width];
288 int[] u = new int[img0.height*img0.width];
289 int[] v = new int[img0.height*img0.width];
291 for(int y = 0; y < img0.height; y++){
292 for(int x = 0; x < img0.width; x++){
293 int pos = x + y*img0.width;
294 lum[pos] = (307*hdr_img_r[pos] + 604*hdr_img_g[pos] + 113*hdr_img_b[pos]) >> 10;
295 lum_local[pos] = log((float)(lum[pos]) / 256 + delta);
296 // lum_local[pos] = (int)(log((float)(lum[pos]) / 256 + delta));
298 u[pos] = (-174*hdr_img_r[pos] - 338*hdr_img_g[pos] + 512*hdr_img_b[pos]) >> 10;
299 v[pos] = (512*hdr_img_r[pos] -430*hdr_img_g[pos] - 82*hdr_img_b[pos]) >> 10;
303 int max_lum = (int)max(lum);
304 for(int y = 0; y < img0.height; y++){
305 for(int x = 0; x < img0.width; x++){
306 int pos = x + y*img0.width;
307 lum_class[pos] = (int)(float(lum[pos])/((max_lum+1)/max_lum_class));
311 for(int y = 0; y < img0.height; y++){
313 for(int x = 0; x < img0.width; x++){
314 int pos = x + y*img0.width;
318 if(tmp > average_speed){
320 for(int y_2 = y-scope; y_2 < y+scope; y_2 += scope_speed){
321 for(int x_2 = x-scope; x_2 < x+scope; x_2 += scope_speed){
322 if(y_2 >= 0 && y_2 < img0.height && x_2 >=0 && x_2 < img0.width){
323 int pos_2 = x_2 + y_2*img0.width;
324 if(abs(lum_class[pos] - lum_class[pos_2]) < class_th){
326 lum_sum += lum_local[pos_2];
331 lum_sum_w = exp(lum_sum/(float)sum_numb);
334 float lum_w = lum[pos]/lum_sum_w*a_value;
336 int r = (int)(1024*lum_w + 1433*v[pos]) >> 10;
337 int g = (int)(1024*lum_w -348*u[pos] -727*v[pos]) >> 10;
338 int b = (int)(1024*lum_w + 1812*u[pos]) >> 10;
340 writeImg.pixels[pos] = color(r,g,b);
343 writeImg.updatePixels();
348 println("time=" +a );