1 |
|
#ifndef lint |
2 |
|
static const char RCSid[] = "$Id$"; |
3 |
|
#endif |
4 |
< |
/* EVALGLARE V2.00 |
4 |
> |
/* EVALGLARE V2.07 |
5 |
|
* Evalglare Software License, Version 2.0 |
6 |
|
* |
7 |
|
* Copyright (c) 1995 - 2016 Fraunhofer ISE, EPFL. |
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/06 |
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 |
|
#define EVALGLARE |
329 |
– |
#endif |
345 |
|
#define PROGNAME "evalglare" |
346 |
< |
#define VERSION "2.03 release 12.08.2017 by EPFL, J.Wienold" |
346 |
> |
#define VERSION "2.07 release 17.11.2018 by EPFL, J.Wienold" |
347 |
|
#define RELEASENAME PROGNAME " " VERSION |
348 |
|
|
349 |
|
|
1195 |
|
{ |
1196 |
|
float vcp; |
1197 |
|
|
1198 |
< |
vcp = 50 * erf((6.347 - 1.3227 * log(dgr)) / 1.414213562373) + 50; |
1198 |
> |
vcp = 50 * erf((6.374 - 1.3227 * log(dgr)) / 1.414213562373) + 50; |
1199 |
|
if (dgr > 750) { |
1200 |
|
vcp = 0; |
1201 |
|
} |
1366 |
|
return cgi; |
1367 |
|
} |
1368 |
|
|
1369 |
< |
/* 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! */ |
1370 |
< |
float get_pgsv(double E_v, double E_mask,double omega_mask,double lum_mask_av) |
1369 |
> |
|
1370 |
> |
|
1371 |
> |
/* 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! */ |
1372 |
> |
float get_pgsv_con(double E_v, double E_mask,double omega_mask,double lum_mask_av, double Lavg) |
1373 |
|
{ |
1374 |
< |
float pgsv; |
1374 |
> |
float pgsv_con; |
1375 |
|
double Lb; |
1376 |
|
|
1377 |
< |
Lb = (E_v-E_mask)/1.414213562373; |
1377 |
> |
/* Lb = (E_v-E_mask)/3.14159265359; */ |
1378 |
> |
/* Lb = (2*E_v-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask); */ |
1379 |
> |
Lb = (2*3.14159265359*Lavg-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask); |
1380 |
|
|
1362 |
– |
pgsv =3.2*log10(lum_mask_av)-0.64*log10(omega_mask)+(0.79*log10(omega_mask)-0.61)*log10(Lb)-8.2 ; |
1381 |
|
|
1382 |
+ |
pgsv_con =3.2*log10(lum_mask_av)-0.64*log10(omega_mask)+(0.79*log10(omega_mask)-0.61)*log10(Lb)-8.2 ; |
1383 |
|
|
1384 |
< |
return pgsv; |
1384 |
> |
|
1385 |
> |
return pgsv_con; |
1386 |
|
} |
1387 |
|
|
1388 |
|
/* 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! */ |
1390 |
|
{ |
1391 |
|
float pgsv_sat; |
1392 |
|
|
1393 |
< |
pgsv_sat =3.3-(0.57+3.3)/pow((1+E_v/1.414213562373/1250),1.7); |
1393 |
> |
pgsv_sat =3.3-(0.57+3.3)/(1+pow(E_v/3.14159265359/1250,1.7)); |
1394 |
|
|
1395 |
|
|
1396 |
|
return pgsv_sat; |
1397 |
|
} |
1398 |
|
|
1399 |
+ |
/* 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! */ |
1400 |
|
|
1401 |
+ |
float get_pgsv(double E_v, double E_mask,double omega_mask,double lum_mask_av,double Ltask, double Lavg) |
1402 |
+ |
{ |
1403 |
+ |
float pgsv; |
1404 |
+ |
double Lb; |
1405 |
|
|
1406 |
+ |
/* Lb = (E_v-E_mask)/3.14159265359; */ |
1407 |
+ |
/* Lb = (2*E_v-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask); */ |
1408 |
+ |
Lb = (2*3.14159265359*Lavg-lum_mask_av*omega_mask)/(2*3.14159265359-omega_mask); |
1409 |
+ |
|
1410 |
+ |
if (Lb==0.0 ) { |
1411 |
+ |
fprintf(stderr, " warning: Background luminance is 0 or masking area = full image! pgsv cannot be calculated (set to -99)!!\n"); |
1412 |
+ |
pgsv=-99; |
1413 |
+ |
}else{ |
1414 |
+ |
if ( (lum_mask_av/Lb) > (E_v/(3.14159265359*Ltask))) { |
1415 |
+ |
pgsv=get_pgsv_con(E_v,E_mask,omega_mask,lum_mask_av, Lavg); |
1416 |
+ |
}else{ |
1417 |
+ |
pgsv=get_pgsv_sat(E_v) ; |
1418 |
+ |
}} |
1419 |
+ |
return pgsv; |
1420 |
|
|
1421 |
+ |
} |
1422 |
+ |
|
1423 |
+ |
|
1424 |
+ |
|
1425 |
|
#ifdef EVALGLARE |
1426 |
|
|
1427 |
|
|
1436 |
|
pict *pm = pict_create(); |
1437 |
|
int skip_second_scan,calcfast,age_corr,cut_view,cut_view_type,calc_vill, output, detail_out2, x1,y1, fill, yfillmax, yfillmin, |
1438 |
|
ext_vill, set_lum_max, set_lum_max2, img_corr,x_disk,y_disk,task_color, i_splitstart,zones,act_gsn,splitgs, |
1439 |
< |
i_split, posindex_2, task_lum, checkfile, rval, i, i_max, x, y,x2,y2,x_zone,y_zone, i_z1, i_z2, |
1439 |
> |
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, |
1440 |
|
igs, actual_igs, lastpixelwas_gs, icol, xt, yt, change,checkpixels, before_igs, sgs, splithigh,uniform_gs,x_max, y_max,y_mid, |
1441 |
|
detail_out, posindex_picture, non_cos_lb, rx, ry, rmx,rmy,apply_disability,band_calc,band_color,masking,i_mask,no_glaresources,force; |
1442 |
|
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, |
1443 |
< |
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, |
1443 |
> |
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, |
1444 |
|
search_pix, a1, a2, a3, a4, a5, c3, c1, c2, r_split, max_angle,r_actual,lum_actual,dir_ill, |
1445 |
|
omegat, sang, E_v, E_v2, E_v_dir, avlum, act_lum, ang, angle_z1, angle_z2,per_95_band,per_75_band,pos, |
1446 |
|
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, |
1450 |
|
lum_z1[1],lum_z1_av,lum_z1_std[1],lum_z1_median[1],omega_z1,bbox_z1[2], |
1451 |
|
lum_z2[1],lum_z2_av,lum_z2_std[1],lum_z2_median[1],omega_z2,bbox_z2[2], |
1452 |
|
lum_pos[1],lum_nopos_median[1],lum_pos_median[1],lum_pos2_median[1],lum_pos_mean,lum_pos2_mean; |
1453 |
< |
float lum_task, lum_thres, dgi, vcp, cgi, ugr, limit, dgr, |
1453 |
> |
float lum_task, lum_thres, dgi, vcp, cgi, ugr, limit, dgr,pgsv ,pgsv_sat,pgsv_con, |
1454 |
|
abs_max, Lveil; |
1455 |
|
char maskfile[500],file_out[500], file_out2[500], version[500]; |
1456 |
< |
char *cline = NULL; |
1456 |
> |
char *cline; |
1457 |
|
VIEW userview = STDVIEW; |
1458 |
|
int gotuserview = 0; |
1459 |
< |
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; |
1459 |
> |
struct muc_rvar* s_mask; |
1460 |
|
s_mask = muc_rvar_create(); |
1461 |
< |
muc_rvar_set_dim(s_mask, 1); |
1461 |
> |
muc_rvar_set_dim(s_mask, 1); |
1462 |
|
muc_rvar_clear(s_mask); |
1463 |
+ |
struct muc_rvar* s_band; |
1464 |
|
s_band = muc_rvar_create(); |
1465 |
< |
muc_rvar_set_dim(s_band, 1); |
1465 |
> |
muc_rvar_set_dim(s_band, 1); |
1466 |
|
muc_rvar_clear(s_band); |
1467 |
+ |
struct muc_rvar* s_z1; |
1468 |
|
s_z1 = muc_rvar_create(); |
1469 |
< |
muc_rvar_set_dim(s_z1, 1); |
1469 |
> |
muc_rvar_set_dim(s_z1, 1); |
1470 |
|
muc_rvar_clear(s_z1); |
1471 |
|
|
1472 |
+ |
struct muc_rvar* s_z2; |
1473 |
|
s_z2 = muc_rvar_create(); |
1474 |
< |
muc_rvar_set_dim(s_z2, 1); |
1474 |
> |
muc_rvar_set_dim(s_z2, 1); |
1475 |
|
muc_rvar_clear(s_z2); |
1476 |
|
|
1477 |
+ |
struct muc_rvar* s_noposweight; |
1478 |
|
s_noposweight = muc_rvar_create(); |
1479 |
< |
muc_rvar_set_dim(s_noposweight, 1); |
1479 |
> |
muc_rvar_set_dim(s_noposweight, 1); |
1480 |
|
muc_rvar_clear(s_noposweight); |
1481 |
|
|
1482 |
+ |
struct muc_rvar* s_posweight; |
1483 |
|
s_posweight = muc_rvar_create(); |
1484 |
< |
muc_rvar_set_dim(s_posweight, 1); |
1484 |
> |
muc_rvar_set_dim(s_posweight, 1); |
1485 |
|
muc_rvar_clear(s_posweight); |
1486 |
|
|
1487 |
+ |
struct muc_rvar* s_posweight2; |
1488 |
|
s_posweight2 = muc_rvar_create(); |
1489 |
< |
muc_rvar_set_dim(s_posweight2, 1); |
1489 |
> |
muc_rvar_set_dim(s_posweight2, 1); |
1490 |
|
muc_rvar_clear(s_posweight2); |
1491 |
|
|
1492 |
|
/*set required user view parameters to invalid values*/ |
1512 |
|
lum_band_av = 0.0; |
1513 |
|
omega_band = 0.0; |
1514 |
|
pgsv = 0.0 ; |
1515 |
+ |
pgsv_con = 0.0 ; |
1516 |
|
pgsv_sat = 0.0 ; |
1517 |
|
E_v_mask = 0.0; |
1518 |
|
lum_z1_av = 0.0; |
1554 |
|
omega_cos_contr = 0.0; |
1555 |
|
lum_ideal = 0.0; |
1556 |
|
max_angle = 0.2; |
1557 |
< |
lum_thres = 5.0; |
1557 |
> |
lum_thres = 2000.0; |
1558 |
> |
lum_task = 0.0; |
1559 |
|
task_lum = 0; |
1560 |
|
sgs = 0; |
1561 |
|
splithigh = 1; |
1573 |
|
c1 = 5.87e-05; |
1574 |
|
c2 = 0.092; |
1575 |
|
c3 = 0.159; |
1576 |
< |
non_cos_lb = 1; |
1576 |
> |
non_cos_lb = 0; |
1577 |
|
posindex_2 = 0; |
1578 |
|
task_color = 0; |
1579 |
|
limit = 50000.0; |
1596 |
|
i_mask=0; |
1597 |
|
actual_igs=0; |
1598 |
|
LUM_replace=0; |
1599 |
+ |
thres_activate=0; |
1600 |
|
/* command line for output picture*/ |
1601 |
|
|
1602 |
|
cline = (char *) malloc(CLINEMAX+1); |
1647 |
|
break; |
1648 |
|
case 'b': |
1649 |
|
lum_thres = atof(argv[++i]); |
1650 |
+ |
thres_activate = 1; |
1651 |
|
break; |
1652 |
|
case 'c': |
1653 |
|
checkfile = 1; |
1748 |
|
break; |
1749 |
|
|
1750 |
|
|
1751 |
< |
case 'n': |
1751 |
> |
/* deactivated case 'n': |
1752 |
|
non_cos_lb = 0; |
1753 |
|
break; |
1754 |
+ |
*/ |
1755 |
+ |
case 'q': |
1756 |
+ |
non_cos_lb = atoi(argv[++i]); |
1757 |
+ |
break; |
1758 |
|
|
1759 |
|
case 't': |
1760 |
|
task_lum = 1; |
1856 |
|
} |
1857 |
|
} |
1858 |
|
|
1859 |
+ |
/* set multiplier for task method to 5, if not specified */ |
1860 |
+ |
|
1861 |
+ |
if ( task_lum == 1 && thres_activate == 0){ |
1862 |
+ |
lum_thres = 5.0; |
1863 |
+ |
} |
1864 |
|
/*fast calculation, if gendgp_profile is used: No Vertical illuminance calculation, only dgp is calculated*/ |
1865 |
|
|
1866 |
|
if (output == 1 && ext_vill == 1 ) { |
2159 |
|
lum_pos_mean= lum_pos_mean/sang; |
2160 |
|
lum_pos2_mean= lum_pos2_mean/sang; |
2161 |
|
|
2162 |
< |
// 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) { |
2162 |
> |
if ((set_lum_max2 >= 1 && E_v_contr > 0 && (E_vl_ext - E_v) > 0 ) || set_lum_max2==3) { |
2163 |
|
|
2164 |
|
if (set_lum_max2<3){ |
2165 |
|
lum_ideal = (E_vl_ext - E_v + E_v_contr) / omega_cos_contr; |
2590 |
|
lum_backg = lum_backg_cos; |
2591 |
|
} |
2592 |
|
|
2593 |
+ |
if (non_cos_lb == 2) { |
2594 |
+ |
lum_backg = E_v / 3.1415927; |
2595 |
+ |
} |
2596 |
+ |
|
2597 |
+ |
|
2598 |
|
/* file writing NOT here |
2599 |
|
if (checkfile == 1) { |
2600 |
|
pict_write(p, file_out); |
2646 |
|
muc_rvar_get_median(s_mask,lum_mask_median); |
2647 |
|
muc_rvar_get_bounding_box(s_mask,bbox); |
2648 |
|
/* PSGV only why masking of window is applied! */ |
2649 |
< |
pgsv = get_pgsv(E_v, E_v_mask, omega_mask, lum_mask_av); |
2649 |
> |
|
2650 |
> |
|
2651 |
> |
if (task_lum == 0 || lum_task == 0.0 ) { |
2652 |
> |
fprintf(stderr, " warning: Task area not set or task luminance=0 ! pgsv cannot be calculated (set to -99)!!\n"); |
2653 |
> |
pgsv = -99; |
2654 |
> |
} else { |
2655 |
> |
pgsv = get_pgsv(E_v, E_v_mask, omega_mask, lum_mask_av,lum_task,avlum); |
2656 |
> |
} |
2657 |
> |
|
2658 |
> |
pgsv_con = get_pgsv_con(E_v, E_v_mask, omega_mask, lum_mask_av,avlum); |
2659 |
|
pgsv_sat =get_pgsv_sat(E_v); |
2660 |
|
|
2661 |
|
if (detail_out == 1) { |
2662 |
|
|
2663 |
< |
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 ); |
2663 |
> |
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 ); |
2664 |
|
|
2665 |
|
} |
2666 |
|
|
2985 |
|
} |
2986 |
|
|
2987 |
|
|
2988 |
< |
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); |
2988 |
> |
|
2989 |
|
return EXIT_SUCCESS; |
2990 |
+ |
exit(0); |
2991 |
|
|
2992 |
|
userr: |
2993 |
|
fprintf(stderr, |
2994 |
|
"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", |
2995 |
|
progname); |
2996 |
< |
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; |
2996 |
> |
exit(1); |
2997 |
|
} |
2998 |
|
|
2999 |
|
|