| 1 |
|
#ifndef lint |
| 2 |
|
static const char RCSid[] = "$Id$"; |
| 3 |
|
#endif |
| 4 |
< |
/* EVALGLARE V2.06 |
| 4 |
> |
/* EVALGLARE V2.07 |
| 5 |
|
* Evalglare Software License, Version 2.0 |
| 6 |
|
* |
| 7 |
|
* Copyright (c) 1995 - 2016 Fraunhofer ISE, EPFL. |
| 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 |
| 345 |
|
#define PROGNAME "evalglare" |
| 346 |
< |
#define VERSION "2.06 release 29.08.2018 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 |
|
|
| 1371 |
– |
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 |
|
|
| 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; |
| 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; |
| 1555 |
|
lum_ideal = 0.0; |
| 1556 |
|
max_angle = 0.2; |
| 1557 |
|
lum_thres = 2000.0; |
| 1558 |
+ |
lum_task = 0.0; |
| 1559 |
|
task_lum = 0; |
| 1560 |
|
sgs = 0; |
| 1561 |
|
splithigh = 1; |
| 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 |
|
|