ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/evalglare.c
(Generate patch)

Comparing ray/src/util/evalglare.c (file contents):
Revision 2.7 by greg, Sat Aug 12 15:11:09 2017 UTC vs.
Revision 2.10 by greg, Tue Nov 27 18:08:24 2018 UTC

# Line 1 | Line 1
1   #ifndef lint
2   static const char RCSid[] = "$Id$";
3   #endif
4 < /* EVALGLARE V2.00
4 > /* EVALGLARE V2.08
5   * Evalglare Software License, Version 2.0
6   *
7   * Copyright (c) 1995 - 2016 Fraunhofer ISE, EPFL.
# Line 318 | Line 318 | changed masking threshold to 0.05 cd/m2
318     */
319   /* evalglare.c, v2.02 2017/02/28  change of warning message, when invalid exposure setting is found. Reason: tab removal is not in all cases the right measure - it depends which tool caused the invalid exposure entry   */
320  
321 < /* evalglare.c, v2.03 2017/08/12  ad of -O option - disk replacement by providing luminance, not documented
322 < remove some minor memory leakages, clean up initialization by C. Reetz
321 > /* evalglare.c, v2.03 2017/08/04  ad of -O option - disk replacement by providing luminance, not documented
322    */
323  
324 + /* evalglare.c, v2.04 2017/08/04  adding -q option: use of Ev/pi as background luminance. not documented. no combination with -n option!!!
325 +  */
326  
327 <
328 < #ifndef EVALGLARE  
327 > /* evalglare.c, v2.05 2018/08/28  change of the -q option for the choice of the background luminance calculation mode: 0: CIE method (Ev-Edir)/pi, 1: mathematical correct average background luminance, 2: Ev/pi.
328 > change of default options:
329 > - cosinus weighted calculation of the background luminance (according to CIE) is now default.
330 > - absolute threshold for the glare source detection is now default (2000cd/m2), based on study of C. Pierson
331 >  */
332 >
333 > /* evalglare.c, v2.06 2018/08/29  
334 > change of default value of multiplier b to 5.0, if task options (-t or -T ) are activated AND -b NOT used. To be downward compatible when using the task method.
335 >  */
336 >
337 > /* evalglare.c, v2.07 2018/11/17  
338 > bugfix: correction of error in the equations of PGSV_con and PGSV_sat
339 > all three PGSV equations are calculated now
340 > illuminance from the masking area (E_v_mask) is also printed
341 > bugfix: in VCPs error fuction equation, value of 6.347 replaced by 6.374
342 >  */
343 >
344 > /* evalglare.c, v2.08 2018/11/27
345 > bugfix: checkroutine for same image size for the masking corrected
346 >  */
347 >
348 >
349 >  
350   #define EVALGLARE
329 #endif
351   #define PROGNAME "evalglare"
352 < #define VERSION "2.03 release 12.08.2017 by EPFL, J.Wienold"
352 > #define VERSION "2.08 release 27.11.2018 by EPFL, J.Wienold"
353   #define RELEASENAME PROGNAME " " VERSION
354  
355  
# Line 1180 | Line 1201 | float get_vcp(float dgr )
1201   {
1202          float vcp;
1203  
1204 <        vcp = 50 * erf((6.347 - 1.3227 * log(dgr)) / 1.414213562373) + 50;
1204 >        vcp = 50 * erf((6.374 - 1.3227 * log(dgr)) / 1.414213562373) + 50;
1205          if (dgr > 750) {
1206                  vcp = 0;
1207          }
# Line 1351 | Line 1372 | float get_cgi(pict * p, double E_v, double E_v_dir, in
1372          return cgi;
1373   }      
1374  
1375 < /* subroutine for the calculation of the PGSV; is only applied, when masking is done, since it refers only to the window. Important: masking area must be the window! */
1376 < float get_pgsv(double E_v, double E_mask,double omega_mask,double lum_mask_av)
1375 >
1376 >
1377 > /* subroutine for the calculation of the PGSV_con; is only applied, when masking is done, since it refers only to the window. Important: masking area must be the window! */
1378 > float get_pgsv_con(double E_v, double E_mask,double omega_mask,double lum_mask_av, double Lavg)
1379   {
1380 <        float pgsv;
1380 >        float pgsv_con;
1381          double Lb;
1382  
1383 <        Lb = (E_v-E_mask)/1.414213562373;
1383 > /*        Lb = (E_v-E_mask)/3.14159265359;  */
1384 > /*        Lb = (2*E_v-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask); */
1385 >          Lb = (2*3.14159265359*Lavg-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask);
1386  
1362        pgsv =3.2*log10(lum_mask_av)-0.64*log10(omega_mask)+(0.79*log10(omega_mask)-0.61)*log10(Lb)-8.2 ;
1387  
1388 +        pgsv_con =3.2*log10(lum_mask_av)-0.64*log10(omega_mask)+(0.79*log10(omega_mask)-0.61)*log10(Lb)-8.2 ;
1389  
1390 <        return pgsv;
1390 >
1391 >        return pgsv_con;
1392   }
1393  
1394   /* subroutine for the calculation of the PGSV_saturation; is only applied, when masking is done, since it refers only to the window. Important: masking area must be the window! */
# Line 1370 | Line 1396 | float get_pgsv_sat(double E_v)
1396   {
1397          float pgsv_sat;
1398  
1399 <        pgsv_sat =3.3-(0.57+3.3)/pow((1+E_v/1.414213562373/1250),1.7);
1399 >        pgsv_sat =3.3-(0.57+3.3)/(1+pow(E_v/3.14159265359/1250,1.7));
1400  
1401  
1402          return pgsv_sat;
1403   }
1404  
1405 + /* subroutine for the calculation of the PGSV; is only applied, when masking is done, since it refers only to the window. Important: masking area must be the window! */
1406  
1407 + float get_pgsv(double E_v, double E_mask,double omega_mask,double lum_mask_av,double Ltask, double Lavg)
1408 + {
1409 +        float pgsv;
1410 +        double Lb;
1411  
1412 + /*        Lb = (E_v-E_mask)/3.14159265359;  */
1413 + /*        Lb = (2*E_v-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask); */
1414 +          Lb = (2*3.14159265359*Lavg-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask);
1415 +        
1416 +        if (Lb==0.0 ) {
1417 +               fprintf(stderr,  " warning: Background luminance is 0 or masking area = full image! pgsv cannot be calculated (set to -99)!!\n");
1418 +                pgsv=-99;
1419 +                        }else{
1420 +                if ( (lum_mask_av/Lb) > (E_v/(3.14159265359*Ltask))) {
1421 +                        pgsv=get_pgsv_con(E_v,E_mask,omega_mask,lum_mask_av, Lavg);
1422 +                }else{
1423 +                        pgsv=get_pgsv_sat(E_v)  ;
1424 +                        }}
1425 +        return pgsv;
1426  
1427 + }
1428 +
1429 +
1430 +
1431   #ifdef  EVALGLARE
1432  
1433  
# Line 1393 | Line 1442 | int main(int argc, char **argv)
1442          pict *pm = pict_create();
1443          int     skip_second_scan,calcfast,age_corr,cut_view,cut_view_type,calc_vill, output, detail_out2, x1,y1, fill, yfillmax, yfillmin,
1444                  ext_vill, set_lum_max, set_lum_max2, img_corr,x_disk,y_disk,task_color, i_splitstart,zones,act_gsn,splitgs,
1445 <                i_split, posindex_2, task_lum, checkfile, rval, i, i_max, x, y,x2,y2,x_zone,y_zone, i_z1, i_z2,
1445 >                i_split, posindex_2, task_lum, checkfile, rval, i, i_max, x, y,x2,y2,x_zone,y_zone, i_z1, i_z2, thres_activate,
1446                  igs, actual_igs, lastpixelwas_gs, icol, xt, yt, change,checkpixels, before_igs, sgs, splithigh,uniform_gs,x_max, y_max,y_mid,
1447                  detail_out, posindex_picture, non_cos_lb, rx, ry, rmx,rmy,apply_disability,band_calc,band_color,masking,i_mask,no_glaresources,force;
1448          double  LUM_replace,lum_total_max,age_corr_factor,age,dgp_ext,dgp,low_light_corr,omega_cos_contr, setvalue, lum_ideal, E_v_contr, sigma,om,delta_E,
1449 <                E_vl_ext, lum_max, new_lum_max, r_center, ugp, ugr_exp, dgi_mod,lum_a, pgsv,E_v_mask,pgsv_sat,angle_disk,dist,n_corner_px,zero_corner_px,
1449 >                E_vl_ext, lum_max, new_lum_max, r_center, ugp, ugr_exp, dgi_mod,lum_a, E_v_mask,angle_disk,dist,n_corner_px,zero_corner_px,
1450                  search_pix, a1, a2, a3, a4, a5, c3, c1, c2, r_split, max_angle,r_actual,lum_actual,dir_ill,
1451                  omegat, sang, E_v, E_v2, E_v_dir, avlum, act_lum, ang, angle_z1, angle_z2,per_95_band,per_75_band,pos,
1452                  l_max, lum_backg, lum_backg_cos, omega_sources, lum_sources,per_75_mask,per_95_mask,per_75_z1,per_95_z1,per_75_z2,per_95_z2,
# Line 1407 | Line 1456 | int main(int argc, char **argv)
1456                  lum_z1[1],lum_z1_av,lum_z1_std[1],lum_z1_median[1],omega_z1,bbox_z1[2],
1457                  lum_z2[1],lum_z2_av,lum_z2_std[1],lum_z2_median[1],omega_z2,bbox_z2[2],
1458                  lum_pos[1],lum_nopos_median[1],lum_pos_median[1],lum_pos2_median[1],lum_pos_mean,lum_pos2_mean;
1459 <        float lum_task, lum_thres, dgi,  vcp, cgi, ugr, limit, dgr,
1459 >        float lum_task, lum_thres, dgi,  vcp, cgi, ugr, limit, dgr,pgsv ,pgsv_sat,pgsv_con,
1460                  abs_max, Lveil;
1461          char maskfile[500],file_out[500], file_out2[500], version[500];
1462 <        char *cline = NULL;
1462 >        char *cline;
1463          VIEW userview = STDVIEW;
1464          int gotuserview = 0;
1465 <        struct muc_rvar* s_mask = NULL;
1417 <        struct muc_rvar* s_band = NULL;
1418 <        struct muc_rvar* s_z1 = NULL;
1419 <        struct muc_rvar* s_z2 = NULL;
1420 <        struct muc_rvar* s_noposweight = NULL;
1421 <        struct muc_rvar* s_posweight = NULL;
1422 <        struct muc_rvar* s_posweight2 = NULL;
1423 <
1424 <        // initializing variables ....
1425 <        Lveil = lum_backg_cos = 0;
1426 <        dgi = ugr = ugp = ugr_exp = dgi_mod = cgi = dgr = vcp = 0.0;
1427 <        lum_task = lum_thres = limit = 0;
1465 >        struct muc_rvar* s_mask;
1466          s_mask = muc_rvar_create();
1467 <        muc_rvar_set_dim(s_mask, 1);
1467 >        muc_rvar_set_dim(s_mask, 1);
1468          muc_rvar_clear(s_mask);
1469 +        struct muc_rvar* s_band;
1470          s_band = muc_rvar_create();
1471 <        muc_rvar_set_dim(s_band, 1);
1471 >        muc_rvar_set_dim(s_band, 1);
1472          muc_rvar_clear(s_band);
1473 +        struct muc_rvar* s_z1;
1474          s_z1 = muc_rvar_create();
1475 <        muc_rvar_set_dim(s_z1, 1);
1475 >        muc_rvar_set_dim(s_z1, 1);
1476          muc_rvar_clear(s_z1);
1477  
1478 +        struct muc_rvar* s_z2;
1479          s_z2 = muc_rvar_create();
1480 <        muc_rvar_set_dim(s_z2, 1);
1480 >        muc_rvar_set_dim(s_z2, 1);
1481          muc_rvar_clear(s_z2);
1482  
1483 +        struct muc_rvar* s_noposweight;
1484          s_noposweight = muc_rvar_create();
1485 <        muc_rvar_set_dim(s_noposweight, 1);
1485 >        muc_rvar_set_dim(s_noposweight, 1);
1486          muc_rvar_clear(s_noposweight);
1487  
1488 +        struct muc_rvar* s_posweight;
1489          s_posweight = muc_rvar_create();
1490 <        muc_rvar_set_dim(s_posweight, 1);
1490 >        muc_rvar_set_dim(s_posweight, 1);
1491          muc_rvar_clear(s_posweight);
1492  
1493 +        struct muc_rvar* s_posweight2;
1494          s_posweight2 = muc_rvar_create();
1495 <        muc_rvar_set_dim(s_posweight2, 1);
1495 >        muc_rvar_set_dim(s_posweight2, 1);
1496          muc_rvar_clear(s_posweight2);
1497  
1498          /*set required user view parameters to invalid values*/
# Line 1474 | Line 1518 | int main(int argc, char **argv)
1518          lum_band_av = 0.0;
1519          omega_band = 0.0;
1520          pgsv = 0.0 ;
1521 +        pgsv_con = 0.0 ;
1522          pgsv_sat = 0.0 ;
1523          E_v_mask = 0.0;
1524          lum_z1_av = 0.0;
# Line 1515 | Line 1560 | int main(int argc, char **argv)
1560          omega_cos_contr = 0.0;
1561          lum_ideal = 0.0;
1562          max_angle = 0.2;
1563 <        lum_thres = 5.0;
1563 >        lum_thres = 2000.0;
1564 >        lum_task = 0.0;
1565          task_lum = 0;
1566          sgs = 0;
1567          splithigh = 1;
# Line 1533 | Line 1579 | int main(int argc, char **argv)
1579          c1 = 5.87e-05;
1580          c2 = 0.092;
1581          c3 = 0.159;
1582 <        non_cos_lb = 1;
1582 >        non_cos_lb = 0;
1583          posindex_2 = 0;
1584          task_color = 0;
1585          limit = 50000.0;
# Line 1556 | Line 1602 | int main(int argc, char **argv)
1602          i_mask=0;
1603          actual_igs=0;
1604          LUM_replace=0;
1605 +        thres_activate=0;
1606   /* command line for output picture*/
1607  
1608          cline = (char *) malloc(CLINEMAX+1);
# Line 1606 | Line 1653 | int main(int argc, char **argv)
1653                          break;
1654                  case 'b':
1655                          lum_thres = atof(argv[++i]);
1656 +                        thres_activate = 1;
1657                          break;
1658                  case 'c':
1659                          checkfile = 1;
# Line 1706 | Line 1754 | int main(int argc, char **argv)
1754                          break;
1755  
1756  
1757 <                case 'n':
1757 > /* deactivated          case 'n':
1758                          non_cos_lb = 0;
1759                          break;
1760 + */
1761 +                case 'q':
1762 +                        non_cos_lb = atoi(argv[++i]);
1763 +                        break;
1764  
1765                  case 't':
1766                          task_lum = 1;
# Line 1810 | Line 1862 | int main(int argc, char **argv)
1862                  }
1863          }
1864  
1865 + /* set multiplier for task method to 5, if not specified */
1866 +
1867 + if ( task_lum == 1 && thres_activate == 0){
1868 +                lum_thres = 5.0;
1869 + }
1870   /*fast calculation, if gendgp_profile is used: No Vertical illuminance calculation, only dgp is calculated*/
1871  
1872   if (output == 1 && ext_vill == 1 ) {
# Line 1880 | Line 1937 | if (masking ==1 && zones >0) {
1937  
1938          if (masking == 1) {
1939  
1940 <                if (!pict_get_xsize(p)==pict_get_xsize(pm) || !pict_get_ysize(p)==pict_get_ysize(pm)) {
1940 >                if (pict_get_xsize(p)!=pict_get_xsize(pm) || pict_get_ysize(p)!=pict_get_ysize(pm)) {
1941                  fprintf(stderr, "error: masking image has other resolution than main image ! \n");
1942                  fprintf(stderr, "size must be identical \n");
1943                  printf("resolution main image : %dx%d\n",pict_get_xsize(p),pict_get_ysize(p));
# Line 2108 | Line 2165 | if (cut_view==2) {
2165          lum_pos_mean= lum_pos_mean/sang;
2166          lum_pos2_mean= lum_pos2_mean/sang;
2167  
2168 <        // XXX: sure this works? I'd suggest parenthesis.
2112 <        if ((set_lum_max2 >= 1 && E_v_contr > 0 && (E_vl_ext - E_v) > 0) || set_lum_max2==3) {
2168 >        if ((set_lum_max2 >= 1 && E_v_contr > 0 && (E_vl_ext - E_v) > 0 ) || set_lum_max2==3) {
2169  
2170                  if (set_lum_max2<3){
2171                  lum_ideal = (E_vl_ext - E_v + E_v_contr) / omega_cos_contr;
# Line 2540 | Line 2596 | if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2
2596                          lum_backg = lum_backg_cos;
2597          }
2598  
2599 +        if (non_cos_lb == 2) {
2600 +                        lum_backg = E_v / 3.1415927;
2601 +        }
2602 +
2603 +
2604   /* file writing NOT here
2605          if (checkfile == 1) {
2606                  pict_write(p, file_out);
# Line 2591 | Line 2652 | if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2
2652                  muc_rvar_get_median(s_mask,lum_mask_median);
2653                  muc_rvar_get_bounding_box(s_mask,bbox);
2654   /* PSGV only why masking of window is applied! */
2655 <                 pgsv = get_pgsv(E_v, E_v_mask, omega_mask, lum_mask_av);
2655 >
2656 >        
2657 >        if (task_lum == 0 || lum_task == 0.0 ) {
2658 >                        fprintf(stderr, " warning: Task area not set or task luminance=0 ! pgsv cannot be calculated (set to -99)!!\n");
2659 >                        pgsv = -99;
2660 >                } else {
2661 >                        pgsv = get_pgsv(E_v, E_v_mask, omega_mask, lum_mask_av,lum_task,avlum);
2662 >                        }
2663 >
2664 >                 pgsv_con = get_pgsv_con(E_v, E_v_mask, omega_mask, lum_mask_av,avlum);
2665                   pgsv_sat =get_pgsv_sat(E_v);
2666  
2667          if (detail_out == 1) {
2668  
2669 <                printf ("masking:no_pixels,omega,av_lum,median_lum,std_lum,perc_75,perc_95,lum_min,lum_max,pgsv,pgsv_sat: %i %f %f %f %f %f %f %f %f %f %f\n",i_mask,omega_mask,lum_mask_av,lum_mask_median[0],sqrt(lum_mask_std[0]),per_75_mask,per_95_mask,bbox[0],bbox[1],pgsv,pgsv_sat );
2669 >                printf ("masking:no_pixels,omega,av_lum,median_lum,std_lum,perc_75,perc_95,lum_min,lum_max,pgsv_con,pgsv_sat,pgsv,Ev_mask: %i %f %f %f %f %f %f %f %f %f %f %f %f\n",i_mask,omega_mask,lum_mask_av,lum_mask_median[0],sqrt(lum_mask_std[0]),per_75_mask,per_95_mask,bbox[0],bbox[1],pgsv_con,pgsv_sat,pgsv,E_v_mask );
2670  
2671          }      
2672                  
# Line 2921 | Line 2991 | has to be re-written from scratch....
2991          }
2992  
2993  
2994 <        pict_free(p);
2925 <        pict_free(pm);
2926 <        muc_rvar_free(s_mask);
2927 <        muc_rvar_free(s_band);
2928 <        muc_rvar_free(s_z1);
2929 <        muc_rvar_free(s_z2);
2930 <        muc_rvar_free(s_noposweight);
2931 <        muc_rvar_free(s_posweight);
2932 <        muc_rvar_free(s_posweight2);
2933 <        free(cline);
2994 >
2995          return EXIT_SUCCESS;
2996 +        exit(0);
2997  
2998    userr:
2999          fprintf(stderr,
3000                          "Usage: %s [-s][-d][-c picture][-t xpos ypos angle] [-T xpos ypos angle] [-b fact] [-r angle] [-y] [-Y lum] [-i Ev] [-I Ev ymax ymin] [-v] picfile\n",
3001                          progname);
3002 <        pict_free(p);
2941 <        pict_free(pm);
2942 <        muc_rvar_free(s_mask);
2943 <        muc_rvar_free(s_band);
2944 <        muc_rvar_free(s_z1);
2945 <        muc_rvar_free(s_z2);
2946 <        muc_rvar_free(s_noposweight);
2947 <        muc_rvar_free(s_posweight);
2948 <        muc_rvar_free(s_posweight2);
2949 <        free(cline);
2950 <        return 1;
3002 >        exit(1);
3003   }
3004  
3005  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines