1 |
|
#ifndef lint |
2 |
< |
static const char RCSid[] = "$Id$"; |
2 |
> |
static const char RCSid[] = "$Id$"; |
3 |
|
#endif |
4 |
< |
/* EVALGLARE V2.10 |
5 |
< |
* Evalglare Software License, Version 2.0 |
4 |
> |
/* EVALGLARE V3.05 |
5 |
> |
* Evalglare Software License, Version 3.0x |
6 |
|
* |
7 |
< |
* Copyright (c) 1995 - 2020 Fraunhofer ISE, EPFL. |
7 |
> |
* Copyright (c) 1995 - 2022 Fraunhofer ISE, EPFL. |
8 |
|
* All rights reserved. |
9 |
|
* |
10 |
|
* |
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 |
< |
|
359 |
> |
|
360 |
> |
|
361 |
> |
/* evalglare.c, v2.11 2020/07/06 |
362 |
> |
-add extra output for DGP-contribution in -d mode |
363 |
> |
-fix (remove) 1 pixel offset of the mulltiimage-mode |
364 |
> |
*/ |
365 |
> |
|
366 |
> |
/* evalglare.c, v2.12 2021/07/19 |
367 |
> |
-bugfix: center of glare source calculation now based on l*omega weighting, before it was just on omega. |
368 |
> |
*/ |
369 |
> |
|
370 |
> |
/* evalglare.c, v2.13 2021/07/21 |
371 |
> |
- center of glare source calculation now based on l*l*omega weighting. |
372 |
> |
- bugfix: Position-index below line of sight is now corrected and based on the modified equation from Iwata and Osterhaus 2010 |
373 |
> |
*/ |
374 |
> |
|
375 |
> |
/* evalglare.c, v2.14 2021/10/20 |
376 |
> |
- center of glare source calculation now based on l*omega weighting. |
377 |
> |
- adding UGP2 equation to the output |
378 |
> |
- new default setting: low-light correction off ! |
379 |
> |
*/ |
380 |
> |
|
381 |
> |
/* evalglare.c, v3.0 2021/12/24 |
382 |
> |
- adding patch-mode (-z patchangle combineflag ) as glare source grouping method |
383 |
> |
*/ |
384 |
> |
|
385 |
> |
/* evalglare.c, v3.01 2022/01/05 |
386 |
> |
- change of multi-image-mode. Adding extra scans with scaled image |
387 |
> |
syntax now: -Q n_images n_extrascans_per_image n_images*( imagename x y n_extrascans*(scale) ) |
388 |
> |
*/ |
389 |
> |
/* evalglare.c, v3.02 2022/02/11 |
390 |
> |
- correction of position index below line of sight after Takuro Kikuchi's comments in radiance-discourse from Dec 2021. |
391 |
> |
*/ |
392 |
> |
|
393 |
> |
/* evalglare.c, v3.03 2022/03/18, 2024/06/25 |
394 |
> |
- add no pixels output for zonal analysis. |
395 |
> |
|
396 |
> |
/* evalglare.c, v3.04 2023/09/01 |
397 |
> |
- test version to include peripherical dependency, changes not (yet) used for following versions |
398 |
> |
|
399 |
> |
/* evalglare.c, v3.05 2024/06/25 |
400 |
> |
- fix bug of still having lowlight correction even if turned off |
401 |
> |
- changing abs_max,Lveil from float to double |
402 |
> |
*/ |
403 |
> |
|
404 |
> |
|
405 |
|
#define EVALGLARE |
406 |
|
#define PROGNAME "evalglare" |
407 |
< |
#define VERSION "2.10 release 25.06.2020 by EPFL, J.Wienold" |
407 |
> |
#define VERSION "3.05 release 25.06.2024 by J.Wienold, EPFL" |
408 |
|
#define RELEASENAME PROGNAME " " VERSION |
409 |
|
|
410 |
|
|
415 |
|
#include "platform.h" |
416 |
|
#include "muc_randvar.h" |
417 |
|
|
418 |
+ |
char *progname; |
419 |
+ |
|
420 |
|
/* subroutine to add a pixel to a glare source */ |
421 |
|
void add_pixel_to_gs(pict * p, int x, int y, int gsn) |
422 |
|
{ |
423 |
|
double old_av_posx, old_av_posy, old_av_lum, old_omega, act_omega, |
424 |
< |
new_omega, act_lum; |
424 |
> |
new_omega, act_lum,temp_av_posx,temp_av_posy,av_lum; |
425 |
|
|
426 |
|
|
427 |
|
pict_get_npix(p, gsn) = pict_get_npix(p, gsn) + 1; |
433 |
|
act_omega = pict_get_omega(p, x, y); |
434 |
|
act_lum = luminance(pict_get_color(p, x, y)); |
435 |
|
new_omega = old_omega + act_omega; |
436 |
< |
pict_get_av_posx(p, gsn) = |
437 |
< |
(old_av_posx * old_omega + x * act_omega) / new_omega; |
438 |
< |
pict_get_av_posy(p, gsn) = |
439 |
< |
(old_av_posy * old_omega + y * act_omega) / new_omega; |
436 |
> |
pict_get_av_lum(p, gsn) = |
437 |
> |
(old_av_lum * old_omega + act_lum * act_omega) / new_omega; |
438 |
> |
|
439 |
> |
av_lum=pict_get_av_lum(p, gsn); |
440 |
> |
temp_av_posx = |
441 |
> |
(old_av_posx * old_omega* old_av_lum + x * act_omega*act_lum) / (old_av_lum*old_omega + act_lum* act_omega ); |
442 |
> |
pict_get_av_posx(p, gsn) = temp_av_posx; |
443 |
> |
temp_av_posy = |
444 |
> |
(old_av_posy * old_omega* old_av_lum + y * act_omega*act_lum) / (old_av_lum*old_omega + act_lum* act_omega ); |
445 |
> |
|
446 |
> |
pict_get_av_posy(p, gsn) = temp_av_posy; |
447 |
|
if (isnan((pict_get_av_posx(p, gsn)))) |
448 |
|
fprintf(stderr,"error in add_pixel_to_gs %d %d %f %f %f %f\n", x, y, old_av_posy, old_omega, act_omega, new_omega); |
449 |
|
|
396 |
– |
pict_get_av_lum(p, gsn) = |
397 |
– |
(old_av_lum * old_omega + act_lum * act_omega) / new_omega; |
450 |
|
pict_get_av_omega(p, gsn) = new_omega; |
451 |
|
pict_get_gsn(p, x, y) = gsn; |
452 |
|
if (act_lum < pict_get_lum_min(p, gsn)) { |
821 |
|
{ |
822 |
|
int old_gsn, icol; |
823 |
|
double old_av_posx, old_av_posy, old_av_lum, old_omega, act_omega, delta_E, |
824 |
< |
new_omega, act_lum; |
824 |
> |
new_omega, act_lum,temp_av_posx,temp_av_posy,av_lum; |
825 |
|
|
826 |
|
|
827 |
|
/* change existing gs */ |
838 |
|
|
839 |
|
new_omega = old_omega - act_omega; |
840 |
|
pict_get_av_omega(p, old_gsn) = new_omega; |
789 |
– |
pict_get_av_posx(p, old_gsn) = |
790 |
– |
(old_av_posx * old_omega - x * act_omega) / new_omega; |
791 |
– |
pict_get_av_posy(p, old_gsn) = |
792 |
– |
(old_av_posy * old_omega - y * act_omega) / new_omega; |
841 |
|
|
794 |
– |
|
842 |
|
act_lum = luminance(pict_get_color(p, x, y)); |
843 |
|
old_av_lum = pict_get_av_lum(p, old_gsn); |
844 |
|
pict_get_av_lum(p, old_gsn) = |
845 |
|
(old_av_lum * old_omega - act_lum * act_omega) / new_omega; |
846 |
+ |
|
847 |
+ |
av_lum = pict_get_av_lum(p, old_gsn); |
848 |
+ |
temp_av_posx = |
849 |
+ |
(old_av_posx *old_av_lum* old_omega - x *act_lum* act_omega ) / (old_av_lum*old_omega - act_lum* act_omega); |
850 |
+ |
|
851 |
+ |
pict_get_av_posx(p, old_gsn) = temp_av_posx; |
852 |
+ |
temp_av_posy = |
853 |
+ |
(old_av_posy *old_av_lum* old_omega - y *act_lum* act_omega ) / (old_av_lum*old_omega - act_lum* act_omega); |
854 |
+ |
pict_get_av_posy(p, old_gsn) = temp_av_posy; |
855 |
+ |
|
856 |
|
/* add pixel to new gs */ |
857 |
|
|
858 |
|
add_pixel_to_gs(p, x, y, new_gsn); |
871 |
|
float get_posindex(pict * p, float x, float y, int postype) |
872 |
|
{ |
873 |
|
float posindex; |
874 |
< |
double teta, phi, sigma, tau, deg, d, s, r, fact; |
874 |
> |
double teta, beta, phi, sigma, tau, deg, d, s, r, fact; |
875 |
|
|
876 |
|
|
877 |
|
pict_get_vangle(p, x, y, p->view.vdir, p->view.vup, &phi); |
899 |
|
/* KIM model */ |
900 |
|
posindex = exp ((sigma-(-0.000009*tau*tau*tau+0.0014*tau*tau+0.0866*tau+21.633))/(-0.000009*tau*tau*tau+0.0013*tau*tau+0.0853*tau+8.772)); |
901 |
|
}else{ |
902 |
+ |
|
903 |
|
/* Guth model, equation from IES lighting handbook */ |
904 |
|
posindex = |
905 |
|
exp((35.2 - 0.31889 * tau - |
908 |
|
0.002963 * tau * |
909 |
|
tau) / 100000 * |
910 |
|
sigma * sigma); |
853 |
– |
/* below line of sight, using Iwata model */ |
854 |
– |
if (phi < 0) { |
855 |
– |
d = 1 / tan(phi); |
856 |
– |
s = tan(teta) / tan(phi); |
857 |
– |
r = sqrt(1 / d * 1 / d + s * s / d / d); |
858 |
– |
if (r > 0.6) |
859 |
– |
fact = 1.2; |
860 |
– |
if (r > 3) { |
861 |
– |
fact = 1.2; |
862 |
– |
r = 3; |
863 |
– |
} |
911 |
|
|
912 |
< |
posindex = 1 + fact * r; |
912 |
> |
/* below line of sight, using Iwata model, CIE2010, converted coordinate system according to Takuro Kikuchi */ |
913 |
> |
|
914 |
> |
if (phi < 0) { |
915 |
> |
beta = atan(tan(sigma/deg)* sqrt(1 + 0.3225 * pow(cos(tau/deg),2))) * deg; |
916 |
> |
posindex = exp(6.49 / 1000 * beta + 21.0 / 100000 * beta * beta); |
917 |
> |
|
918 |
|
} |
919 |
+ |
|
920 |
|
if (posindex > 16) |
921 |
|
posindex = 16; |
922 |
|
} |
1210 |
|
pict_get_av_posy(p, i), |
1211 |
|
posindex_2), |
1212 |
|
a4) * pow(pict_get_av_omega(p, i), a2); |
1213 |
< |
/* printf("i,sum_glare %i %f\n",i,sum_glare);*/ |
1213 |
> |
/*printf("i,sum_glare %i %f\n",i,sum_glare); */ |
1214 |
|
} |
1215 |
|
} |
1216 |
|
dgp = |
1364 |
|
return ugp; |
1365 |
|
|
1366 |
|
} |
1367 |
+ |
/* subroutine for the calculation of the updated unified glare probability (Hirning 2016)*/ |
1368 |
+ |
float get_ugp2(pict * p, double lum_backg, int igs, int posindex_2) |
1369 |
+ |
{ |
1370 |
+ |
float ugp; |
1371 |
+ |
double sum_glare,ugp2; |
1372 |
+ |
int i, i_glare; |
1373 |
|
|
1374 |
|
|
1375 |
+ |
sum_glare = 0; |
1376 |
+ |
i_glare = 0; |
1377 |
+ |
for (i = 0; i <= igs; i++) { |
1378 |
+ |
|
1379 |
+ |
if (pict_get_npix(p, i) > 0) { |
1380 |
+ |
i_glare = i_glare + 1; |
1381 |
+ |
sum_glare += |
1382 |
+ |
pow(pict_get_av_lum(p, i) / |
1383 |
+ |
get_posindex(p, pict_get_av_posx(p, i), |
1384 |
+ |
pict_get_av_posy(p, i), posindex_2), |
1385 |
+ |
2) * pict_get_av_omega(p, i); |
1386 |
+ |
|
1387 |
+ |
} |
1388 |
+ |
} |
1389 |
+ |
ugp2 = 1/pow(1.0+2.0/7.0*pow(sum_glare/lum_backg,-0.2),10.0); |
1390 |
+ |
|
1391 |
+ |
return ugp2; |
1392 |
+ |
|
1393 |
+ |
} |
1394 |
+ |
|
1395 |
+ |
|
1396 |
|
/* subroutine for the calculation of the disability glare according to Poynter */ |
1397 |
|
float get_disability(pict * p, double lum_backg, int igs) |
1398 |
|
{ |
1535 |
|
pict *p = pict_create(); |
1536 |
|
pict *pm = pict_create(); |
1537 |
|
pict *pcoeff = pict_create(); |
1538 |
< |
int lowlight,skip_second_scan,calcfast,age_corr,cut_view,cut_view_type,calc_vill, output, detail_out2, x1,y1, fill, yfillmax, yfillmin, |
1539 |
< |
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, |
1538 |
> |
int add,i1,i2,y_lines,ix_offset,x_offset,y_offset, patchmode,ix, iy, patch_pixdistance_x, patch_pixdistance_y,nx_patch,ny_patch, lowlight,skip_second_scan, |
1539 |
> |
calcfast,age_corr,cut_view,cut_view_type,calc_vill, output, detail_out2, x1,y1, fill, yfillmax, yfillmin, |
1540 |
> |
ext_vill, set_lum_max, set_lum_max2, img_corr,x_disk,y_disk,task_color, i_splitstart,zones,act_gsn,splitgs,j,jj,multi_image_mode, |
1541 |
|
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, |
1542 |
|
igs, actual_igs, lastpixelwas_gs, icol, xt, yt, change,checkpixels, before_igs, sgs, splithigh,uniform_gs,x_max, y_max,y_mid, |
1543 |
< |
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; |
1544 |
< |
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, |
1545 |
< |
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, |
1543 |
> |
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,num_scans; |
1544 |
> |
double abs_max,Lveil,xxx,angle_v,angle_h,patch_angle, r_contrast,r_dgp,r_glare,sum_glare, LUM_replace,lum_total_max,age_corr_factor,age,dgp_ext,dgp,low_light_corr,omega_cos_contr, setvalue, |
1545 |
> |
lum_ideal, E_v_contr, sigma,om,delta_E, |
1546 |
> |
E_vl_ext, lum_max, new_lum_max, r_center, ugp,ugp2, ugr_exp, dgi_mod,lum_a, E_v_mask,angle_disk,dist,n_corner_px,zero_corner_px, |
1547 |
|
search_pix, a1, a2, a3, a4, a5, c3, c1, c2, r_split, max_angle,r_actual,lum_actual,dir_ill, |
1548 |
|
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, |
1549 |
|
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, |
1553 |
|
lum_z1[1],lum_z1_av,lum_z1_std[1],lum_z1_median[1],omega_z1,bbox_z1[2], |
1554 |
|
lum_z2[1],lum_z2_av,lum_z2_std[1],lum_z2_median[1],omega_z2,bbox_z2[2], |
1555 |
|
lum_pos[1],lum_nopos_median[1],lum_pos_median[1],lum_pos2_median[1],lum_pos_mean,lum_pos2_mean; |
1556 |
< |
float lum_task, lum_thres, dgi, vcp, cgi, ugr, limit, dgr,pgsv ,pgsv_sat,pgsv_con, |
1475 |
< |
abs_max, Lveil; |
1556 |
> |
float lum_task, lum_thres, dgi, vcp, cgi, ugr, limit, dgr,pgsv ,pgsv_sat,pgsv_con; |
1557 |
|
char maskfile[500],file_out[500], file_out2[500], version[500],correction_type[500]; |
1558 |
|
char *cline; |
1559 |
|
char** temp_image_name; |
1560 |
< |
int *x_temp_img, *y_temp_img; |
1560 |
> |
int *x_temp_img, *y_temp_img; |
1561 |
> |
double *scale_image_scans; |
1562 |
|
VIEW userview = STDVIEW; |
1563 |
|
int gotuserview = 0; |
1564 |
|
|
1596 |
|
muc_rvar_clear(s_posweight2); |
1597 |
|
|
1598 |
|
/*set required user view parameters to invalid values*/ |
1599 |
< |
lowlight=1; |
1599 |
> |
patchmode=0; |
1600 |
> |
patch_angle=25.0; |
1601 |
> |
patch_pixdistance_x=0; |
1602 |
> |
patch_pixdistance_y=0; |
1603 |
> |
lowlight=0; |
1604 |
|
multi_image_mode=0; |
1605 |
|
lastpixelwas_peak=0; |
1606 |
|
num_images=0; |
1699 |
|
abs_max = 0; |
1700 |
|
fixargv0(argv[0]); |
1701 |
|
E_v_contr = 0.0; |
1702 |
< |
strcpy(version, "1.19 release 09.12.2015 by J.Wienold"); |
1702 |
> |
strcpy(version, "3.05 release 25.06.2024 by J.Wienold"); |
1703 |
|
low_light_corr=1.0; |
1704 |
|
output = 0; |
1705 |
|
calc_vill = 0; |
1779 |
|
case 'r': |
1780 |
|
max_angle = atof(argv[++i]); |
1781 |
|
break; |
1782 |
+ |
case 'z': |
1783 |
+ |
patch_angle = atof(argv[++i]); |
1784 |
+ |
patchmode= atoi(argv[++i]); |
1785 |
+ |
if ( patchmode == 3) { output=4;} |
1786 |
+ |
|
1787 |
+ |
/* patchmode = 0 : deactivated; patchmode =1: patch without combining, normal output; patchmode =3: patch without combining, coefficient output; patchmode =2 patch with combining (not yet implemented...) */ |
1788 |
+ |
break; |
1789 |
+ |
|
1790 |
|
case 's': |
1791 |
|
sgs = 1; |
1792 |
|
break; |
1981 |
|
output= 3; |
1982 |
|
calcfast=1; |
1983 |
|
num_images =atoi(argv[++i]); |
1984 |
+ |
num_scans =atoi(argv[++i]); |
1985 |
|
temp_image_name = malloc(sizeof(char*)*num_images); |
1986 |
|
|
1987 |
|
x_temp_img=(int *) malloc(sizeof(int) * num_images); |
1988 |
|
y_temp_img=(int *) malloc(sizeof(int) * num_images); |
1989 |
< |
|
1895 |
< |
|
1989 |
> |
scale_image_scans=(double *) malloc(sizeof(double) * (num_scans+1)*num_images); |
1990 |
|
/* iterate through all images and allocate 256 characters to each: */ |
1991 |
|
for (j = 0; j < num_images; j++) { |
1992 |
+ |
scale_image_scans[j*(num_scans+1)]=1.0; |
1993 |
|
temp_image_name[j] = malloc(256*sizeof(char)); |
1994 |
|
strcpy(temp_image_name[j], argv[++i]); |
1995 |
|
x_temp_img[j] = atoi(argv[++i]); |
1996 |
|
y_temp_img[j] = atoi(argv[++i]); |
1997 |
+ |
for (jj=1;jj<=num_scans;jj++){ |
1998 |
+ |
scale_image_scans[j*(num_scans+1)+jj]=atof(argv[++i]);} |
1999 |
|
} |
2000 |
|
|
2001 |
|
|
2029 |
|
} |
2030 |
|
|
2031 |
|
/* set multiplier for task method to 5, if not specified */ |
2032 |
+ |
|
2033 |
|
|
2034 |
+ |
|
2035 |
|
if ( task_lum == 1 && thres_activate == 0){ |
2036 |
|
lum_thres = 5.0; |
2037 |
|
} |
2099 |
|
exit(1); |
2100 |
|
} |
2101 |
|
|
2102 |
+ |
if ( patchmode > 0 && p->view.type != VT_ANG) { |
2103 |
+ |
|
2104 |
+ |
fprintf(stderr, "error: Patchmode only possible with view type vta ! Stopping... \n"); |
2105 |
+ |
exit(1); |
2106 |
+ |
|
2107 |
+ |
} |
2108 |
+ |
|
2109 |
+ |
|
2110 |
|
if (p->view.type == VT_PER) { |
2111 |
|
fprintf(stderr, "warning: image has perspective view type specified in header ! \n"); |
2112 |
|
} |
2463 |
|
/* printf("Ev, avlum, Omega_tot%f %f %f \n",E_v, avlum, sang); */ |
2464 |
|
|
2465 |
|
/* first glare source scan: find primary glare sources */ |
2466 |
+ |
|
2467 |
+ |
if (patchmode==0) { |
2468 |
|
for (x = 0; x < pict_get_xsize(p); x++) { |
2469 |
|
lastpixelwas_gs=0; |
2470 |
|
/* lastpixelwas_peak=0; */ |
2507 |
|
} |
2508 |
|
} |
2509 |
|
} |
2510 |
< |
/* pict_write(p,"firstscan.pic"); */ |
2510 |
> |
} else { |
2511 |
> |
/* patchmode on! |
2512 |
> |
calculation only for angular projection! |
2513 |
|
|
2514 |
+ |
*/ |
2515 |
|
|
2516 |
|
|
2517 |
+ |
angle_v=p->view.vert; |
2518 |
+ |
angle_h=p->view.horiz; |
2519 |
|
|
2520 |
< |
if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2 ) { |
2520 |
> |
|
2521 |
> |
/*printf ("angle_v,angle_h: %f %f \n",angle_v,angle_h) ; |
2522 |
> |
|
2523 |
> |
setting up patches as glare sources */ |
2524 |
> |
|
2525 |
> |
patch_pixdistance_x=floor(pict_get_xsize(p)/angle_h*patch_angle); |
2526 |
> |
patch_pixdistance_y=floor(pict_get_ysize(p)/angle_v*patch_angle); |
2527 |
> |
|
2528 |
> |
nx_patch=floor(angle_v/patch_angle)+1; |
2529 |
> |
ny_patch=floor(angle_h/patch_angle)+1; |
2530 |
> |
|
2531 |
> |
y_offset=floor (patch_pixdistance_y/2); |
2532 |
> |
x_offset=floor (patch_pixdistance_x/2); |
2533 |
> |
/* printf ("nx_patch,ny_patch,x_offset,y_offset,patch_pixdistance_x,patch_pixdistance_y %i %i %i %i %i %i\n",nx_patch,ny_patch,x_offset,y_offset,patch_pixdistance_x,patch_pixdistance_y) ; */ |
2534 |
> |
|
2535 |
> |
ix_offset=0; |
2536 |
> |
for (iy=1; iy<=ny_patch;iy++) { |
2537 |
> |
|
2538 |
> |
|
2539 |
> |
|
2540 |
> |
for (ix=1; ix<=nx_patch;ix++) { |
2541 |
> |
igs = igs + 1; |
2542 |
> |
pict_new_gli(p); |
2543 |
> |
|
2544 |
> |
pict_get_lum_min(p, igs) = HUGE_VAL; |
2545 |
> |
pict_get_Eglare(p,igs) = 0.0; |
2546 |
> |
pict_get_Dglare(p,igs) = 0.0; |
2547 |
> |
pict_get_z1_gsn(p,igs) = 0; |
2548 |
> |
pict_get_z2_gsn(p,igs) = 0; |
2549 |
> |
pict_get_dx_max(p,igs) = (x_offset+ix_offset*x_offset+(ix-1)*patch_pixdistance_x)*1.0; |
2550 |
> |
pict_get_dy_max(p,igs) = (y_offset+(iy-1)*patch_pixdistance_y)*1.0; |
2551 |
> |
|
2552 |
> |
/* printf ("igs, x-patch, y-patch : %i %f %f \n",igs,pict_get_dx_max(p,igs),pict_get_dy_max(p,igs) ) ; */ |
2553 |
> |
|
2554 |
> |
} |
2555 |
> |
ix_offset=ix_offset+1; |
2556 |
> |
if (ix_offset==2) { |
2557 |
> |
ix_offset =0 ; |
2558 |
> |
} |
2559 |
> |
|
2560 |
> |
} |
2561 |
> |
for (y = 0; y < pict_get_ysize(p); y++) { |
2562 |
> |
for (x = 0; x < pict_get_xsize(p); x++) { |
2563 |
> |
|
2564 |
> |
if (pict_get_hangle(p, x, y, p->view.vdir, p->view.vup, &ang)) { |
2565 |
> |
if (pict_is_validpixel(p, x, y)) { |
2566 |
> |
act_lum = luminance(pict_get_color(p, x, y)); |
2567 |
> |
if (act_lum > lum_source) { |
2568 |
> |
if (act_lum >lum_total_max) { |
2569 |
> |
lum_total_max=act_lum; |
2570 |
> |
} |
2571 |
> |
|
2572 |
> |
y_lines = floor((y)/patch_pixdistance_y); |
2573 |
> |
xxx = (x+0.0)/(patch_pixdistance_x+0.0)-0.5*(y_lines % 2); |
2574 |
> |
if (xxx<0 ) { xxx=0.0 ;} |
2575 |
> |
i1 = y_lines*(nx_patch)+floor(xxx)+1; |
2576 |
> |
i2=0; |
2577 |
> |
add=0; |
2578 |
> |
if (y_lines % 2 == 1 ) {add=1;} |
2579 |
> |
|
2580 |
> |
if (y >pict_get_dy_max(p,i1)) { |
2581 |
> |
|
2582 |
> |
if (x > pict_get_dx_max(p,i1)) { |
2583 |
> |
i2=i1+nx_patch+add; |
2584 |
> |
}else { |
2585 |
> |
i2=i1+nx_patch-1+add; |
2586 |
> |
} |
2587 |
> |
}else { |
2588 |
> |
|
2589 |
> |
if (x > pict_get_dx_max(p,i1)) { |
2590 |
> |
i2=i1-nx_patch+add; |
2591 |
> |
}else { |
2592 |
> |
i2=i1-nx_patch-1+add; |
2593 |
> |
} |
2594 |
> |
} |
2595 |
> |
|
2596 |
> |
|
2597 |
> |
|
2598 |
> |
|
2599 |
> |
if (i2 > igs || i2 < 1) {actual_igs=i1;}else{ |
2600 |
> |
if ( ((x-pict_get_dx_max(p,i1))*(x-pict_get_dx_max(p,i1))+(y-pict_get_dy_max(p,i1))*(y-pict_get_dy_max(p,i1))) < ((x-pict_get_dx_max(p,i2))*(x-pict_get_dx_max(p,i2))+(y-pict_get_dy_max(p,i2))*(y-pict_get_dy_max(p,i2))) ) { |
2601 |
> |
actual_igs=i1; }else {actual_igs=i2;}} |
2602 |
> |
|
2603 |
> |
|
2604 |
> |
pict_get_gsn(p, x, y) = actual_igs; |
2605 |
> |
pict_get_pgs(p, x, y) = 1; |
2606 |
> |
add_pixel_to_gs(p, x, y, actual_igs); |
2607 |
> |
/* setglcolor(p, x, y, actual_igs, uniform_gs, u_r, u_g , u_b); */ |
2608 |
> |
} |
2609 |
> |
} |
2610 |
> |
} |
2611 |
> |
|
2612 |
> |
|
2613 |
> |
|
2614 |
> |
|
2615 |
> |
|
2616 |
> |
} } |
2617 |
> |
|
2618 |
> |
|
2619 |
> |
|
2620 |
> |
|
2621 |
> |
} |
2622 |
> |
/* pict_write(p,"firstscan.pic"); */ |
2623 |
> |
|
2624 |
> |
|
2625 |
> |
|
2626 |
> |
|
2627 |
> |
if (calcfast ==1 || search_pix <= 1.0 || calcfast == 2 || patchmode > 0) { |
2628 |
|
skip_second_scan=1; |
2629 |
|
} |
2630 |
|
|
2868 |
|
i=0; |
2869 |
|
for (x = 0; x <= igs; x++) { |
2870 |
|
if (pict_get_npix(p, x) > 0) { |
2871 |
+ |
sum_glare += pow(pict_get_av_lum(p, x),2.0)* pict_get_av_omega(p, x)/pow(get_posindex(p, pict_get_av_posx(p, x), pict_get_av_posy(p, x),posindex_2), 2.0); |
2872 |
|
lum_sources += pict_get_av_lum(p, x) * pict_get_av_omega(p, x); |
2873 |
|
omega_sources += pict_get_av_omega(p, x); |
2874 |
|
i=i+1; |
2875 |
|
}} |
2876 |
< |
|
2876 |
> |
sum_glare= c2*log10(1 + sum_glare / pow(E_v, a3)); |
2877 |
|
if (sang == omega_sources) { |
2878 |
|
lum_backg =avlum; |
2879 |
|
} else { |
2991 |
|
omega_z1 += pict_get_omega(p, x, y); |
2992 |
|
lum_z1_av += pict_get_omega(p, x, y)* lum_actual; |
2993 |
|
Ez1 += DOT(p->view.vdir, pict_get_cached_dir(p, x, y))* pict_get_omega(p, x, y)* lum_actual; |
2772 |
– |
|
2994 |
|
setglcolor(p,x,y,1,1 , 0.66, 0.01 ,0.33); |
2995 |
|
/*check if separation gsn already exist */ |
2996 |
|
|
3070 |
|
muc_rvar_get_bounding_box(s_z1,bbox_z1); |
3071 |
|
if (detail_out == 1) { |
3072 |
|
|
3073 |
< |
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 ); |
3073 |
> |
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,i_z1: %f %f %f %f %f %f %f %f %f %i\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,i_z1 ); |
3074 |
|
|
3075 |
|
if (zones == 2 ) { |
3076 |
|
|
3077 |
< |
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 ); |
3077 |
> |
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,Ez2,i_z2: %f %f %f %f %f %f %f %f %f %i\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,i_z1 ); |
3078 |
|
} } |
3079 |
|
|
3080 |
|
} |
3081 |
|
|
3082 |
+ |
int new_gs_number[igs+1]; |
3083 |
+ |
|
3084 |
|
i = 0; |
3085 |
|
for (x = 0; x <= igs; x++) { |
3086 |
|
/* resorting glare source numbers */ |
3087 |
|
if (pict_get_npix(p, x) > 0) { |
3088 |
|
i = i + 1; |
3089 |
+ |
pict_get_Dglare(p,x) = i; |
3090 |
+ |
new_gs_number[x] = i; |
3091 |
+ |
/* printf("%i %i %f %i \n", i,x,pict_get_Dglare(p,x),new_gs_number[x] ); */ |
3092 |
|
} |
3093 |
|
} |
3094 |
|
no_glaresources=i; |
3095 |
|
/*printf("%i",no_glaresources );*/ |
3096 |
|
/* glare sources */ |
2871 |
– |
if (detail_out == 1 && output != 3) { |
3097 |
|
|
3098 |
+ |
if (output == 4 ) { |
3099 |
+ |
|
3100 |
+ |
i=0; |
3101 |
+ |
for (x = 0; x <= igs; x++) { |
3102 |
+ |
if (pict_get_npix(p, x) > 0) { |
3103 |
+ |
i = i + 1; |
3104 |
+ |
|
3105 |
+ |
x2=pict_get_av_posx(p, x); |
3106 |
+ |
y2=pict_get_av_posy(p, x); |
3107 |
+ |
|
3108 |
+ |
printf("%i %f %f %f %f %.10f %f %f %f %f \n", |
3109 |
+ |
i, pict_get_npix(p, x), pict_get_av_posx(p, x), pict_get_av_posy(p, x), |
3110 |
+ |
pict_get_av_lum(p, x), pict_get_av_omega(p, x), |
3111 |
+ |
get_posindex(p, pict_get_av_posx(p, x),pict_get_av_posy(p, x),posindex_2), |
3112 |
+ |
pict_get_cached_dir(p, x2,y2)[0],pict_get_cached_dir(p, x2,y2)[1],pict_get_cached_dir(p, x2,y2)[2]); |
3113 |
+ |
} |
3114 |
+ |
} |
3115 |
+ |
|
3116 |
+ |
|
3117 |
+ |
for (y = 0; y < pict_get_ysize(p); y++) { |
3118 |
+ |
for (x = 0; x < pict_get_xsize(p); x++) { |
3119 |
+ |
|
3120 |
+ |
if (pict_get_hangle(p, x, y, p->view.vdir, p->view.vup, &ang)) { |
3121 |
+ |
if (pict_is_validpixel(p, x, y)) { |
3122 |
+ |
if (pict_get_gsn(p,x,y) >0 ) { |
3123 |
+ |
i=pict_get_gsn(p,x,y); |
3124 |
+ |
printf("%i %i %f %f %f \n", i, new_gs_number[i], pict_get_cached_dir(p, x,y)[0],pict_get_cached_dir(p, x,y)[1],pict_get_cached_dir(p, x,y)[2] ); |
3125 |
+ |
|
3126 |
+ |
} |
3127 |
+ |
|
3128 |
+ |
|
3129 |
+ |
|
3130 |
+ |
}}}} |
3131 |
+ |
|
3132 |
+ |
|
3133 |
+ |
} |
3134 |
+ |
|
3135 |
+ |
|
3136 |
+ |
|
3137 |
+ |
|
3138 |
+ |
if (detail_out == 1 && output < 3) { |
3139 |
+ |
dgp = get_dgp(p, E_v, igs, a1, a2, a3, a4, a5, c1, c2, c3, posindex_2); |
3140 |
+ |
|
3141 |
|
printf |
3142 |
< |
("%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", |
3142 |
> |
("%i No pixels x-pos y-pos L_s Omega_s Posindx L_b L_t E_v Edir Max_Lum Sigma xdir ydir zdir Eglare Lveil_cie teta glare_zone r_contrast r_dgp\n", |
3143 |
|
i); |
3144 |
|
if (i == 0) { |
3145 |
< |
printf("%i %f %f %f %f %.10f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", i, 0.0, 0.0, |
3146 |
< |
0.0, 0.0, 0.0, 0.0, lum_backg, lum_task, E_v, E_v_dir,abs_max,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); |
3145 |
> |
printf("%i %f %f %f %f %.10f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", i, 0.0, 0.0, |
3146 |
> |
0.0, 0.0, 0.0, 0.0, lum_backg, lum_task, E_v, E_v_dir,abs_max,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); |
3147 |
|
|
3148 |
|
} else { |
3149 |
|
i = 0; |
3163 |
|
Lveil_cie =0 ; |
3164 |
|
} |
3165 |
|
Lveil_cie_sum = Lveil_cie_sum + Lveil_cie; |
3166 |
+ |
r_glare= c2*log10(1 + pow(pict_get_av_lum(p, x),2)* pict_get_av_omega(p, x)/pow(get_posindex(p, pict_get_av_posx(p, x), pict_get_av_posy(p, x),posindex_2), 2.0) / pow(E_v, a3)) ; |
3167 |
+ |
r_contrast=r_glare/sum_glare ; |
3168 |
+ |
r_dgp=r_glare/dgp ; |
3169 |
|
if (pict_get_z1_gsn(p,x)<0) { |
3170 |
|
act_gsn=(int)(-pict_get_z1_gsn(p,x)); |
3171 |
|
}else{ |
3172 |
|
act_gsn=0; |
3173 |
|
} |
3174 |
< |
printf("%i %f %f %f %f %.10f %f %f %f %f %f %f %f %f %f %f %f %f %f %i \n", |
3174 |
> |
printf("%i %f %f %f %f %.10f %f %f %f %f %f %f %f %f %f %f %f %f %f %i %f %f \n", |
3175 |
|
i, pict_get_npix(p, x), pict_get_av_posx(p, x), |
3176 |
|
pict_get_ysize(p) - pict_get_av_posy(p, x), |
3177 |
|
pict_get_av_lum(p, x), pict_get_av_omega(p, x), |
3179 |
|
pict_get_av_posy(p, x), |
3180 |
|
posindex_2), lum_backg, lum_task, |
3181 |
|
E_v, E_v_dir, abs_max, sigma * 180 / 3.1415927 |
3182 |
< |
,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),Lveil_cie,teta,act_gsn ); |
3182 |
> |
,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),Lveil_cie,teta,act_gsn,r_contrast,r_dgp ); |
3183 |
|
} |
3184 |
|
} |
3185 |
|
} |
3186 |
|
} |
3187 |
|
|
3188 |
< |
if ( output != 3) { |
3188 |
> |
if ( output < 3) { |
3189 |
|
|
3190 |
|
/* calculation of indicees */ |
3191 |
|
|
3224 |
|
dgi = get_dgi(p, lum_backg, igs, posindex_2); |
3225 |
|
ugr = get_ugr(p, lum_backg, igs, posindex_2); |
3226 |
|
ugp = get_ugp (p,lum_backg, igs, posindex_2); |
3227 |
+ |
ugp2 = get_ugp2 (p,lum_backg, igs, posindex_2); |
3228 |
|
ugr_exp = get_ugr_exp (p,lum_backg_cos,lum_a, igs, posindex_2); |
3229 |
|
dgi_mod = get_dgi_mod(p, lum_a, igs, posindex_2); |
3230 |
|
cgi = get_cgi(p, E_v, E_v_dir, igs, posindex_2); |
3235 |
|
dgi = 0.0; |
3236 |
|
ugr = 0.0; |
3237 |
|
ugp = 0.0; |
3238 |
+ |
ugp2 =0.0; |
3239 |
|
ugr_exp = 0.0; |
3240 |
|
dgi_mod = 0.0; |
3241 |
|
cgi = 0.0; |
3262 |
|
get_dgp(p, E_vl_ext, igs, a1, a2, a3, a4, a5, c1, c2, c3, |
3263 |
|
posindex_2); |
3264 |
|
dgp = dgp_ext; |
3265 |
< |
if (E_vl_ext < 1000) { |
3265 |
> |
if (E_vl_ext < 1000 && lowlight ==1) { |
3266 |
|
low_light_corr=1.0*exp(0.024*E_vl_ext-4)/(1+exp(0.024*E_vl_ext-4));} else {low_light_corr=1.0 ;} |
3267 |
|
dgp =low_light_corr*dgp; |
3268 |
|
dgp =age_corr_factor*dgp; |
3275 |
|
|
3276 |
|
|
3277 |
|
printf |
3278 |
< |
("dgp,av_lum,E_v,lum_backg,E_v_dir,dgi,ugr,vcp,cgi,lum_sources,omega_sources,Lveil,Lveil_cie,dgr,ugp,ugr_exp,dgi_mod,av_lum_pos,av_lum_pos2,med_lum,med_lum_pos,med_lum_pos2: %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", |
3278 |
> |
("dgp,av_lum,E_v,lum_backg,E_v_dir,dgi,ugr,vcp,cgi,lum_sources,omega_sources,Lveil,Lveil_cie,dgr,ugp,ugr_exp,dgi_mod,av_lum_pos,av_lum_pos2,med_lum,med_lum_pos,med_lum_pos2,ugp2: %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", |
3279 |
|
dgp, avlum, E_v, lum_backg, E_v_dir, dgi, ugr, vcp, cgi, |
3280 |
< |
lum_sources, omega_sources, Lveil,Lveil_cie_sum,dgr,ugp,ugr_exp,dgi_mod,lum_pos_mean,lum_pos2_mean/sang,lum_nopos_median[0],lum_pos_median[0],lum_pos2_median[0]); |
3280 |
> |
lum_sources, omega_sources, Lveil,Lveil_cie_sum,dgr,ugp,ugr_exp,dgi_mod,lum_pos_mean,lum_pos2_mean/sang,lum_nopos_median[0],lum_pos_median[0],lum_pos2_median[0],ugp2); |
3281 |
|
} else { |
3282 |
|
if (detail_out2 == 1) { |
3283 |
|
|
3290 |
|
if (ext_vill == 1) { |
3291 |
|
dgp_ext = get_dgp(p, E_vl_ext, igs, a1, a2, a3, a4, a5, c1, c2, c3,posindex_2); |
3292 |
|
|
3293 |
< |
if (E_vl_ext < 1000) { |
3293 |
> |
if (E_vl_ext < 1000 && lowlight ==1) { |
3294 |
|
low_light_corr=1.0*exp(0.024*E_vl_ext-4)/(1+exp(0.024*E_vl_ext-4));} else {low_light_corr=1.0 ;} |
3295 |
|
dgp =low_light_corr*dgp_ext; |
3296 |
|
dgp =age_corr_factor*dgp; |
3305 |
|
get_dgp(p, E_vl_ext, igs, a1, a2, a3, a4, a5, c1, c2, c3, |
3306 |
|
posindex_2); |
3307 |
|
dgp = dgp_ext; |
3308 |
< |
if (E_vl_ext < 1000) { |
3308 |
> |
if (E_vl_ext < 1000 && lowlight ==1) { |
3309 |
|
low_light_corr=1.0*exp(0.024*E_vl_ext-4)/(1+exp(0.024*E_vl_ext-4)); } else {low_light_corr=1.0 ;} |
3310 |
|
dgp =low_light_corr*dgp; |
3311 |
|
|
3321 |
|
} |
3322 |
|
|
3323 |
|
}else{ |
3324 |
< |
/* only multiimagemode */ |
3324 |
> |
/* only multiimagemode |
3325 |
|
|
3326 |
+ |
*/ |
3327 |
|
|
3328 |
+ |
|
3329 |
|
for (j = 0; j < num_images; j++) { |
3330 |
|
|
3331 |
|
|
3336 |
|
/*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)); |
3337 |
|
*/ |
3338 |
|
|
3339 |
+ |
|
3340 |
+ |
/* loop over scans |
3341 |
+ |
empty of */ |
3342 |
+ |
for (jj=0;jj<=num_scans;jj++){ |
3343 |
+ |
|
3344 |
+ |
/*printf("scale %i %i %i %f ",j,jj,num_scans,scale_image_scans[j*(num_scans+1)+jj]); */ |
3345 |
+ |
|
3346 |
+ |
|
3347 |
|
/* copy luminance value into big image and remove glare sources*/ |
3348 |
|
for (x = 0; x < pict_get_xsize(pcoeff); x++) { |
3349 |
|
for (y = 0; y < pict_get_ysize(pcoeff); y++) { |
3350 |
< |
xmap=x_temp_img[j]+x-1; |
3351 |
< |
ymap=y_temp_img[j]+y-1; |
3350 |
> |
xmap=x_temp_img[j]+x; |
3351 |
> |
ymap=y_temp_img[j]+y; |
3352 |
|
if (xmap <0) { xmap=0;} |
3353 |
|
if (ymap <0) { ymap=0;} |
3354 |
|
|
3355 |
< |
pict_get_color(p, xmap, ymap)[RED] = pict_get_color(pcoeff, x, y)[RED]; |
3356 |
< |
pict_get_color(p, xmap, ymap)[GRN] = pict_get_color(pcoeff, x, y)[GRN]; |
3357 |
< |
pict_get_color(p, xmap, ymap)[BLU] = pict_get_color(pcoeff, x, y)[BLU]; |
3355 |
> |
pict_get_color(p, xmap, ymap)[RED] = scale_image_scans[j*(num_scans+1)+jj]*pict_get_color(pcoeff, x, y)[RED]; |
3356 |
> |
pict_get_color(p, xmap, ymap)[GRN] = scale_image_scans[j*(num_scans+1)+jj]*pict_get_color(pcoeff, x, y)[GRN]; |
3357 |
> |
pict_get_color(p, xmap, ymap)[BLU] = scale_image_scans[j*(num_scans+1)+jj]*pict_get_color(pcoeff, x, y)[BLU]; |
3358 |
|
pict_get_gsn(p, xmap, ymap) = 0; |
3359 |
|
pict_get_pgs(p, xmap, ymap) = 0; |
3360 |
|
}} |
3361 |
|
|
3362 |
+ |
|
3363 |
+ |
|
3364 |
+ |
|
3365 |
+ |
|
3366 |
|
actual_igs =0; |
3367 |
|
|
3368 |
|
/* first glare source scan: find primary glare sources */ |
3375 |
|
if (pict_get_hangle(p, xmap, ymap, p->view.vdir, p->view.vup, &ang)) { |
3376 |
|
if (pict_is_validpixel(p, xmap, ymap)) { |
3377 |
|
act_lum = luminance(pict_get_color(p, xmap, ymap)); |
3378 |
< |
if (act_lum > lum_source) { |
3378 |
> |
if (act_lum> lum_source) { |
3379 |
|
if (act_lum >lum_total_max) { |
3380 |
|
lum_total_max=act_lum; |
3381 |
|
} |
3591 |
|
igs=0; |
3592 |
|
|
3593 |
|
|
3594 |
< |
|
3594 |
> |
} |
3595 |
|
|
3596 |
|
|
3597 |
|
} |