| 1 |
|
#ifndef lint |
| 2 |
|
static const char RCSid[] = "$Id$"; |
| 3 |
|
#endif |
| 4 |
< |
/* EVALGLARE V2.07 |
| 4 |
> |
/* EVALGLARE V2.10 |
| 5 |
|
* Evalglare Software License, Version 2.0 |
| 6 |
|
* |
| 7 |
< |
* Copyright (c) 1995 - 2016 Fraunhofer ISE, EPFL. |
| 7 |
> |
* Copyright (c) 1995 - 2020 Fraunhofer ISE, EPFL. |
| 8 |
|
* All rights reserved. |
| 9 |
|
* |
| 10 |
|
* |
| 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 |
| 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 |
< |
|
| 343 |
> |
|
| 344 |
> |
/* evalglare.c, v2.08 2018/11/27 |
| 345 |
> |
bugfix: checkroutine for same image size for the masking corrected |
| 346 |
> |
*/ |
| 347 |
> |
|
| 348 |
> |
/* evalglare.c, v2.09 2019/01/18 |
| 349 |
> |
calculate "illuminance-contribution of zones" |
| 350 |
> |
-switch to turn off low-light correction: 4 |
| 351 |
> |
*/ |
| 352 |
> |
|
| 353 |
> |
/* evalglare.c, v2.10 2019/07/30, 2020/06/25 |
| 354 |
> |
-add multiimage-mode for annual glare evaluation -Q |
| 355 |
> |
-extra output for multiimage mode |
| 356 |
> |
2020/06/22 - added Ev contribution from each glare source as output to the multiimage mode |
| 357 |
> |
-switch for correction modes (-C), value of 0 switches off all corrections |
| 358 |
> |
*/ |
| 359 |
> |
|
| 360 |
|
#define EVALGLARE |
| 361 |
|
#define PROGNAME "evalglare" |
| 362 |
< |
#define VERSION "2.07 release 17.11.2018 by EPFL, J.Wienold" |
| 362 |
> |
#define VERSION "2.10 release 25.06.2020 by EPFL, J.Wienold" |
| 363 |
|
#define RELEASENAME PROGNAME " " VERSION |
| 364 |
|
|
| 365 |
|
|
| 770 |
|
void split_pixel_from_gs(pict * p, int x, int y, int new_gsn, int uniform_gs, double u_r, double u_g , double u_b) |
| 771 |
|
{ |
| 772 |
|
int old_gsn, icol; |
| 773 |
< |
double old_av_posx, old_av_posy, old_av_lum, old_omega, act_omega, |
| 773 |
> |
double old_av_posx, old_av_posy, old_av_lum, old_omega, act_omega, delta_E, |
| 774 |
|
new_omega, act_lum; |
| 775 |
|
|
| 776 |
|
|
| 782 |
|
old_av_posx = pict_get_av_posx(p, old_gsn); |
| 783 |
|
old_av_posy = pict_get_av_posy(p, old_gsn); |
| 784 |
|
old_omega = pict_get_av_omega(p, old_gsn); |
| 785 |
+ |
|
| 786 |
+ |
|
| 787 |
+ |
|
| 788 |
|
|
| 789 |
|
new_omega = old_omega - act_omega; |
| 790 |
|
pict_get_av_omega(p, old_gsn) = new_omega; |
| 802 |
|
|
| 803 |
|
add_pixel_to_gs(p, x, y, new_gsn); |
| 804 |
|
|
| 805 |
+ |
|
| 806 |
+ |
|
| 807 |
+ |
|
| 808 |
|
/* color pixel of new gs */ |
| 809 |
|
|
| 810 |
|
/* icol = setglcolor(p, x, y, new_gsn, uniform_gs, u_r, u_g , u_b); */ |
| 1453 |
|
|
| 1454 |
|
int main(int argc, char **argv) |
| 1455 |
|
{ |
| 1456 |
< |
#define CLINEMAX 4095 /* memory allocated for command line string */ |
| 1456 |
> |
#define CLINEMAX 999999999 /* memory allocated for command line string */ |
| 1457 |
|
pict *p = pict_create(); |
| 1458 |
|
pict *pm = pict_create(); |
| 1459 |
< |
int skip_second_scan,calcfast,age_corr,cut_view,cut_view_type,calc_vill, output, detail_out2, x1,y1, fill, yfillmax, yfillmin, |
| 1460 |
< |
ext_vill, set_lum_max, set_lum_max2, img_corr,x_disk,y_disk,task_color, i_splitstart,zones,act_gsn,splitgs, |
| 1461 |
< |
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, |
| 1459 |
> |
pict *pcoeff = pict_create(); |
| 1460 |
> |
int lowlight,skip_second_scan,calcfast,age_corr,cut_view,cut_view_type,calc_vill, output, detail_out2, x1,y1, fill, yfillmax, yfillmin, |
| 1461 |
> |
ext_vill, set_lum_max, set_lum_max2, img_corr,x_disk,y_disk,task_color, i_splitstart,zones,act_gsn,splitgs,j,multi_image_mode, |
| 1462 |
> |
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,num_images,xmap,ymap, |
| 1463 |
|
igs, actual_igs, lastpixelwas_gs, icol, xt, yt, change,checkpixels, before_igs, sgs, splithigh,uniform_gs,x_max, y_max,y_mid, |
| 1464 |
< |
detail_out, posindex_picture, non_cos_lb, rx, ry, rmx,rmy,apply_disability,band_calc,band_color,masking,i_mask,no_glaresources,force; |
| 1464 |
> |
detail_out, posindex_picture, non_cos_lb, rx, ry,lastpixelwas_peak, rmx,rmy,apply_disability,band_calc,band_color,masking,i_mask,no_glaresources,force; |
| 1465 |
|
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, |
| 1466 |
|
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, |
| 1467 |
|
search_pix, a1, a2, a3, a4, a5, c3, c1, c2, r_split, max_angle,r_actual,lum_actual,dir_ill, |
| 1468 |
< |
omegat, sang, E_v, E_v2, E_v_dir, avlum, act_lum, ang, angle_z1, angle_z2,per_95_band,per_75_band,pos, |
| 1468 |
> |
omegat, sang,Ez1,Ez2, E_v, E_v2, E_v_dir, avlum, act_lum, ang, angle_z1, angle_z2,per_95_band,per_75_band,pos, |
| 1469 |
|
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, |
| 1470 |
|
lum, lum_source,teta,Lveil_cie,Lveil_cie_sum,disability_thresh,u_r,u_g,u_b,band_angle,band_avlum, |
| 1471 |
|
lum_mask[1],lum_mask_av,lum_mask_std[1],lum_mask_median[1],omega_mask,bbox[2], |
| 1475 |
|
lum_pos[1],lum_nopos_median[1],lum_pos_median[1],lum_pos2_median[1],lum_pos_mean,lum_pos2_mean; |
| 1476 |
|
float lum_task, lum_thres, dgi, vcp, cgi, ugr, limit, dgr,pgsv ,pgsv_sat,pgsv_con, |
| 1477 |
|
abs_max, Lveil; |
| 1478 |
< |
char maskfile[500],file_out[500], file_out2[500], version[500]; |
| 1478 |
> |
char maskfile[500],file_out[500], file_out2[500], version[500],correction_type[500]; |
| 1479 |
|
char *cline; |
| 1480 |
+ |
char** temp_image_name; |
| 1481 |
+ |
int *x_temp_img, *y_temp_img; |
| 1482 |
|
VIEW userview = STDVIEW; |
| 1483 |
|
int gotuserview = 0; |
| 1484 |
+ |
|
| 1485 |
|
struct muc_rvar* s_mask; |
| 1486 |
|
s_mask = muc_rvar_create(); |
| 1487 |
|
muc_rvar_set_dim(s_mask, 1); |
| 1516 |
|
muc_rvar_clear(s_posweight2); |
| 1517 |
|
|
| 1518 |
|
/*set required user view parameters to invalid values*/ |
| 1519 |
< |
dir_ill=0.0; |
| 1519 |
> |
lowlight=1; |
| 1520 |
> |
multi_image_mode=0; |
| 1521 |
> |
lastpixelwas_peak=0; |
| 1522 |
> |
num_images=0; |
| 1523 |
> |
dir_ill=0.0; |
| 1524 |
|
delta_E=0.0; |
| 1525 |
|
no_glaresources=0; |
| 1526 |
|
n_corner_px=0; |
| 1545 |
|
pgsv_con = 0.0 ; |
| 1546 |
|
pgsv_sat = 0.0 ; |
| 1547 |
|
E_v_mask = 0.0; |
| 1548 |
+ |
Ez1 = 0.0; |
| 1549 |
+ |
Ez2 = 0.0; |
| 1550 |
|
lum_z1_av = 0.0; |
| 1551 |
|
omega_z1 = 0.0; |
| 1552 |
|
lum_z2_av = 0.0; |
| 1631 |
|
thres_activate=0; |
| 1632 |
|
/* command line for output picture*/ |
| 1633 |
|
|
| 1634 |
< |
cline = (char *) malloc(CLINEMAX+1); |
| 1634 |
> |
cline = (char *) malloc(CLINEMAX+100); |
| 1635 |
|
cline[0] = '\0'; |
| 1636 |
|
for (i = 0; i < argc; i++) { |
| 1637 |
|
/* fprintf(stderr, "%d %d \n",i,strlen(argv[i]));*/ |
| 1679 |
|
break; |
| 1680 |
|
case 'b': |
| 1681 |
|
lum_thres = atof(argv[++i]); |
| 1682 |
+ |
lum_source =lum_thres; |
| 1683 |
|
thres_activate = 1; |
| 1684 |
|
break; |
| 1685 |
|
case 'c': |
| 1852 |
|
/*case 'v': |
| 1853 |
|
printf("evalglare %s \n",version); |
| 1854 |
|
exit(1); */ |
| 1855 |
+ |
case 'C': |
| 1856 |
+ |
strcpy(correction_type,argv[++i]); |
| 1857 |
+ |
|
| 1858 |
+ |
if (!strcmp(correction_type,"l-") ){ |
| 1859 |
+ |
/* printf("low light off!\n"); */ |
| 1860 |
+ |
lowlight = 0; } |
| 1861 |
+ |
if (!strcmp(correction_type,"l+") ){ |
| 1862 |
+ |
/* printf("low light on!\n"); */ |
| 1863 |
+ |
lowlight = 1; } |
| 1864 |
+ |
if (!strcmp(correction_type,"0") ){ |
| 1865 |
+ |
/* printf("all corrections off!\n"); */ |
| 1866 |
+ |
lowlight = 0; } |
| 1867 |
+ |
|
| 1868 |
+ |
break; |
| 1869 |
|
|
| 1870 |
+ |
/*case 'v': |
| 1871 |
+ |
printf("evalglare %s \n",version); |
| 1872 |
+ |
exit(1); */ |
| 1873 |
+ |
|
| 1874 |
|
case '1': |
| 1875 |
|
output = 1; |
| 1876 |
|
break; |
| 1878 |
|
output = 2; |
| 1879 |
|
dir_ill = atof(argv[++i]); |
| 1880 |
|
break; |
| 1881 |
< |
|
| 1881 |
> |
case '3': |
| 1882 |
> |
output = 3; |
| 1883 |
> |
break; |
| 1884 |
> |
case '4': |
| 1885 |
> |
lowlight = 0; |
| 1886 |
> |
break; |
| 1887 |
> |
case 'Q': |
| 1888 |
> |
multi_image_mode=1; |
| 1889 |
> |
output= 3; |
| 1890 |
> |
calcfast=1; |
| 1891 |
> |
num_images =atoi(argv[++i]); |
| 1892 |
> |
temp_image_name = malloc(sizeof(char*)*num_images); |
| 1893 |
> |
|
| 1894 |
> |
x_temp_img=(int *) malloc(sizeof(int) * num_images); |
| 1895 |
> |
y_temp_img=(int *) malloc(sizeof(int) * num_images); |
| 1896 |
> |
|
| 1897 |
> |
|
| 1898 |
> |
/* iterate through all images and allocate 256 characters to each: */ |
| 1899 |
> |
for (j = 0; j < num_images; j++) { |
| 1900 |
> |
temp_image_name[j] = malloc(256*sizeof(char)); |
| 1901 |
> |
strcpy(temp_image_name[j], argv[++i]); |
| 1902 |
> |
x_temp_img[j] = atoi(argv[++i]); |
| 1903 |
> |
y_temp_img[j] = atoi(argv[++i]); |
| 1904 |
> |
} |
| 1905 |
> |
|
| 1906 |
> |
|
| 1907 |
> |
break; |
| 1908 |
|
case 'v': |
| 1909 |
|
if (argv[i][2] == '\0') { |
| 1910 |
|
printf("%s \n",RELEASENAME); |
| 2008 |
|
|
| 2009 |
|
if (masking == 1) { |
| 2010 |
|
|
| 2011 |
< |
if (!pict_get_xsize(p)==pict_get_xsize(pm) || !pict_get_ysize(p)==pict_get_ysize(pm)) { |
| 2011 |
> |
if (pict_get_xsize(p)!=pict_get_xsize(pm) || pict_get_ysize(p)!=pict_get_ysize(pm)) { |
| 2012 |
|
fprintf(stderr, "error: masking image has other resolution than main image ! \n"); |
| 2013 |
|
fprintf(stderr, "size must be identical \n"); |
| 2014 |
|
printf("resolution main image : %dx%d\n",pict_get_xsize(p),pict_get_ysize(p)); |
| 2043 |
|
|
| 2044 |
|
} |
| 2045 |
|
} |
| 2046 |
< |
|
| 2046 |
> |
|
| 2047 |
> |
|
| 2048 |
|
/* Check task position */ |
| 2049 |
|
|
| 2050 |
|
if (task_lum == 1) { |
| 2068 |
|
pict_get_z1_gsn(p,igs) = 0; |
| 2069 |
|
pict_get_z2_gsn(p,igs) = 0; |
| 2070 |
|
|
| 2071 |
+ |
if (multi_image_mode<1) { |
| 2072 |
|
|
| 2073 |
+ |
|
| 2074 |
|
/* cut out GUTH field of view and exit without glare evaluation */ |
| 2075 |
|
if (cut_view==2) { |
| 2076 |
|
if (cut_view_type==1) { |
| 2359 |
|
|
| 2360 |
|
/* first glare source scan: find primary glare sources */ |
| 2361 |
|
for (x = 0; x < pict_get_xsize(p); x++) { |
| 2362 |
< |
/* lastpixelwas_gs=0; */ |
| 2362 |
> |
lastpixelwas_gs=0; |
| 2363 |
> |
/* lastpixelwas_peak=0; */ |
| 2364 |
|
for (y = 0; y < pict_get_ysize(p); y++) { |
| 2365 |
|
if (pict_get_hangle(p, x, y, p->view.vdir, p->view.vup, &ang)) { |
| 2366 |
|
if (pict_is_validpixel(p, x, y)) { |
| 2370 |
|
lum_total_max=act_lum; |
| 2371 |
|
} |
| 2372 |
|
/* speed improvement first scan: when last pixel was glare source, then use this glare source number instead of searching. |
| 2373 |
< |
has been deactivated with v1.25 |
| 2373 |
> |
has been deactivated with v1.25, reactivated with v2.10 */ |
| 2374 |
|
|
| 2375 |
< |
if (lastpixelwas_gs==0 || search_pix <= 1.0 ) { */ |
| 2375 |
> |
if (lastpixelwas_gs==0 || search_pix <= 1.0 ) { |
| 2376 |
|
actual_igs = find_near_pgs(p, x, y, max_angle, 0, igs, 1); |
| 2377 |
< |
/* }*/ |
| 2377 |
> |
} |
| 2378 |
|
if (actual_igs == 0) { |
| 2379 |
|
igs = igs + 1; |
| 2380 |
|
pict_new_gli(p); |
| 2390 |
|
pict_get_gsn(p, x, y) = actual_igs; |
| 2391 |
|
pict_get_pgs(p, x, y) = 1; |
| 2392 |
|
add_pixel_to_gs(p, x, y, actual_igs); |
| 2393 |
< |
/* lastpixelwas_gs=actual_igs; */ |
| 2393 |
> |
lastpixelwas_gs=actual_igs; |
| 2394 |
|
|
| 2395 |
|
} else { |
| 2396 |
|
pict_get_pgs(p, x, y) = 0; |
| 2397 |
< |
/* lastpixelwas_gs=0;*/ |
| 2397 |
> |
lastpixelwas_gs=0; |
| 2398 |
|
} |
| 2399 |
|
} |
| 2400 |
|
} |
| 2489 |
|
|
| 2490 |
|
/* extract extremes from glare sources to extra glare source */ |
| 2491 |
|
if (splithigh == 1 && lum_total_max>limit) { |
| 2492 |
+ |
/* fprintf(stderr, " split of glare source!\n"); */ |
| 2493 |
|
|
| 2494 |
|
r_split = max_angle / 2.0; |
| 2495 |
|
for (i = 0; i <= i_max; i++) { |
| 2770 |
|
muc_rvar_add_sample(s_z1, lum_z1); |
| 2771 |
|
omega_z1 += pict_get_omega(p, x, y); |
| 2772 |
|
lum_z1_av += pict_get_omega(p, x, y)* lum_actual; |
| 2773 |
+ |
Ez1 += DOT(p->view.vdir, pict_get_cached_dir(p, x, y))* pict_get_omega(p, x, y)* lum_actual; |
| 2774 |
+ |
|
| 2775 |
|
setglcolor(p,x,y,1,1 , 0.66, 0.01 ,0.33); |
| 2776 |
|
/*check if separation gsn already exist */ |
| 2777 |
|
|
| 2788 |
|
splitgs=(int)(pict_get_z1_gsn(p,act_gsn)); |
| 2789 |
|
/* printf("splitgs%i \n",splitgs); */ |
| 2790 |
|
split_pixel_from_gs(p, x, y, splitgs, uniform_gs, u_r, u_g , u_b); |
| 2791 |
+ |
/* move direct illuminance contribution into zone -value */ |
| 2792 |
+ |
delta_E=DOT(p->view.vdir, pict_get_cached_dir(p, x, y))* pict_get_omega(p, x, y)* luminance(pict_get_color(p, x, y)); |
| 2793 |
+ |
pict_get_Eglare(p,act_gsn ) = pict_get_Eglare(p,act_gsn ) - delta_E; |
| 2794 |
+ |
pict_get_Eglare(p,igs ) = pict_get_Eglare(p,igs ) + delta_E; |
| 2795 |
+ |
|
| 2796 |
+ |
|
| 2797 |
|
} |
| 2798 |
|
} |
| 2799 |
|
/*zone2 */ |
| 2805 |
|
muc_rvar_add_sample(s_z2, lum_z2); |
| 2806 |
|
omega_z2 += pict_get_omega(p, x, y); |
| 2807 |
|
lum_z2_av += pict_get_omega(p, x, y)* lum_actual; |
| 2808 |
+ |
Ez2 += DOT(p->view.vdir, pict_get_cached_dir(p, x, y))* pict_get_omega(p, x, y)* lum_actual; |
| 2809 |
|
setglcolor(p,x,y,1,1 , 0.65, 0.33 ,0.02); |
| 2810 |
|
/* printf("zone 2 x y act_gsn pict_get_z1_gsn(p,act_gsn) pict_get_z2_gsn(p,act_gsn): %i %i %f 1:%f 2:%f \n",x,y,act_gsn,pict_get_z1_gsn(p,act_gsn),pict_get_z2_gsn(p,act_gsn)); |
| 2811 |
|
*/ if (act_gsn > 0){ |
| 2820 |
|
splitgs=(int)(pict_get_z2_gsn(p,act_gsn)); |
| 2821 |
|
/* printf("splitgs %i \n",splitgs);*/ |
| 2822 |
|
split_pixel_from_gs(p, x, y, splitgs, uniform_gs, u_r, u_g , u_b); |
| 2823 |
+ |
/* move direct illuminance contribution into zone -value */ |
| 2824 |
+ |
delta_E=DOT(p->view.vdir, pict_get_cached_dir(p, x, y))* pict_get_omega(p, x, y)* luminance(pict_get_color(p, x, y)); |
| 2825 |
+ |
pict_get_Eglare(p,act_gsn ) = pict_get_Eglare(p,act_gsn ) - delta_E; |
| 2826 |
+ |
pict_get_Eglare(p,igs ) = pict_get_Eglare(p,igs ) + delta_E; |
| 2827 |
+ |
|
| 2828 |
|
} |
| 2829 |
|
} |
| 2830 |
|
|
| 2851 |
|
muc_rvar_get_bounding_box(s_z1,bbox_z1); |
| 2852 |
|
if (detail_out == 1) { |
| 2853 |
|
|
| 2854 |
< |
printf ("zoning:z1_omega,z1_av_lum,z1_median_lum,z1_std_lum,z1_perc_75,z1_perc_95,z1_lum_min,z1_lum_max: %f %f %f %f %f %f %f %f\n",omega_z1,lum_z1_av,lum_z1_median[0],sqrt(lum_z1_std[0]),per_75_z1,per_95_z1,bbox_z1[0],bbox_z1[1] ); |
| 2854 |
> |
printf ("zoning:z1_omega,z1_av_lum,z1_median_lum,z1_std_lum,z1_perc_75,z1_perc_95,z1_lum_min,z1_lum_max,Ez1: %f %f %f %f %f %f %f %f %f\n",omega_z1,lum_z1_av,lum_z1_median[0],sqrt(lum_z1_std[0]),per_75_z1,per_95_z1,bbox_z1[0],bbox_z1[1],Ez1 ); |
| 2855 |
|
|
| 2856 |
|
if (zones == 2 ) { |
| 2857 |
|
|
| 2858 |
< |
printf ("zoning:z2_omega,z2_av_lum,z2_median_lum,z2_std_lum,z2_perc_75,z2_perc_95,z2_lum_min,z2_lum_max: %f %f %f %f %f %f %f %f\n",omega_z2,lum_z2_av,lum_z2_median[0],sqrt(lum_z2_std[0]),per_75_z2,per_95_z2,bbox_z2[0],bbox_z2[1] ); |
| 2858 |
> |
printf ("zoning:z2_omega,z2_av_lum,z2_median_lum,z2_std_lum,z2_perc_75,z2_perc_95,z2_lum_min,z2_lum_max,Ez1: %f %f %f %f %f %f %f %f %f\n",omega_z2,lum_z2_av,lum_z2_median[0],sqrt(lum_z2_std[0]),per_75_z2,per_95_z2,bbox_z2[0],bbox_z2[1],Ez2 ); |
| 2859 |
|
} } |
| 2860 |
|
|
| 2861 |
|
} |
| 2868 |
|
} |
| 2869 |
|
} |
| 2870 |
|
no_glaresources=i; |
| 2871 |
< |
|
| 2871 |
> |
/*printf("%i",no_glaresources );*/ |
| 2872 |
|
/* glare sources */ |
| 2873 |
< |
if (detail_out == 1) { |
| 2873 |
> |
if (detail_out == 1 && output != 3) { |
| 2874 |
|
|
| 2875 |
|
printf |
| 2876 |
|
("%i No pixels x-pos y-pos L_s Omega_s Posindx L_b L_t E_vert Edir Max_Lum Sigma xdir ydir zdir Eglare_cie Lveil_cie teta glare_zone\n", |
| 2916 |
|
} |
| 2917 |
|
} |
| 2918 |
|
|
| 2919 |
+ |
if ( output != 3) { |
| 2920 |
|
|
| 2824 |
– |
|
| 2921 |
|
/* calculation of indicees */ |
| 2922 |
|
|
| 2923 |
|
/* check vertical illuminance range */ |
| 2930 |
|
dgp = |
| 2931 |
|
get_dgp(p, E_v2, igs, a1, a2, a3, a4, a5, c1, c2, c3, posindex_2); |
| 2932 |
|
/* low light correction */ |
| 2933 |
+ |
if (lowlight ==1) { |
| 2934 |
|
if (E_v < 1000) { |
| 2935 |
|
low_light_corr=1.0*exp(0.024*E_v-4)/(1+exp(0.024*E_v-4));} else {low_light_corr=1.0 ;} |
| 2936 |
|
dgp =low_light_corr*dgp; |
| 2937 |
< |
|
| 2937 |
> |
} |
| 2938 |
|
/* age correction */ |
| 2939 |
|
|
| 2940 |
|
if (age_corr == 1) { |
| 3047 |
|
printf("%f\n", dgp); |
| 3048 |
|
} |
| 3049 |
|
} |
| 3050 |
+ |
} |
| 3051 |
|
|
| 3052 |
+ |
}else{ |
| 3053 |
+ |
/* only multiimagemode */ |
| 3054 |
+ |
|
| 3055 |
+ |
|
| 3056 |
+ |
for (j = 0; j < num_images; j++) { |
| 3057 |
+ |
|
| 3058 |
+ |
|
| 3059 |
+ |
/* loop over temporal images */ |
| 3060 |
+ |
|
| 3061 |
+ |
pict_read(pcoeff,temp_image_name[j] ); |
| 3062 |
+ |
|
| 3063 |
+ |
/*printf ("num_img:%i x-size:%i xpos:%i y-size: %i ypos %i bigimg-xsize %i %i ",num_images,pict_get_xsize(pcoeff),x_temp_img[j],pict_get_ysize(pcoeff),y_temp_img[j],pict_get_xsize(p),pict_get_ysize(p)); |
| 3064 |
+ |
*/ |
| 3065 |
+ |
|
| 3066 |
+ |
/* copy luminance value into big image and remove glare sources*/ |
| 3067 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) { |
| 3068 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3069 |
+ |
xmap=x_temp_img[j]+x-1; |
| 3070 |
+ |
ymap=y_temp_img[j]+y-1; |
| 3071 |
+ |
if (xmap <0) { xmap=0;} |
| 3072 |
+ |
if (ymap <0) { ymap=0;} |
| 3073 |
+ |
|
| 3074 |
+ |
pict_get_color(p, xmap, ymap)[RED] = pict_get_color(pcoeff, x, y)[RED]; |
| 3075 |
+ |
pict_get_color(p, xmap, ymap)[GRN] = pict_get_color(pcoeff, x, y)[GRN]; |
| 3076 |
+ |
pict_get_color(p, xmap, ymap)[BLU] = pict_get_color(pcoeff, x, y)[BLU]; |
| 3077 |
+ |
pict_get_gsn(p, xmap, ymap) = 0; |
| 3078 |
+ |
pict_get_pgs(p, xmap, ymap) = 0; |
| 3079 |
+ |
}} |
| 3080 |
+ |
|
| 3081 |
+ |
actual_igs =0; |
| 3082 |
+ |
|
| 3083 |
+ |
/* first glare source scan: find primary glare sources */ |
| 3084 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) { |
| 3085 |
+ |
lastpixelwas_gs=0; |
| 3086 |
+ |
/* lastpixelwas_peak=0; */ |
| 3087 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3088 |
+ |
xmap=x_temp_img[j]+x; |
| 3089 |
+ |
ymap=y_temp_img[j]+y; |
| 3090 |
+ |
if (pict_get_hangle(p, xmap, ymap, p->view.vdir, p->view.vup, &ang)) { |
| 3091 |
+ |
if (pict_is_validpixel(p, xmap, ymap)) { |
| 3092 |
+ |
act_lum = luminance(pict_get_color(p, xmap, ymap)); |
| 3093 |
+ |
if (act_lum > lum_source) { |
| 3094 |
+ |
if (act_lum >lum_total_max) { |
| 3095 |
+ |
lum_total_max=act_lum; |
| 3096 |
+ |
} |
| 3097 |
+ |
|
| 3098 |
+ |
if (lastpixelwas_gs==0 || search_pix <= 1.0 ) { |
| 3099 |
+ |
actual_igs = find_near_pgs(p, xmap, ymap, max_angle, 0, igs, 1); |
| 3100 |
+ |
} |
| 3101 |
+ |
if (actual_igs == 0) { |
| 3102 |
+ |
igs = igs + 1; |
| 3103 |
+ |
pict_new_gli(p); |
| 3104 |
+ |
pict_get_Eglare(p,igs) = 0.0; |
| 3105 |
+ |
/* not necessary here pict_get_lum_min(p, igs) = HUGE_VAL; |
| 3106 |
+ |
pict_get_Eglare(p,igs) = 0.0; |
| 3107 |
+ |
pict_get_Dglare(p,igs) = 0.0; |
| 3108 |
+ |
pict_get_z1_gsn(p,igs) = 0; |
| 3109 |
+ |
pict_get_z2_gsn(p,igs) = 0; */ |
| 3110 |
+ |
actual_igs = igs; |
| 3111 |
+ |
|
| 3112 |
+ |
} |
| 3113 |
+ |
pict_get_gsn(p, xmap, ymap) = actual_igs; |
| 3114 |
+ |
pict_get_pgs(p, xmap, ymap) = 1; |
| 3115 |
+ |
add_pixel_to_gs(p, xmap, ymap, actual_igs); |
| 3116 |
+ |
lastpixelwas_gs=actual_igs; |
| 3117 |
+ |
|
| 3118 |
+ |
|
| 3119 |
+ |
|
| 3120 |
+ |
delta_E=DOT(p->view.vdir, pict_get_cached_dir(p, xmap, ymap))* pict_get_omega(p, xmap, ymap)* luminance(pict_get_color(p, xmap, ymap)); |
| 3121 |
+ |
pict_get_Eglare(p,actual_igs ) = pict_get_Eglare(p,actual_igs ) + delta_E; |
| 3122 |
+ |
|
| 3123 |
+ |
|
| 3124 |
+ |
|
| 3125 |
+ |
|
| 3126 |
+ |
} else { |
| 3127 |
+ |
pict_get_pgs(p, xmap, ymap) = 0; |
| 3128 |
+ |
lastpixelwas_gs=0; |
| 3129 |
+ |
} |
| 3130 |
+ |
} |
| 3131 |
+ |
} |
| 3132 |
+ |
} |
| 3133 |
+ |
} |
| 3134 |
+ |
|
| 3135 |
+ |
|
| 3136 |
+ |
/* here should be peak extraction */ |
| 3137 |
+ |
i_max=igs; |
| 3138 |
+ |
r_split = max_angle / 2.0; |
| 3139 |
+ |
for (i = 0; i <= i_max; i++) { |
| 3140 |
+ |
|
| 3141 |
+ |
if (pict_get_npix(p, i) > 0) { |
| 3142 |
+ |
l_max = pict_get_lum_max(p, i); |
| 3143 |
+ |
i_splitstart = igs + 1; |
| 3144 |
+ |
if (l_max >= limit) { |
| 3145 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) |
| 3146 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3147 |
+ |
xmap=x_temp_img[j]+x; |
| 3148 |
+ |
ymap=y_temp_img[j]+y; |
| 3149 |
+ |
|
| 3150 |
+ |
|
| 3151 |
+ |
if (pict_get_hangle |
| 3152 |
+ |
(p, xmap, ymap, p->view.vdir, p->view.vup, &ang)) |
| 3153 |
+ |
{ |
| 3154 |
+ |
if (pict_is_validpixel(p, xmap, ymap) |
| 3155 |
+ |
&& luminance(pict_get_color(p, xmap, ymap)) |
| 3156 |
+ |
>= limit |
| 3157 |
+ |
&& pict_get_gsn(p, xmap, ymap) == i) { |
| 3158 |
+ |
if (i_splitstart == (igs + 1)) { |
| 3159 |
+ |
igs = igs + 1; |
| 3160 |
+ |
pict_new_gli(p); |
| 3161 |
+ |
pict_get_z1_gsn(p,igs) = 0; |
| 3162 |
+ |
pict_get_z2_gsn(p,igs) = 0; |
| 3163 |
+ |
|
| 3164 |
+ |
pict_get_Eglare(p,igs) = 0.0; |
| 3165 |
+ |
pict_get_Dglare(p,igs) = 0.0; |
| 3166 |
+ |
pict_get_lum_min(p, igs) = |
| 3167 |
+ |
99999999999999.999; |
| 3168 |
+ |
i_split = igs; |
| 3169 |
+ |
} else { |
| 3170 |
+ |
i_split = |
| 3171 |
+ |
find_split(p, xmap, ymap, r_split, |
| 3172 |
+ |
i_splitstart, igs); |
| 3173 |
+ |
} |
| 3174 |
+ |
if (i_split == 0) { |
| 3175 |
+ |
igs = igs + 1; |
| 3176 |
+ |
pict_new_gli(p); |
| 3177 |
+ |
pict_get_z1_gsn(p,igs) = 0; |
| 3178 |
+ |
pict_get_z2_gsn(p,igs) = 0; |
| 3179 |
+ |
|
| 3180 |
+ |
pict_get_Eglare(p,igs) = 0.0; |
| 3181 |
+ |
pict_get_Dglare(p,igs) = 0.0; |
| 3182 |
+ |
pict_get_lum_min(p, igs) = |
| 3183 |
+ |
99999999999999.999; |
| 3184 |
+ |
i_split = igs; |
| 3185 |
+ |
} |
| 3186 |
+ |
split_pixel_from_gs(p, xmap, ymap, i_split, uniform_gs, u_r, u_g , u_b); |
| 3187 |
+ |
|
| 3188 |
+ |
} |
| 3189 |
+ |
} |
| 3190 |
+ |
} |
| 3191 |
+ |
|
| 3192 |
+ |
} |
| 3193 |
+ |
change = 1; |
| 3194 |
+ |
while (change == 1) { |
| 3195 |
+ |
change = 0; |
| 3196 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) |
| 3197 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3198 |
+ |
xmap=x_temp_img[j]+x; |
| 3199 |
+ |
ymap=y_temp_img[j]+y; |
| 3200 |
+ |
before_igs = pict_get_gsn(p, xmap, ymap); |
| 3201 |
+ |
if (before_igs >= i_splitstart) { |
| 3202 |
+ |
if (pict_get_hangle |
| 3203 |
+ |
(p, xmap, ymap, p->view.vdir, p->view.vup, |
| 3204 |
+ |
&ang)) { |
| 3205 |
+ |
if (pict_is_validpixel(p, xmap, ymap) |
| 3206 |
+ |
&& before_igs > 0) { |
| 3207 |
+ |
actual_igs = |
| 3208 |
+ |
find_near_pgs(p, xmap, ymap, |
| 3209 |
+ |
max_angle, |
| 3210 |
+ |
before_igs, igs, |
| 3211 |
+ |
i_splitstart); |
| 3212 |
+ |
if (!(actual_igs == before_igs)) { |
| 3213 |
+ |
change = 1; |
| 3214 |
+ |
} |
| 3215 |
+ |
if (before_igs > 0) { |
| 3216 |
+ |
actual_igs = |
| 3217 |
+ |
pict_get_gsn(p, xmap, ymap); |
| 3218 |
+ |
/* icol = |
| 3219 |
+ |
setglcolor(p, x, y, |
| 3220 |
+ |
actual_igs, uniform_gs, u_r, u_g , u_b);*/ |
| 3221 |
+ |
} |
| 3222 |
+ |
|
| 3223 |
+ |
} |
| 3224 |
+ |
} |
| 3225 |
+ |
} |
| 3226 |
+ |
|
| 3227 |
+ |
} |
| 3228 |
+ |
} |
| 3229 |
+ |
|
| 3230 |
+ |
|
| 3231 |
+ |
} |
| 3232 |
+ |
} |
| 3233 |
+ |
|
| 3234 |
+ |
/* end peak extraction */ |
| 3235 |
+ |
|
| 3236 |
+ |
|
| 3237 |
+ |
/* calculation of direct vertical illuminance for th multi-image-mode */ |
| 3238 |
+ |
|
| 3239 |
+ |
|
| 3240 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) |
| 3241 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3242 |
+ |
xmap=x_temp_img[j]+x; |
| 3243 |
+ |
ymap=y_temp_img[j]+y; |
| 3244 |
+ |
if (pict_get_hangle(p, xmap, ymap, p->view.vdir, p->view.vup, &ang)) { |
| 3245 |
+ |
if (pict_is_validpixel(p, xmap, ymap)) { |
| 3246 |
+ |
if (pict_get_gsn(p, xmap, ymap) > 0) { |
| 3247 |
+ |
actual_igs = pict_get_gsn(p, xmap, ymap); |
| 3248 |
+ |
delta_E=DOT(p->view.vdir, pict_get_cached_dir(p, xmap, ymap))* pict_get_omega(p, xmap, ymap)* luminance(pict_get_color(p, xmap, ymap)); |
| 3249 |
+ |
pict_get_Eglare(p,actual_igs ) = pict_get_Eglare(p,actual_igs ) + delta_E; |
| 3250 |
+ |
} |
| 3251 |
+ |
} |
| 3252 |
+ |
} |
| 3253 |
+ |
} |
| 3254 |
+ |
|
| 3255 |
+ |
|
| 3256 |
+ |
|
| 3257 |
+ |
|
| 3258 |
+ |
|
| 3259 |
+ |
|
| 3260 |
+ |
|
| 3261 |
+ |
|
| 3262 |
+ |
i = 0; |
| 3263 |
+ |
for (x = 0; x <= igs; x++) { |
| 3264 |
+ |
if (pict_get_npix(p, x) > 0) { |
| 3265 |
+ |
i = i + 1; |
| 3266 |
+ |
}} |
| 3267 |
+ |
no_glaresources=i; |
| 3268 |
+ |
|
| 3269 |
+ |
/* |
| 3270 |
+ |
|
| 3271 |
+ |
sprintf(file_out, "%s%i%s","ray2/img_",j,".hdr"); |
| 3272 |
+ |
pict_write(p, file_out); |
| 3273 |
+ |
*/ |
| 3274 |
+ |
printf("%i ",no_glaresources); |
| 3275 |
+ |
i = 0; |
| 3276 |
+ |
for (x = 0; x <= igs; x++) { |
| 3277 |
+ |
if (pict_get_npix(p, x) > 0) { |
| 3278 |
+ |
i = i + 1; |
| 3279 |
+ |
pict_get_sigma(p, pict_get_av_posx(p, x), pict_get_av_posy(p, x), p->view.vdir, p->view.vup, &sigma); |
| 3280 |
+ |
|
| 3281 |
+ |
x2=pict_get_av_posx(p, x); |
| 3282 |
+ |
y2=pict_get_av_posy(p, x); |
| 3283 |
+ |
printf("%f %.10f %f %f %f %f %f ", pict_get_av_lum(p, x), pict_get_av_omega(p, x), get_posindex(p, pict_get_av_posx(p, x), pict_get_av_posy(p, x), |
| 3284 |
+ |
posindex_2),pict_get_cached_dir(p, x2,y2)[0],pict_get_cached_dir(p, x2,y2)[1],pict_get_cached_dir(p, x2,y2)[2],pict_get_Eglare(p,x) ); |
| 3285 |
+ |
} |
| 3286 |
+ |
pict_get_npix(p, x)=0; |
| 3287 |
+ |
pict_get_av_lum(p, x)=0; |
| 3288 |
+ |
pict_get_av_posy(p, x)=0; |
| 3289 |
+ |
pict_get_av_posx(p, x)=0; |
| 3290 |
+ |
pict_get_av_omega(p, x)=0; |
| 3291 |
+ |
} |
| 3292 |
+ |
printf("\n"); |
| 3293 |
+ |
|
| 3294 |
+ |
|
| 3295 |
+ |
/* empty big image and remove glare sources*/ |
| 3296 |
+ |
for (x = 0; x < pict_get_xsize(pcoeff); x++) { |
| 3297 |
+ |
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
| 3298 |
+ |
xmap=x_temp_img[j]+x; |
| 3299 |
+ |
ymap=y_temp_img[j]+y; |
| 3300 |
+ |
pict_get_color(p, xmap, ymap)[RED] = 0; |
| 3301 |
+ |
pict_get_color(p, xmap, ymap)[GRN] = 0; |
| 3302 |
+ |
pict_get_color(p, xmap, ymap)[BLU] = 0; |
| 3303 |
+ |
pict_get_gsn(p, xmap, ymap) = 0; |
| 3304 |
+ |
pict_get_pgs(p, xmap, ymap) = 0; |
| 3305 |
+ |
}} |
| 3306 |
+ |
igs=0; |
| 3307 |
+ |
|
| 3308 |
+ |
|
| 3309 |
+ |
|
| 3310 |
+ |
|
| 3311 |
+ |
|
| 3312 |
+ |
} |
| 3313 |
+ |
|
| 3314 |
+ |
} |
| 3315 |
+ |
|
| 3316 |
+ |
/* end multi-image-mode */ |
| 3317 |
|
|
| 3318 |
|
/*printf("lowlight=%f\n", low_light_corr); */ |
| 3319 |
|
|