orig/phisteq.csh
changeset 0 0aa115157c9c
equal deleted inserted replaced
-1:000000000000 0:0aa115157c9c
       
     1 #!/bin/csh -f
       
     2 # RCSid: $Id: phisteq.csh,v 3.4 2008/11/10 19:08:19 greg Exp $
       
     3 set Ldmin=1		# minimum display luminance
       
     4 set Ldmax=100		# maximum display luminance
       
     5 set nsteps=100		# number of steps in perceptual histogram
       
     6 set cvratio=0.08	# fraction of pixels to ignore in envelope clipping
       
     7 set td=/tmp
       
     8 set tf1=$td/hist$$
       
     9 set tf1b=$td/hist$$.new
       
    10 set tf2=$td/cumt$$
       
    11 set tf3=$td/histeq$$.cal
       
    12 set tf4=$td/cf$$.cal
       
    13 set tf=($tf1 $tf1b $tf2 $tf3 $tf4)
       
    14 if ( $#argv != 1 ) then
       
    15 	echo "Usage: $0 input.hdr > output.hdr"
       
    16 	exit 1
       
    17 endif
       
    18 set ifile=$1
       
    19 set ibase=$ifile:t
       
    20 if ( "$ibase" =~ *.pic ) set ibase=$ibase:r
       
    21 set ibase=$ibase:t
       
    22 onintr quit
       
    23 cat > $tf3 << _EOF_
       
    24 WE : 179;			{ Radiance white luminous efficacy }
       
    25 Lmin : .0001;			{ minimum allowed luminance }
       
    26 Ldmin : $Ldmin ;		{ minimum output luminance }
       
    27 Ldmax : $Ldmax ;		{ maximum output luminance }
       
    28 Stepsiz : 1/ $nsteps ;		{ brightness step size }
       
    29 			{ Daly local amplitude nonlinearity formulae }
       
    30 sq(x) : x*x;
       
    31 c1 : 12.6;
       
    32 b : .63;
       
    33 Bl(L) : L / (L + (c1*L)^b);
       
    34 Lb(B) : (c1^b*B/(1-B))^(1/(1-b));
       
    35 BLw(Lw) : Bl(Ldmin) + (Bl(Ldmax)-Bl(Ldmin))*cf(Bl(Lw));
       
    36 			{ first derivative functions }
       
    37 Bl1(L) : (c1*L)^b*(1-b)/sq(L + (c1*L)^b);
       
    38 Lb1(B) : c1^b/(1-b)/sq(1-B) * (c1^b*B/(1-B))^(b/(1-b));
       
    39 			{ derivative clamping function }
       
    40 clamp2(L, aLw) : Lb(aLw) / L / Lb1(aLw) / (Bl(Ldmax)-Bl(Ldmin)) / Bl1(L);
       
    41 clamp(L) : clamp2(L, BLw(L));
       
    42 			{ histogram equalization function }
       
    43 lin = li(1);
       
    44 Lw = WE/le(1) * lin;
       
    45 Lout = Lb(BLw(Lw));
       
    46 mult = if(Lw-Lmin, (Lout-Ldmin)/(Ldmax-Ldmin)/lin, 0) ;
       
    47 ro = mult * ri(1);
       
    48 go = mult * gi(1);
       
    49 bo = mult * bi(1);
       
    50 _EOF_
       
    51 # Compute brightness histogram
       
    52 pfilt -1 -p 1 -x 128 -y 128 $ifile | pvalue -o -b -d -h -H \
       
    53 	| rcalc -f $tf3 -e 'Lw=WE*$1;$1=if(Lw-Lmin,Bl(Lw),-1)' \
       
    54 	| histo 0 1 $nsteps | sed '/[ 	]0$/d' > $tf1
       
    55 # Clamp frequency distribution
       
    56 set totcount=`sed 's/^.*[ 	]//' $tf1 | total`
       
    57 set tst=1
       
    58 while ( $totcount > 0 )
       
    59 	sed 's/^.*[ 	]//' $tf1 | total -1 -r \
       
    60 		| rcalc -e '$1=$1/'$totcount | rlam $tf1 - \
       
    61 		| tabfunc -i 0 cf > $tf4
       
    62 	if ( $tst <= 0 ) break
       
    63 	rcalc -f $tf4 -f $tf3 -e "T:$totcount*Stepsiz" \
       
    64 			-e 'clfq=floor(T*clamp(Lb($1)))' \
       
    65 			-e '$1=$1;$2=if($2-clfq,clfq,$2)' $tf1 > $tf1b
       
    66 	set newtot=`sed 's/^.*[ 	]//' $tf1b | total`
       
    67 	set tst=`ev "floor((1-$cvratio)*$totcount)-$newtot"`
       
    68 	mv -f $tf1b $tf1
       
    69 	set totcount=$newtot
       
    70 end
       
    71 if ( $totcount < 1 ) then
       
    72 	# Fits in display range nicely already -- just normalize
       
    73 	pfilt -1 -e `pextrem $ifile | rcalc -e 'cond=recno-1.5;$1=1/(.265*$3+.67*$4+.065*$5)'` $ifile
       
    74 else
       
    75 	# Plot the mapping function if we are in debug mode
       
    76 	if ( $?DEBUG ) then
       
    77 		cat > ${ibase}_histo.plt << _EOF_
       
    78 include=curve.plt
       
    79 title="Brightness Frequency Distribution"
       
    80 subtitle= $ibase
       
    81 ymin=0
       
    82 xlabel="Perceptual Brightness B(Lw)"
       
    83 ylabel="Frequency Count"
       
    84 Alabel="Histogram"
       
    85 Alintype=0
       
    86 Blabel="Envelope"
       
    87 Bsymsize=0
       
    88 Adata=
       
    89 _EOF_
       
    90 		(cat $tf1; echo \;; echo Bdata=) >> ${ibase}_histo.plt
       
    91 		rcalc -f $tf4 -f $tf3 -e "T:$totcount*Stepsiz" \
       
    92 			-e '$1=$1;$2=T*clamp(Lb($1))' $tf1 \
       
    93 			>> ${ibase}_histo.plt
       
    94 		cat > ${ibase}_brmap.plt << _EOF_
       
    95 include=line.plt
       
    96 title="Brightness Mapping Function"
       
    97 subtitle= $ibase
       
    98 xlabel="World Luminance (log cd/m^2)"
       
    99 ylabel="Display Luminance (cd/m^2)"
       
   100 ymax= $Ldmax
       
   101 Adata=
       
   102 _EOF_
       
   103 		cnt 100 | rcalc -f $tf4 -f $tf3 -e '$1=lx;$2=Lb(BLw(10^lx))' \
       
   104 			-e Lmin:Lb\(`sed -n '1s/[ 	].*$//p' $tf1`\) \
       
   105 			-e Lmax:Lb\(`sed -n '$s/[ 	].*$//p' $tf1`\) \
       
   106 			-e 'lx=$1/99*(log10(Lmax)-log10(Lmin))+log10(Lmin)' \
       
   107 			>> ${ibase}_brmap.plt
       
   108 		if ( $?DISPLAY ) then
       
   109 			bgraph ${ibase}_histo.plt ${ibase}_brmap.plt | x11meta &
       
   110 		endif
       
   111 	endif
       
   112 	# Map our picture
       
   113 	pcomb -f $tf4 -f $tf3 $ifile
       
   114 endif
       
   115 quit:
       
   116 rm -f $tf