well as the associated C source code. Both will require huge cleanup for a final release. git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/research@2273 92316355-f0b4-4df1-b90c-862c8a59935fmaster
@@ -0,0 +1,6 @@ | |||
main | |||
*.aux | |||
*.dvi | |||
*.log | |||
xy2d |
@@ -0,0 +1,17 @@ | |||
all: main xy2d paper.pdf | |||
xy2d: xy2d.c | |||
$(CC) -W -Wall $^ -o $@ | |||
main: main.c | |||
$(CC) -Wall -O3 -funroll-loops -W -Wall $^ -o $@ $$(pkg-config --cflags --libs sdl) -lSDL_image -lm | |||
paper.pdf: paper.tex fs-histo.tex | |||
latex paper.tex | |||
latex paper.tex | |||
dvipdf paper.dvi | |||
clean: | |||
rm -f paper.log paper.dvi paper.aux paper.pdf | |||
rm -f xy2d main | |||
@@ -0,0 +1,191 @@ | |||
# Trouver des images au pif | |||
% find ~/4chan/unsorted-4chan/http* -name '1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].??g' | rev | sort -k2 -t. | rev | xargs -n 1 ./main | tee fs-4chan.txt | |||
% find ~/4chan/unsorted-4chan/http* -name '1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].??g' | rev | sort -k2 -t. | rev | xargs -n 1 ./main-jajuni | tee jajuni-4chan.txt | |||
% cat /tmp/4chanlist.txt | xargs -n 1 ./main | tee -a fs-4chan.txt | |||
# Lena | |||
set hidden3d | |||
set grid | |||
unset colorbox | |||
splot "lena-min.txt" with lines lc 7 notitle | |||
set terminal epslatex color size 2.5,2 blacktext | |||
set tmargin screen 0.75 | |||
set bmargin screen 0.25 | |||
set lmargin screen 0.05 | |||
set rmargin screen 0.95 | |||
set output "lena-min.tex" | |||
splot "lena-min.txt" with lines lc 7 notitle | |||
unset output | |||
set term pop | |||
# Dans gnuplot | |||
set xrange [-.1:.4] | |||
set yrange [.45:-.05] | |||
set grid | |||
plot "fs-4chan.txt" using 6:7 lc 1 pt 7 ps .08 title "4chan", \ | |||
"fs-tobefred.txt" using 6:7 lc 3 pt 7 ps .08 title "tobefred", \ | |||
"fs-uscsipi.txt" using 6:7 lc 2 pt 7 ps .08 title "USC-SIPI", \ | |||
"fs-jylam.txt" using 6:7 lc 4 pt 7 ps .08 title "Jylam", \ | |||
"merge.txt" using 5:6 lc 7 ps .2 with lines | |||
#plot "fs-textures.txt" using 6:7 lc 3 pt 7 ps .2, "fs-aerials.txt" using 6:7 lc 3 pt 7 ps .2, "fs-misc.txt" using 6:7 lc 7 pt 7 ps .2, "fs-4chan.txt" using 6:7 lc 1 pt 7 ps .2 | |||
# Histogramme de la tache Floyd-Steinberg | |||
sed -ne 's/.* for //p' fs-*txt | ./xy2d >| histo-fs.txt | |||
# Et ensuite dans gnuplot: | |||
set xrange [-.1:.4] | |||
set yrange [.4:-.1] | |||
set grid | |||
set lmargin screen 0.05 | |||
set bmargin screen 0.15 | |||
set tmargin screen 0.95 | |||
set rmargin screen 0.95 | |||
unset colorbox | |||
set pm3d explicit map interpolate 1.8,1.8 | |||
set palette model RGB defined(0 "white", 1 "blue", 2 "red", 3 "yellow") | |||
unset key | |||
#splot "histo-fs.txt" notitle | |||
set terminal epslatex color size 1.8,1.8 blacktext | |||
set output "fs-histo.tex" | |||
splot "histo-fs.txt" notitle | |||
unset output | |||
set term pop | |||
set xrange [-.1:.9] | |||
set yrange [.95:-.05] | |||
set grid | |||
plot "jajuni-4chan.txt" using 6:7 lc 1 pt 7 ps .08 title "4chan", \ | |||
"jajuni-tobefred.txt" using 6:7 lc 3 pt 7 ps .08 title "tobefred", \ | |||
"jajuni-uscsipi.txt" using 6:7 lc 2 pt 7 ps .08 title "USC-SIPI" | |||
# Histogramme de la tache JaJuNi | |||
sed -ne 's/.* for //p' jajuni*txt | ./xy2d-jajuni >| histo-jajuni.txt | |||
# Et ensuite dans gnuplot: | |||
set xrange [-.1:.9] | |||
set yrange [.9:-.1] | |||
set grid | |||
set lmargin screen 0.05 | |||
set bmargin screen 0.15 | |||
set tmargin screen 0.95 | |||
set rmargin screen 0.95 | |||
unset colorbox | |||
set pm3d explicit map interpolate 1.8,1.8 | |||
set palette model RGB defined(0 "white", 1 "blue", 2 "red", 3 "yellow") | |||
unset key | |||
#splot "histo-jajuni.txt" notitle | |||
set terminal epslatex color size 1.8,1.8 blacktext | |||
set output "jajuni-histo.tex" | |||
splot "histo-jajuni.txt" notitle | |||
unset output | |||
set term pop | |||
# Test de merde | |||
set xrange [0:5] | |||
set yrange [0:5] | |||
set grid | |||
plot "fs-uscsipi.txt" using 2:4 lc 1 pt 7 ps .5, "fs-4chan.txt" using 2:4 lc 7 pt 7 ps .5, "fs-tobefred.txt" using 2:4 lc 3 pt 7 ps .5 | |||
# Ostromoukhov | |||
set xrange [-.2:.2] | |||
set yrange [.3:-.1] | |||
set grid | |||
plot "ostro-4chan.txt" using 6:7 lc 1 pt 7 ps .08 title "4chan", \ | |||
"ostro-tobefred.txt" using 6:7 lc 3 pt 7 ps .08 title "tobefred", \ | |||
"ostro-uscsipi.txt" using 6:7 lc 2 pt 7 ps .08 title "USC-SIPI" | |||
# Histogramme de la tache Ostro | |||
sed -ne 's/.* for //p' ostro*txt | ./xy2d-ostro >| histo-ostro.txt | |||
# Et ensuite dans gnuplot: | |||
set xrange [-.2:.2] | |||
set yrange [.3:-.1] | |||
set grid | |||
set lmargin screen 0.05 | |||
set bmargin screen 0.15 | |||
set tmargin screen 0.95 | |||
set rmargin screen 0.95 | |||
unset colorbox | |||
set pm3d explicit map interpolate 1.8,1.8 | |||
set palette model RGB defined(0 "white", 1 "blue", 2 "red", 3 "yellow") | |||
unset key | |||
splot "histo-ostro.txt" notitle | |||
set terminal epslatex color size 1.8,1.8 blacktext | |||
set output "ostro-histo.tex" | |||
splot "histo-ostro.txt" notitle | |||
unset output | |||
set term pop | |||
# Optimum | |||
set xrange [-.5:.2] | |||
set yrange [.6:-.1] | |||
set grid | |||
plot "optimum-4chan.txt" using 6:7 lc 1 pt 7 ps .08 title "4chan", \ | |||
"optimum-tobefred.txt" using 6:7 lc 3 pt 7 ps .08 title "tobefred", \ | |||
"optimum-uscsipi.txt" using 6:7 lc 2 pt 7 ps .08 title "USC-SIPI" | |||
# Histogramme de la tache Optimum | |||
sed -ne 's/.* for //p' optimum*txt | ./xy2d-optimum >| histo-optimum.txt | |||
# Et ensuite dans gnuplot: | |||
set xrange [-.5:.2] | |||
set yrange [.6:-.1] | |||
set grid | |||
set lmargin screen 0.05 | |||
set bmargin screen 0.15 | |||
set tmargin screen 0.95 | |||
set rmargin screen 0.95 | |||
unset colorbox | |||
set pm3d explicit map interpolate 1.8,1.8 | |||
set palette model RGB defined(0 "white", 1 "blue", 2 "red", 3 "yellow") | |||
unset key | |||
splot "histo-optimum.txt" notitle | |||
set terminal epslatex color size 1.8,1.8 blacktext | |||
set output "optimum-histo.tex" | |||
splot "histo-optimum.txt" notitle | |||
unset output | |||
set term pop | |||
# Serpentine Optimum | |||
set xrange [-.3:.3] | |||
set yrange [.5:-.1] | |||
set grid | |||
plot "serpopt-4chan.txt" using 6:7 lc 1 pt 7 ps .08 title "4chan", \ | |||
"serpopt-tobefred.txt" using 6:7 lc 3 pt 7 ps .08 title "tobefred", \ | |||
"serpopt-uscsipi.txt" using 6:7 lc 2 pt 7 ps .08 title "USC-SIPI" | |||
# Histogramme de la tache Serpentine Optimum | |||
sed -ne 's/.* for //p' serpopt*txt | ./xy2d-serpopt >| histo-serpopt.txt | |||
# Et ensuite dans gnuplot: | |||
set xrange [-.3:.3] | |||
set yrange [.6:-.1] | |||
set grid | |||
set lmargin screen 0.05 | |||
set bmargin screen 0.15 | |||
set tmargin screen 0.95 | |||
set rmargin screen 0.95 | |||
unset colorbox | |||
set pm3d explicit map interpolate 1.8,1.8 | |||
set palette model RGB defined(0 "white", 1 "blue", 2 "red", 3 "yellow") | |||
unset key | |||
splot "histo-serpopt.txt" notitle | |||
set terminal epslatex color size 1.8,1.8 blacktext | |||
set output "serpopt-histo.tex" | |||
splot "histo-serpopt.txt" notitle | |||
unset output | |||
set term pop | |||
# Combinaison jajuni / floyd-steinberg | |||
set xrange [-.1:.4] | |||
set yrange [.9:-.1] | |||
set grid | |||
plot "fs-4chan.txt" using 6:7 lc 2 pt 7 ps .1 title "Floyd-Steinberg", "jajuni-tobefred.txt" using 6:7 lc 1 pt 7 ps .1 title "Jarvis-Judice-Ninke" | |||
######################## Trucs en cours ######################## | |||
# Lancés sur canard: | |||
boat.png elaine.png texture[2345].png | |||
# Lancés sur poulet : | |||
./main /var/www/net/tobefred/www/htdocs/media/romane_bohringer.jpg | tee out-bohringer.txt ; ./main /var/www/net/tobefred/www/htdocs/media/juliette_binoche_05.jpg | tee out-binoche.txt ; ./main /var/www/net/tobefred/www/htdocs/media/kate_beckinsale02.jpg | tee out-beckinsale.txt | |||
#### Pour les out-* | |||
scp canard.zoy.org:out-'*'.txt . | |||
for x in out-*.txt; do sort -k7 $x | head -20 ; done | cut -f1 -d: | sort | uniq -c | sort -n | |||
@@ -0,0 +1,431 @@ | |||
% GNUPLOT: LaTeX picture with Postscript | |||
\begingroup | |||
\makeatletter | |||
\providecommand\color[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package color not loaded in conjunction with | |||
terminal option `colourtext'% | |||
}{See the gnuplot documentation for explanation.% | |||
}{Either use 'blacktext' in gnuplot or load the package | |||
color.sty in LaTeX.}% | |||
\renewcommand\color[2][]{}% | |||
}% | |||
\providecommand\includegraphics[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package graphicx or graphics not loaded% | |||
}{See the gnuplot documentation for explanation.% | |||
}{The gnuplot epslatex terminal needs graphicx.sty or graphics.sty.}% | |||
\renewcommand\includegraphics[2][]{}% | |||
}% | |||
\providecommand\rotatebox[2]{#2}% | |||
\@ifundefined{ifGPcolor}{% | |||
\newif\ifGPcolor | |||
\GPcolortrue | |||
}{}% | |||
\@ifundefined{ifGPblacktext}{% | |||
\newif\ifGPblacktext | |||
\GPblacktexttrue | |||
}{}% | |||
% define a \g@addto@macro without @ in the name: | |||
\let\gplgaddtomacro\g@addto@macro | |||
% define empty templates for all commands taking text: | |||
\gdef\gplbacktext{}% | |||
\gdef\gplfronttext{}% | |||
\makeatother | |||
\ifGPblacktext | |||
% no textcolor at all | |||
\def\colorrgb#1{}% | |||
\def\colorgray#1{}% | |||
\else | |||
% gray or color? | |||
\ifGPcolor | |||
\def\colorrgb#1{\color[rgb]{#1}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color[rgb]{1,0,0}}% | |||
\expandafter\def\csname LT1\endcsname{\color[rgb]{0,1,0}}% | |||
\expandafter\def\csname LT2\endcsname{\color[rgb]{0,0,1}}% | |||
\expandafter\def\csname LT3\endcsname{\color[rgb]{1,0,1}}% | |||
\expandafter\def\csname LT4\endcsname{\color[rgb]{0,1,1}}% | |||
\expandafter\def\csname LT5\endcsname{\color[rgb]{1,1,0}}% | |||
\expandafter\def\csname LT6\endcsname{\color[rgb]{0,0,0}}% | |||
\expandafter\def\csname LT7\endcsname{\color[rgb]{1,0.3,0}}% | |||
\expandafter\def\csname LT8\endcsname{\color[rgb]{0.5,0.5,0.5}}% | |||
\else | |||
% gray | |||
\def\colorrgb#1{\color{black}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color{black}}% | |||
\expandafter\def\csname LT1\endcsname{\color{black}}% | |||
\expandafter\def\csname LT2\endcsname{\color{black}}% | |||
\expandafter\def\csname LT3\endcsname{\color{black}}% | |||
\expandafter\def\csname LT4\endcsname{\color{black}}% | |||
\expandafter\def\csname LT5\endcsname{\color{black}}% | |||
\expandafter\def\csname LT6\endcsname{\color{black}}% | |||
\expandafter\def\csname LT7\endcsname{\color{black}}% | |||
\expandafter\def\csname LT8\endcsname{\color{black}}% | |||
\fi | |||
\fi | |||
\setlength{\unitlength}{0.0500bp}% | |||
\begin{picture}(2590.00,2590.00)% | |||
\gplgaddtomacro\gplbacktext{% | |||
}% | |||
\gplgaddtomacro\gplfronttext{% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\csname LTb\endcsname% | |||
\put(130,104){\makebox(0,0){\strut{}-0.1}}% | |||
\csname LTb\endcsname% | |||
\put(596,104){\makebox(0,0){\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(1062,104){\makebox(0,0){\strut{} 0.1}}% | |||
\csname LTb\endcsname% | |||
\put(1528,104){\makebox(0,0){\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(1994,104){\makebox(0,0){\strut{} 0.3}}% | |||
\csname LTb\endcsname% | |||
\put(2460,104){\makebox(0,0){\strut{} 0.4}}% | |||
\csname LTb\endcsname% | |||
\put(-42,2460){\makebox(0,0)[r]{\strut{}-0.1}}% | |||
\csname LTb\endcsname% | |||
\put(-42,2046){\makebox(0,0)[r]{\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1632){\makebox(0,0)[r]{\strut{} 0.1}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1218){\makebox(0,0)[r]{\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(-42,804){\makebox(0,0)[r]{\strut{} 0.3}}% | |||
\csname LTb\endcsname% | |||
\put(-42,390){\makebox(0,0)[r]{\strut{} 0.4}}% | |||
}% | |||
\gplbacktext | |||
\put(0,0){\includegraphics{fs-histo}}% | |||
\gplfronttext | |||
\end{picture}% | |||
\endgroup |
@@ -0,0 +1,388 @@ | |||
% GNUPLOT: LaTeX picture with Postscript | |||
\begingroup | |||
\makeatletter | |||
\providecommand\color[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package color not loaded in conjunction with | |||
terminal option `colourtext'% | |||
}{See the gnuplot documentation for explanation.% | |||
}{Either use 'blacktext' in gnuplot or load the package | |||
color.sty in LaTeX.}% | |||
\renewcommand\color[2][]{}% | |||
}% | |||
\providecommand\includegraphics[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package graphicx or graphics not loaded% | |||
}{See the gnuplot documentation for explanation.% | |||
}{The gnuplot epslatex terminal needs graphicx.sty or graphics.sty.}% | |||
\renewcommand\includegraphics[2][]{}% | |||
}% | |||
\providecommand\rotatebox[2]{#2}% | |||
\@ifundefined{ifGPcolor}{% | |||
\newif\ifGPcolor | |||
\GPcolortrue | |||
}{}% | |||
\@ifundefined{ifGPblacktext}{% | |||
\newif\ifGPblacktext | |||
\GPblacktexttrue | |||
}{}% | |||
% define a \g@addto@macro without @ in the name: | |||
\let\gplgaddtomacro\g@addto@macro | |||
% define empty templates for all commands taking text: | |||
\gdef\gplbacktext{}% | |||
\gdef\gplfronttext{}% | |||
\makeatother | |||
\ifGPblacktext | |||
% no textcolor at all | |||
\def\colorrgb#1{}% | |||
\def\colorgray#1{}% | |||
\else | |||
% gray or color? | |||
\ifGPcolor | |||
\def\colorrgb#1{\color[rgb]{#1}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color[rgb]{1,0,0}}% | |||
\expandafter\def\csname LT1\endcsname{\color[rgb]{0,1,0}}% | |||
\expandafter\def\csname LT2\endcsname{\color[rgb]{0,0,1}}% | |||
\expandafter\def\csname LT3\endcsname{\color[rgb]{1,0,1}}% | |||
\expandafter\def\csname LT4\endcsname{\color[rgb]{0,1,1}}% | |||
\expandafter\def\csname LT5\endcsname{\color[rgb]{1,1,0}}% | |||
\expandafter\def\csname LT6\endcsname{\color[rgb]{0,0,0}}% | |||
\expandafter\def\csname LT7\endcsname{\color[rgb]{1,0.3,0}}% | |||
\expandafter\def\csname LT8\endcsname{\color[rgb]{0.5,0.5,0.5}}% | |||
\else | |||
% gray | |||
\def\colorrgb#1{\color{black}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color{black}}% | |||
\expandafter\def\csname LT1\endcsname{\color{black}}% | |||
\expandafter\def\csname LT2\endcsname{\color{black}}% | |||
\expandafter\def\csname LT3\endcsname{\color{black}}% | |||
\expandafter\def\csname LT4\endcsname{\color{black}}% | |||
\expandafter\def\csname LT5\endcsname{\color{black}}% | |||
\expandafter\def\csname LT6\endcsname{\color{black}}% | |||
\expandafter\def\csname LT7\endcsname{\color{black}}% | |||
\expandafter\def\csname LT8\endcsname{\color{black}}% | |||
\fi | |||
\fi | |||
\setlength{\unitlength}{0.0500bp}% | |||
\begin{picture}(2590.00,2590.00)% | |||
\gplgaddtomacro\gplbacktext{% | |||
}% | |||
\gplgaddtomacro\gplfronttext{% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\csname LTb\endcsname% | |||
\put(363,104){\makebox(0,0){\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(829,104){\makebox(0,0){\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(1295,104){\makebox(0,0){\strut{} 0.4}}% | |||
\csname LTb\endcsname% | |||
\put(1761,104){\makebox(0,0){\strut{} 0.6}}% | |||
\csname LTb\endcsname% | |||
\put(2227,104){\makebox(0,0){\strut{} 0.8}}% | |||
\csname LTb\endcsname% | |||
\put(-42,2253){\makebox(0,0)[r]{\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1839){\makebox(0,0)[r]{\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1425){\makebox(0,0)[r]{\strut{} 0.4}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1011){\makebox(0,0)[r]{\strut{} 0.6}}% | |||
\csname LTb\endcsname% | |||
\put(-42,597){\makebox(0,0)[r]{\strut{} 0.8}}% | |||
}% | |||
\gplbacktext | |||
\put(0,0){\includegraphics{jajuni-histo}}% | |||
\gplfronttext | |||
\end{picture}% | |||
\endgroup |
@@ -0,0 +1,139 @@ | |||
% GNUPLOT: LaTeX picture with Postscript | |||
\begingroup | |||
\makeatletter | |||
\providecommand\color[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package color not loaded in conjunction with | |||
terminal option `colourtext'% | |||
}{See the gnuplot documentation for explanation.% | |||
}{Either use 'blacktext' in gnuplot or load the package | |||
color.sty in LaTeX.}% | |||
\renewcommand\color[2][]{}% | |||
}% | |||
\providecommand\includegraphics[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package graphicx or graphics not loaded% | |||
}{See the gnuplot documentation for explanation.% | |||
}{The gnuplot epslatex terminal needs graphicx.sty or graphics.sty.}% | |||
\renewcommand\includegraphics[2][]{}% | |||
}% | |||
\providecommand\rotatebox[2]{#2}% | |||
\@ifundefined{ifGPcolor}{% | |||
\newif\ifGPcolor | |||
\GPcolortrue | |||
}{}% | |||
\@ifundefined{ifGPblacktext}{% | |||
\newif\ifGPblacktext | |||
\GPblacktexttrue | |||
}{}% | |||
% define a \g@addto@macro without @ in the name: | |||
\let\gplgaddtomacro\g@addto@macro | |||
% define empty templates for all commands taking text: | |||
\gdef\gplbacktext{}% | |||
\gdef\gplfronttext{}% | |||
\makeatother | |||
\ifGPblacktext | |||
% no textcolor at all | |||
\def\colorrgb#1{}% | |||
\def\colorgray#1{}% | |||
\else | |||
% gray or color? | |||
\ifGPcolor | |||
\def\colorrgb#1{\color[rgb]{#1}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color[rgb]{1,0,0}}% | |||
\expandafter\def\csname LT1\endcsname{\color[rgb]{0,1,0}}% | |||
\expandafter\def\csname LT2\endcsname{\color[rgb]{0,0,1}}% | |||
\expandafter\def\csname LT3\endcsname{\color[rgb]{1,0,1}}% | |||
\expandafter\def\csname LT4\endcsname{\color[rgb]{0,1,1}}% | |||
\expandafter\def\csname LT5\endcsname{\color[rgb]{1,1,0}}% | |||
\expandafter\def\csname LT6\endcsname{\color[rgb]{0,0,0}}% | |||
\expandafter\def\csname LT7\endcsname{\color[rgb]{1,0.3,0}}% | |||
\expandafter\def\csname LT8\endcsname{\color[rgb]{0.5,0.5,0.5}}% | |||
\else | |||
% gray | |||
\def\colorrgb#1{\color{black}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color{black}}% | |||
\expandafter\def\csname LT1\endcsname{\color{black}}% | |||
\expandafter\def\csname LT2\endcsname{\color{black}}% | |||
\expandafter\def\csname LT3\endcsname{\color{black}}% | |||
\expandafter\def\csname LT4\endcsname{\color{black}}% | |||
\expandafter\def\csname LT5\endcsname{\color{black}}% | |||
\expandafter\def\csname LT6\endcsname{\color{black}}% | |||
\expandafter\def\csname LT7\endcsname{\color{black}}% | |||
\expandafter\def\csname LT8\endcsname{\color{black}}% | |||
\fi | |||
\fi | |||
\setlength{\unitlength}{0.0500bp}% | |||
\begin{picture}(3600.00,2880.00)% | |||
\gplgaddtomacro\gplbacktext{% | |||
}% | |||
\gplgaddtomacro\gplfronttext{% | |||
\csname LTb\endcsname% | |||
\put(-695,944){\makebox(0,0)[r]{\strut{}-1}}% | |||
\csname LTb\endcsname% | |||
\put(-513,866){\makebox(0,0)[r]{\strut{}-0.8}}% | |||
\csname LTb\endcsname% | |||
\put(-332,787){\makebox(0,0)[r]{\strut{}-0.6}}% | |||
\csname LTb\endcsname% | |||
\put(-151,709){\makebox(0,0)[r]{\strut{}-0.4}}% | |||
\csname LTb\endcsname% | |||
\put(30,631){\makebox(0,0)[r]{\strut{}-0.2}}% | |||
\csname LTb\endcsname% | |||
\put(211,552){\makebox(0,0)[r]{\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(392,474){\makebox(0,0)[r]{\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(574,396){\makebox(0,0)[r]{\strut{} 0.4}}% | |||
\csname LTb\endcsname% | |||
\put(755,317){\makebox(0,0)[r]{\strut{} 0.6}}% | |||
\csname LTb\endcsname% | |||
\put(936,239){\makebox(0,0)[r]{\strut{} 0.8}}% | |||
\csname LTb\endcsname% | |||
\put(1117,161){\makebox(0,0)[r]{\strut{} 1}}% | |||
\csname LTb\endcsname% | |||
\put(1437,188){\makebox(0,0){\strut{}-1}}% | |||
\csname LTb\endcsname% | |||
\put(1706,241){\makebox(0,0){\strut{}-0.8}}% | |||
\csname LTb\endcsname% | |||
\put(1973,294){\makebox(0,0){\strut{}-0.6}}% | |||
\csname LTb\endcsname% | |||
\put(2242,347){\makebox(0,0){\strut{}-0.4}}% | |||
\csname LTb\endcsname% | |||
\put(2511,399){\makebox(0,0){\strut{}-0.2}}% | |||
\csname LTb\endcsname% | |||
\put(2779,452){\makebox(0,0){\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(3048,505){\makebox(0,0){\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(3316,558){\makebox(0,0){\strut{} 0.4}}% | |||
\csname LTb\endcsname% | |||
\put(3585,611){\makebox(0,0){\strut{} 0.6}}% | |||
\csname LTb\endcsname% | |||
\put(3854,664){\makebox(0,0){\strut{} 0.8}}% | |||
\csname LTb\endcsname% | |||
\put(4122,716){\makebox(0,0){\strut{} 1}}% | |||
\put(-574,1554){\makebox(0,0)[r]{\strut{} 0.2}}% | |||
\put(-574,1660){\makebox(0,0)[r]{\strut{} 0.4}}% | |||
\put(-574,1766){\makebox(0,0)[r]{\strut{} 0.6}}% | |||
\put(-574,1872){\makebox(0,0)[r]{\strut{} 0.8}}% | |||
\put(-574,1978){\makebox(0,0)[r]{\strut{} 1}}% | |||
\put(-574,2084){\makebox(0,0)[r]{\strut{} 1.2}}% | |||
\put(-574,2190){\makebox(0,0)[r]{\strut{} 1.4}}% | |||
\put(-574,2296){\makebox(0,0)[r]{\strut{} 1.6}}% | |||
\put(-574,2402){\makebox(0,0)[r]{\strut{} 1.8}}% | |||
\put(-574,2508){\makebox(0,0)[r]{\strut{} 2}}% | |||
\put(-574,2614){\makebox(0,0)[r]{\strut{} 2.2}}% | |||
}% | |||
\gplbacktext | |||
\put(0,0){\includegraphics{lena-min}}% | |||
\gplfronttext | |||
\end{picture}% | |||
\endgroup |
@@ -0,0 +1,792 @@ | |||
/* test shit */ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include <stdlib.h> | |||
#include <math.h> | |||
#include <SDL_image.h> | |||
#define MAXWIDTH 512 | |||
#define MAXHEIGHT 512 | |||
#define true 1 | |||
#define false 0 | |||
int WIDTH, HEIGHT; | |||
static inline float get(float *src, int x, int y) | |||
{ | |||
return src[y * WIDTH + x]; | |||
} | |||
static inline void put(float *src, int x, int y, float p) | |||
{ | |||
src[y * WIDTH + x] = p; | |||
} | |||
static float *new(void) | |||
{ | |||
return malloc(WIDTH * HEIGHT * sizeof(float)); | |||
} | |||
static float *copy(float *src) | |||
{ | |||
float *dest = malloc(WIDTH * HEIGHT * sizeof(float)); | |||
memcpy(dest, src, WIDTH * HEIGHT * sizeof(float)); | |||
return dest; | |||
} | |||
#define N 5 | |||
#define NN ((N * 2 + 1)) | |||
static void makegauss(float mat[NN][NN], float sigma, float dx, float dy) | |||
{ | |||
float t = 0; | |||
int i, j; | |||
sigma = 2. * sigma * sigma; | |||
for(j = 0; j < NN; j++) | |||
for(i = 0; i < NN; i++) | |||
{ | |||
float a = (float)(i - N) + dx; | |||
float b = (float)(j - N) + dy; | |||
mat[i][j] = pow(M_E, - (a * a + b * b) / sigma); | |||
t += mat[i][j]; | |||
} | |||
for(j = 0; j < NN; j++) | |||
for(i = 0; i < NN; i++) | |||
mat[i][j] /= t; | |||
} | |||
static float *gauss(float *src, float mat[NN][NN]) | |||
{ | |||
float *dest = new(); | |||
int x, y, i, j; | |||
for(y = N; y < HEIGHT - N; y++) | |||
for(x = N; x < WIDTH - N; x++) | |||
{ | |||
float p = 0; | |||
for(j = 0; j < NN; j++) | |||
for(i = 0; i < NN; i++) | |||
p += get(src, x + i - N, y + j - N) * mat[i][j]; | |||
put(dest, x, y, p); | |||
} | |||
return dest; | |||
} | |||
static float *fullgauss(float *src, float mat[NN][NN]) | |||
{ | |||
float *dest = new(); | |||
int x, y, i, j; | |||
for(y = 0; y < HEIGHT; y++) | |||
for(x = 0; x < WIDTH; x++) | |||
{ | |||
float p = 0; | |||
for(j = 0; j < NN; j++) | |||
for(i = 0; i < NN; i++) | |||
if(x + i >= N && x + i < WIDTH + N | |||
&& y + j >= N && y + j < HEIGHT + N) | |||
p += get(src, x + i - N, y + j - N) * mat[i][j]; | |||
put(dest, x, y, p); | |||
} | |||
return dest; | |||
} | |||
static float fulldist(float *p1, float *p2) | |||
{ | |||
float error = 0.; | |||
int x, y; | |||
for(y = 0; y < HEIGHT; y++) | |||
for(x = 0; x < WIDTH; x++) | |||
{ | |||
float t = get(p1, x, y) - get(p2, x, y); | |||
error += t * t; | |||
} | |||
return error / (WIDTH * HEIGHT); | |||
} | |||
static float dist(float *p1, float *p2) | |||
{ | |||
float error = 0.; | |||
int x, y; | |||
for(y = N; y < HEIGHT - N; y++) | |||
for(x = N; x < WIDTH - N; x++) | |||
{ | |||
float t = get(p1, x, y) - get(p2, x, y); | |||
error += t * t; | |||
} | |||
return error / ((WIDTH - N) * (HEIGHT - N)); | |||
} | |||
static float *load(char *name) | |||
{ | |||
SDL_Surface *tmp, *surface; | |||
uint32_t *pixels; | |||
float *floats; | |||
int x, y; | |||
tmp = IMG_Load(name); | |||
if(!tmp) | |||
return NULL; | |||
WIDTH = tmp->w > MAXWIDTH ? MAXWIDTH : tmp->w; | |||
HEIGHT = tmp->h > MAXHEIGHT ? MAXHEIGHT : tmp->h; | |||
floats = malloc(WIDTH * HEIGHT * sizeof(float)); | |||
if(!floats) | |||
return NULL; | |||
surface = SDL_CreateRGBSurface(SDL_SWSURFACE, WIDTH, HEIGHT, 32, | |||
0xff0000, 0xff00, 0xff, 0x0); | |||
pixels = (uint32_t *)surface->pixels; | |||
SDL_BlitSurface(tmp, NULL, surface, NULL); | |||
SDL_FreeSurface(tmp); | |||
for(y = 0; y < HEIGHT; y++) | |||
for(x = 0; x < WIDTH; x++) | |||
{ | |||
int green = (pixels[y * surface->pitch / 4 + x] >> 8) & 0xff; | |||
put(floats, x, y, (float)green / 0xff); | |||
} | |||
return floats; | |||
} | |||
static void save(float *src, char *name) | |||
{ | |||
SDL_Surface *surface; | |||
uint32_t *pixels; | |||
int x, y; | |||
surface = SDL_CreateRGBSurface(SDL_SWSURFACE, WIDTH, HEIGHT, 32, | |||
0xff0000, 0xff00, 0xff, 0x0); | |||
pixels = (uint32_t *)surface->pixels; | |||
for(y = 0; y < HEIGHT; y++) | |||
for(x = 0; x < WIDTH; x++) | |||
{ | |||
float p = 255 * get(src, x, y); | |||
uint32_t i = p < 0 ? 0 : p > 255 ? 255 : p; | |||
pixels[surface->pitch / 4 * y + x] = (i << 16) | (i << 8) | i; | |||
} | |||
SDL_SaveBMP(surface, name); | |||
} | |||
static float *ostromoukhov(float *src) | |||
{ | |||
static int const table[][3] = | |||
{ | |||
{13, 0, 5}, {13, 0, 5}, {21, 0, 10}, {7, 0, 4}, | |||
{8, 0, 5}, {47, 3, 28}, {23, 3, 13}, {15, 3, 8}, | |||
{22, 6, 11}, {43, 15, 20}, {7, 3, 3}, {501, 224, 211}, | |||
{249, 116, 103}, {165, 80, 67}, {123, 62, 49}, {489, 256, 191}, | |||
{81, 44, 31}, {483, 272, 181}, {60, 35, 22}, {53, 32, 19}, | |||
{237, 148, 83}, {471, 304, 161}, {3, 2, 1}, {481, 314, 185}, | |||
{354, 226, 155}, {1389, 866, 685}, {227, 138, 125}, {267, 158, 163}, | |||
{327, 188, 220}, {61, 34, 45}, {627, 338, 505}, {1227, 638, 1075}, | |||
{20, 10, 19}, {1937, 1000, 1767}, {977, 520, 855}, {657, 360, 551}, | |||
{71, 40, 57}, {2005, 1160, 1539}, {337, 200, 247}, {2039, 1240, 1425}, | |||
{257, 160, 171}, {691, 440, 437}, {1045, 680, 627}, {301, 200, 171}, | |||
{177, 120, 95}, {2141, 1480, 1083}, {1079, 760, 513}, {725, 520, 323}, | |||
{137, 100, 57}, {2209, 1640, 855}, {53, 40, 19}, {2243, 1720, 741}, | |||
{565, 440, 171}, {759, 600, 209}, {1147, 920, 285}, {2311, 1880, 513}, | |||
{97, 80, 19}, {335, 280, 57}, {1181, 1000, 171}, {793, 680, 95}, | |||
{599, 520, 57}, {2413, 2120, 171}, {405, 360, 19}, {2447, 2200, 57}, | |||
{11, 10, 0}, {158, 151, 3}, {178, 179, 7}, {1030, 1091, 63}, | |||
{248, 277, 21}, {318, 375, 35}, {458, 571, 63}, {878, 1159, 147}, | |||
{5, 7, 1}, {172, 181, 37}, {97, 76, 22}, {72, 41, 17}, | |||
{119, 47, 29}, {4, 1, 1}, {4, 1, 1}, {4, 1, 1}, | |||
{4, 1, 1}, {4, 1, 1}, {4, 1, 1}, {4, 1, 1}, | |||
{4, 1, 1}, {4, 1, 1}, {65, 18, 17}, {95, 29, 26}, | |||
{185, 62, 53}, {30, 11, 9}, {35, 14, 11}, {85, 37, 28}, | |||
{55, 26, 19}, {80, 41, 29}, {155, 86, 59}, {5, 3, 2}, | |||
{5, 3, 2}, {5, 3, 2}, {5, 3, 2}, {5, 3, 2}, | |||
{5, 3, 2}, {5, 3, 2}, {5, 3, 2}, {5, 3, 2}, | |||
{5, 3, 2}, {5, 3, 2}, {5, 3, 2}, {5, 3, 2}, | |||
{305, 176, 119}, {155, 86, 59}, {105, 56, 39}, {80, 41, 29}, | |||
{65, 32, 23}, {55, 26, 19}, {335, 152, 113}, {85, 37, 28}, | |||
{115, 48, 37}, {35, 14, 11}, {355, 136, 109}, {30, 11, 9}, | |||
{365, 128, 107}, {185, 62, 53}, {25, 8, 7}, {95, 29, 26}, | |||
{385, 112, 103}, {65, 18, 17}, {395, 104, 101}, {4, 1, 1} | |||
}; | |||
float *dest = new(); | |||
float *tmp = copy(src); | |||
int x, y; | |||
for(y = 0; y < HEIGHT; y++) | |||
{ | |||
for(x = 0; x < WIDTH; x++) | |||
{ | |||
int x1 = (y & 1) ? WIDTH - 1 - x + 1 : x - 1; | |||
int x2 = (y & 1) ? WIDTH - 1 - x : x; | |||
int x3 = (y & 1) ? WIDTH - 1 - x - 1 : x + 1; | |||
float p = get(tmp, x2, y); | |||
float q = p > 0.5 ? 1. : 0.; | |||
float error = (p - q); | |||
int i = p * 255.9999; | |||
put(dest, x2, y, q); | |||
if(i > 127) | |||
i = 255 - i; | |||
if(i < 0) | |||
i = 0; | |||
error /= table[i][0] + table[i][1] + table[i][2]; | |||
if(x < WIDTH - 1) | |||
put(tmp, x3, y, get(tmp, x3, y) + error * table[i][0]); | |||
if(y < HEIGHT - 1) | |||
{ | |||
if(x > 0) | |||
put(tmp, x1, y + 1, | |||
get(tmp, x1, y + 1) + error * table[i][1]); | |||
put(tmp, x2, y + 1, get(tmp, x2, y + 1) + error * table[i][2]); | |||
} | |||
} | |||
} | |||
free(tmp); | |||
return dest; | |||
} | |||
/* Dither using error diffusion and Floyd-Steinberg-like coefficients: | |||
X a b | |||
c d e f g | |||
h i j k l | |||
*/ | |||
static float *ed(float *src, int serpentine, | |||
int a, int b, int c, int d, int e, int f, | |||
int g, int h, int i, int j, int k, int l) | |||
{ | |||
float *dest = new(); | |||
float *tmp = copy(src); | |||
int x, y, n; | |||
n = a + b + c + d + e + f + g + h + i + j + k + l; | |||
for(y = 0; y < HEIGHT; y++) | |||
{ | |||
int swap = serpentine && (y & 1); | |||
for(x = 0; x < WIDTH; x++) | |||
{ | |||
int x0 = swap ? WIDTH - 1 - x + 2 : x - 2; | |||
int x1 = swap ? WIDTH - 1 - x + 1 : x - 1; | |||
int x2 = swap ? WIDTH - 1 - x : x; | |||
int x3 = swap ? WIDTH - 1 - x - 1 : x + 1; | |||
int x4 = swap ? WIDTH - 1 - x - 2 : x + 2; | |||
float p = get(tmp, x2, y); | |||
float q = p > 0.5 ? 1. : 0.; | |||
float error = (p - q) / n; | |||
put(dest, x2, y, q); | |||
if(x < WIDTH - 1) | |||
put(tmp, x3, y, get(tmp, x3, y) + error * a); | |||
if(x < WIDTH - 2) | |||
put(tmp, x4, y, get(tmp, x4, y) + error * b); | |||
if(y < HEIGHT - 1) | |||
{ | |||
if(x > 0) | |||
{ | |||
put(tmp, x1, y + 1, | |||
get(tmp, x1, y + 1) + error * d); | |||
if(x > 1) | |||
put(tmp, x0, y + 1, | |||
get(tmp, x0, y + 1) + error * c); | |||
} | |||
put(tmp, x2, y + 1, get(tmp, x2, y + 1) + error * e); | |||
if(x < WIDTH - 1) | |||
{ | |||
put(tmp, x3, y + 1, | |||
get(tmp, x3, y + 1) + error * f); | |||
if(x < WIDTH - 2) | |||
put(tmp, x4, y + 1, | |||
get(tmp, x4, y + 1) + error * g); | |||
} | |||
} | |||
if(y < HEIGHT - 2) | |||
{ | |||
if(x > 0) | |||
{ | |||
put(tmp, x1, y + 2, | |||
get(tmp, x1, y + 2) + error * h); | |||
if(x > 1) | |||
put(tmp, x0, y + 2, | |||
get(tmp, x0, y + 2) + error * i); | |||
} | |||
put(tmp, x2, y + 2, get(tmp, x2, y + 2) + error * j); | |||
if(x < WIDTH - 1) | |||
{ | |||
put(tmp, x3, y + 2, | |||
get(tmp, x3, y + 2) + error * k); | |||
if(x < WIDTH - 2) | |||
put(tmp, x4, y + 2, | |||
get(tmp, x4, y + 2) + error * l); | |||
} | |||
} | |||
} | |||
} | |||
free(tmp); | |||
return dest; | |||
} | |||
/* XXX */ | |||
static float *dbs(float *src, float *orig, float sigma, float dx, float dy) | |||
{ | |||
float mat[NN][NN]; | |||
float *dest, *tmp, *tmp2; | |||
float error; | |||
makegauss(mat, sigma, 0., 0.); | |||
tmp = fullgauss(src, mat); | |||
makegauss(mat, sigma, dx, dy); | |||
dest = copy(orig); | |||
tmp2 = fullgauss(dest, mat); | |||
error = dist(tmp, tmp2); | |||
for(;;) | |||
{ | |||
int changes = 0; | |||
int x, y, i, j, n; | |||
for(y = 0; y < HEIGHT; y++) | |||
for(x = 0; x < WIDTH; x++) | |||
{ | |||
float d, d2, e, best = 0.; | |||
int opx = -1, opy = -1; | |||
d = get(dest, x, y); | |||
/* Compute the effect of a toggle */ | |||
e = 0.; | |||
for(j = -N; j < N + 1; j++) | |||
{ | |||
if(y + j < 0 || y + j >= HEIGHT) | |||
continue; | |||
for(i = -N; i < N + 1; i++) | |||
{ | |||
float m, p, q1, q2; | |||
if(x + i < 0 || x + i >= WIDTH) | |||
continue; | |||
m = mat[i + N][j + N]; | |||
p = get(tmp, x + i, y + j); | |||
q1 = get(tmp2, x + i, y + j); | |||
q2 = q1 - m * d + m * (1. - d); | |||
e += (q1 - p) * (q1 - p) - (q2 - p) * (q2 - p); | |||
} | |||
} | |||
if(e > best) | |||
{ | |||
best = e; | |||
opx = opy = 0; | |||
} | |||
/* Compute the effect of swaps */ | |||
for(n = 0; n < 8; n++) | |||
{ | |||
static int const step[] = | |||
{ 0, 1, 0, -1, -1, 0, 1, 0, -1, -1, -1, 1, 1, -1, 1, 1 }; | |||
int idx = step[n * 2], idy = step[n * 2 + 1]; | |||
if(y + idy < 0 || y + idy >= HEIGHT | |||
|| x + idx < 0 || x + idx >= WIDTH) | |||
continue; | |||
d2 = get(dest, x + idx, y + idy); | |||
if(d2 == d) | |||
continue; | |||
e = 0.; | |||
for(j = -N; j < N + 1; j++) | |||
{ | |||
if(y + j < 0 || y + j >= HEIGHT) | |||
continue; | |||
if(j - idy + N < 0 || j - idy + N >= NN) | |||
continue; | |||
for(i = -N; i < N + 1; i++) | |||
{ | |||
float ma, mb, p, q1, q2; | |||
if(x + i < 0 || x + i >= WIDTH) | |||
continue; | |||
if(i - idx + N < 0 || i - idx + N >= NN) | |||
continue; | |||
ma = mat[i + N][j + N]; | |||
mb = mat[i - idx + N][j - idy + N]; | |||
p = get(tmp, x + i, y + j); | |||
q1 = get(tmp2, x + i, y + j); | |||
q2 = q1 - ma * d + ma * d2 - mb * d2 + mb * d; | |||
e += (q1 - p) * (q1 - p) - (q2 - p) * (q2 - p); | |||
} | |||
} | |||
if(e > best) | |||
{ | |||
best = e; | |||
opx = idx; | |||
opy = idy; | |||
} | |||
} | |||
/* Apply the change if interesting */ | |||
if(best <= 0.) | |||
continue; | |||
if(opx || opy) | |||
{ | |||
d2 = get(dest, x + opx, y + opy); | |||
put(dest, x + opx, y + opy, d); | |||
} | |||
else | |||
d2 = 1. - d; | |||
put(dest, x, y, d2); | |||
for(j = -N; j < N + 1; j++) | |||
for(i = -N; i < N + 1; i++) | |||
{ | |||
float m = mat[i + N][j + N]; | |||
if(y + j >= 0 && y + j < HEIGHT | |||
&& x + i >= 0 && x + i < WIDTH) | |||
{ | |||
float t = get(tmp2, x + i, y + j); | |||
put(tmp2, x + i, y + j, t + m * (d2 - d)); | |||
} | |||
if((opx || opy) && y + opy + j >= 0 && y + opy + j < HEIGHT | |||
&& x + opx + i >= 0 && x + opx + i < WIDTH) | |||
{ | |||
float t = get(tmp2, x + opx + i, y + opy + j); | |||
put(tmp2, x + opx + i, y + opy + j, t + m * (d - d2)); | |||
} | |||
} | |||
changes++; | |||
} | |||
fprintf(stderr, "did %i changes\n", changes); | |||
if(changes == 0) | |||
break; | |||
} | |||
free(tmp); | |||
free(tmp2); | |||
return dest; | |||
} | |||
static void study(float *src, float *dest, float sigma, float precision) | |||
{ | |||
# define Z 3 | |||
float mat[NN][NN]; | |||
float *tmp, *tmp2; | |||
float e0, best, fx = -1., fy = -1., step = 2.; | |||
int dx, dy; | |||
makegauss(mat, sigma, 0., 0.); | |||
tmp = gauss(src, mat); | |||
tmp2 = gauss(dest, mat); | |||
e0 = dist(tmp, tmp2); | |||
free(tmp2); | |||
while(step > precision) | |||
{ | |||
float bfx = 0., bfy = 0., e; | |||
best = 9999.; | |||
for(dy = 0; dy <= Z; dy++) | |||
for(dx = 0; dx <= Z; dx++) | |||
{ | |||
makegauss(mat, sigma, fx + step * dx / Z, fy + step * dy / Z); | |||
tmp2 = gauss(dest, mat); | |||
e = dist(tmp, tmp2); | |||
free(tmp2); | |||
if(e < best) | |||
{ | |||
best = e; | |||
bfx = fx + step * dx / Z; | |||
bfy = fy + step * dy / Z; | |||
} | |||
} | |||
fx = bfx - step / Z; | |||
fy = bfy - step / Z; | |||
step = step * 2 / Z; | |||
} | |||
free(tmp); | |||
printf("%g -> %g for %g %g\n", 1000 * e0, 1000 * best, fx, fy); | |||
fflush(stdout); | |||
} | |||
static float *merge(float *im1, float *im2, float t) | |||
{ | |||
float *dest = new(); | |||
int x, y; | |||
for(y = 0; y < HEIGHT; y++) | |||
for(x = 0; x < WIDTH; x++) | |||
put(dest, x, y, t * get(im1, x, y) + (1. - t) * get(im2, x, y)); | |||
return dest; | |||
} | |||
int main(int argc, char *argv[]) | |||
{ | |||
float mat0[NN][NN]; | |||
float mat[NN][NN]; | |||
float *src, *src2, *dest, *tmp, *tmp2; | |||
float sigma; | |||
int dx, dy, a, b, c, d, i; | |||
if(argc < 2) | |||
return 1; | |||
src = load(argv[1]); | |||
if(!src) | |||
return 2; | |||
#if 0 | |||
if(argc < 3) | |||
return 3; | |||
src2 = load(argv[2]); | |||
if(!src2) | |||
return 4; | |||
for(i = 0; i <= 100; i++) | |||
{ | |||
tmp = merge(src, src2, (float)i / 100.); | |||
dest = ed(tmp, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0); | |||
study(tmp, dest, 1.2, 0.001); | |||
free(dest); | |||
free(tmp); | |||
} | |||
free(src2); | |||
free(src); | |||
#endif | |||
#if 0 | |||
tmp = ed(src, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0); | |||
//dest = dbs(src, tmp, 0., 0.); | |||
dest = dbs(src, tmp, 0.20, 0.30); | |||
//dest = dbs(src, tmp, 0.158718, 0.283089); | |||
//dest = copy(tmp); | |||
free(tmp); | |||
study(src, dest, 1.2, 0.00001); | |||
save(dest, "output.bmp"); | |||
free(dest); | |||
#endif | |||
#if 0 | |||
//dest = ed(src, 5, 0, 0, 3, 5, 3, 0, 0, 0, 0, 0, 0); | |||
//dest = ed(src, false, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0); | |||
//dest = ed(src, true, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0); | |||
//dest = ed(src, true, 7, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0); | |||
//dest = ed(src, 7, 5, 3, 5, 7, 5, 3, 1, 3, 5, 3, 1); | |||
//dest = ed(src, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0); | |||
//dest = ed(src, 7, 0, 1, 4, 4, 0, 0, 0, 0, 0, 0, 0); | |||
//dest = ed(src, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0); | |||
//dest = ed(src, 2911, 0, 1373, 3457, 2258, 0, 0, 0, 0, 0, 0, 0); | |||
dest = ostromoukhov(src); | |||
//dest = ed(src, 7, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0); | |||
//printf("%s: ", argv[1]); | |||
//study(src, dest, 1.2, 0.001); | |||
save(dest, "output.bmp"); | |||
free(dest); | |||
#endif | |||
#if 0 | |||
# define STEP 32 | |||
dest = ed(src, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0); | |||
makegauss(mat, 1.2, 0., 0.); | |||
tmp = gauss(src, mat); | |||
for(dy = 0; dy < STEP; dy++) | |||
{ | |||
for(dx = 0; dx < STEP; dx++) | |||
{ | |||
float fy = 2. / STEP * (dy - STEP / 2.); | |||
float fx = 2. / STEP * (dx - STEP / 2.); | |||
makegauss(mat, 1.2, fx, fy); | |||
tmp2 = gauss(dest, mat); | |||
printf("%g %g %g\n", fy, fx, 1000. * dist(tmp, tmp2)); | |||
fflush(stdout); | |||
free(tmp2); | |||
} | |||
printf("\n"); | |||
} | |||
save(dest, "output.bmp"); | |||
#endif | |||
#if 0 | |||
makegauss(mat0, 1.2, 0, 0); | |||
for(a = 0; a <= 16; a++) | |||
for(b = 0; b <= 16; b++) | |||
for(c = 0; c <= 16; c++) | |||
for(d = 0; d <= 16; d++) | |||
{ | |||
float *tmp; | |||
if(a + b + c + d != 16) | |||
continue; | |||
#if 0 | |||
if(b > c) continue; | |||
if(d > c) continue; | |||
if(d > a) continue; | |||
#endif | |||
printf("%02d %02d %02d %02d: ", a, b, c, d); | |||
dest = ed(src, true, a, 0, 0, b, c, d, 0, 0, 0, 0, 0, 0); | |||
//dest = ed(src, false, a, 0, 0, b, c, d, 0, 0, 0, 0, 0, 0); | |||
//study(src, dest, 1.2, 0.01); | |||
tmp = gauss(src, mat0); | |||
tmp2 = gauss(dest, mat0); | |||
printf("%.5g\n", 1000. * dist(tmp, tmp2)); | |||
fflush(stdout); | |||
free(tmp); | |||
free(tmp2); | |||
free(dest); | |||
} | |||
#endif | |||
#if 0 | |||
tmp = gauss(src, 0., 0.); | |||
for(a = 0; a < 16; a++) | |||
for(b = 0; b < 16; b++) | |||
for(c = 0; c < 16; c++) | |||
for(d = 0; d < 16; d++) | |||
{ | |||
if(a + b + c + d != 16) | |||
continue; | |||
dest = ed(src, a, 0, 0, b, c, d, 0, 0, 0, 0, 0, 0); | |||
tmp2 = gauss(dest, 0., 0.); | |||
printf("%.5g: (%02d %02d %02d %02d)\n", | |||
1000. * dist(tmp, tmp2), a, b, c, d); | |||
free(dest); | |||
free(tmp2); | |||
} | |||
save(dest, "output.bmp"); | |||
#endif | |||
#if 0 | |||
printf("%s: ", argv[1]); | |||
makegauss(mat0, 1.2, 0, 0); | |||
tmp = gauss(src, mat0); | |||
dest = ed(src, false, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0); | |||
tmp2 = gauss(dest, mat0); | |||
printf("%.5g ", 1000. * dist(tmp, tmp2)); | |||
free(tmp2); | |||
makegauss(mat, 1.2, 0.16, 0.28); | |||
tmp2 = gauss(dest, mat); | |||
printf("%.5g ", 1000. * dist(tmp, tmp2)); | |||
free(tmp2); | |||
free(dest); | |||
dest = ed(src, false, 7, 5, 3, 5, 7, 5, 3, 1, 3, 5, 3, 1); | |||
tmp2 = gauss(dest, mat0); | |||
printf("%.5g ", 1000. * dist(tmp, tmp2)); | |||
free(tmp2); | |||
makegauss(mat, 1.2, 0.26, 0.76); | |||
tmp2 = gauss(dest, mat); | |||
printf("%.5g ", 1000. * dist(tmp, tmp2)); | |||
free(tmp2); | |||
free(dest); | |||
dest = ostromoukhov(src); | |||
tmp2 = gauss(dest, mat0); | |||
printf("%.5g ", 1000. * dist(tmp, tmp2)); | |||
free(tmp2); | |||
makegauss(mat, 1.2, 0.0, 0.19); | |||
tmp2 = gauss(dest, mat); | |||
printf("%.5g ", 1000. * dist(tmp, tmp2)); | |||
free(tmp2); | |||
free(dest); | |||
dest = ed(src, true, 2911, 0, 0, 1373, 3457, 2258, 0, 0, 0, 0, 0, 0); | |||
tmp2 = gauss(dest, mat0); | |||
printf("%.5g ", 1000. * dist(tmp, tmp2)); | |||
free(tmp2); | |||
makegauss(mat, 1.2, 0.0, 0.34); | |||
tmp2 = gauss(dest, mat); | |||
printf("%.5g ", 1000. * dist(tmp, tmp2)); | |||
free(tmp2); | |||
free(dest); | |||
printf("\n"); | |||
#endif | |||
#if 0 | |||
printf("%s\n", argv[1]); | |||
dest = ed(src, false, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0); | |||
study(src, dest, 1.2, 0.01); | |||
free(dest); | |||
dest = ed(src, false, 7, 5, 3, 5, 7, 5, 3, 1, 3, 5, 3, 1); | |||
study(src, dest, 1.2, 0.01); | |||
free(dest); | |||
dest = ostromoukhov(src); | |||
study(src, dest, 1.2, 0.01); | |||
free(dest); | |||
dest = ed(src, true, 2911, 0, 0, 1373, 3457, 2258, 0, 0, 0, 0, 0, 0); | |||
study(src, dest, 1.2, 0.01); | |||
free(dest); | |||
printf("\n"); | |||
#endif | |||
#if 0 | |||
//dest = ostromoukhov(src); | |||
//dest = ed(src, true, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0); | |||
tmp = new();//ed(src, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0); | |||
dest = dbs(src, tmp, 0., 0.); | |||
for(sigma = 0.8; sigma < 2; sigma *= 1.03) | |||
//for(sigma = 0.8; sigma < 2.; sigma *= 1.01) | |||
{ | |||
printf("%g ", sigma); | |||
study(src, dest, sigma, 0.01); | |||
} | |||
#endif | |||
tmp = new(); | |||
a = 0; | |||
for(sigma = 0.8; sigma < 2; sigma *= 1.03) | |||
{ | |||
char buf[1024]; | |||
printf("%i: %g\n", a, sigma); | |||
dest = dbs(src, tmp, sigma, 0., 0.); | |||
sprintf(buf, "output-dbs-%i.bmp", a++); | |||
save(dest, buf); | |||
} | |||
return 0; | |||
} | |||
@@ -0,0 +1,388 @@ | |||
% GNUPLOT: LaTeX picture with Postscript | |||
\begingroup | |||
\makeatletter | |||
\providecommand\color[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package color not loaded in conjunction with | |||
terminal option `colourtext'% | |||
}{See the gnuplot documentation for explanation.% | |||
}{Either use 'blacktext' in gnuplot or load the package | |||
color.sty in LaTeX.}% | |||
\renewcommand\color[2][]{}% | |||
}% | |||
\providecommand\includegraphics[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package graphicx or graphics not loaded% | |||
}{See the gnuplot documentation for explanation.% | |||
}{The gnuplot epslatex terminal needs graphicx.sty or graphics.sty.}% | |||
\renewcommand\includegraphics[2][]{}% | |||
}% | |||
\providecommand\rotatebox[2]{#2}% | |||
\@ifundefined{ifGPcolor}{% | |||
\newif\ifGPcolor | |||
\GPcolortrue | |||
}{}% | |||
\@ifundefined{ifGPblacktext}{% | |||
\newif\ifGPblacktext | |||
\GPblacktexttrue | |||
}{}% | |||
% define a \g@addto@macro without @ in the name: | |||
\let\gplgaddtomacro\g@addto@macro | |||
% define empty templates for all commands taking text: | |||
\gdef\gplbacktext{}% | |||
\gdef\gplfronttext{}% | |||
\makeatother | |||
\ifGPblacktext | |||
% no textcolor at all | |||
\def\colorrgb#1{}% | |||
\def\colorgray#1{}% | |||
\else | |||
% gray or color? | |||
\ifGPcolor | |||
\def\colorrgb#1{\color[rgb]{#1}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color[rgb]{1,0,0}}% | |||
\expandafter\def\csname LT1\endcsname{\color[rgb]{0,1,0}}% | |||
\expandafter\def\csname LT2\endcsname{\color[rgb]{0,0,1}}% | |||
\expandafter\def\csname LT3\endcsname{\color[rgb]{1,0,1}}% | |||
\expandafter\def\csname LT4\endcsname{\color[rgb]{0,1,1}}% | |||
\expandafter\def\csname LT5\endcsname{\color[rgb]{1,1,0}}% | |||
\expandafter\def\csname LT6\endcsname{\color[rgb]{0,0,0}}% | |||
\expandafter\def\csname LT7\endcsname{\color[rgb]{1,0.3,0}}% | |||
\expandafter\def\csname LT8\endcsname{\color[rgb]{0.5,0.5,0.5}}% | |||
\else | |||
% gray | |||
\def\colorrgb#1{\color{black}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color{black}}% | |||
\expandafter\def\csname LT1\endcsname{\color{black}}% | |||
\expandafter\def\csname LT2\endcsname{\color{black}}% | |||
\expandafter\def\csname LT3\endcsname{\color{black}}% | |||
\expandafter\def\csname LT4\endcsname{\color{black}}% | |||
\expandafter\def\csname LT5\endcsname{\color{black}}% | |||
\expandafter\def\csname LT6\endcsname{\color{black}}% | |||
\expandafter\def\csname LT7\endcsname{\color{black}}% | |||
\expandafter\def\csname LT8\endcsname{\color{black}}% | |||
\fi | |||
\fi | |||
\setlength{\unitlength}{0.0500bp}% | |||
\begin{picture}(2590.00,2590.00)% | |||
\gplgaddtomacro\gplbacktext{% | |||
}% | |||
\gplgaddtomacro\gplfronttext{% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\csname LTb\endcsname% | |||
\put(130,104){\makebox(0,0){\strut{}-0.5}}% | |||
\csname LTb\endcsname% | |||
\put(463,104){\makebox(0,0){\strut{}-0.4}}% | |||
\csname LTb\endcsname% | |||
\put(796,104){\makebox(0,0){\strut{}-0.3}}% | |||
\csname LTb\endcsname% | |||
\put(1129,104){\makebox(0,0){\strut{}-0.2}}% | |||
\csname LTb\endcsname% | |||
\put(1461,104){\makebox(0,0){\strut{}-0.1}}% | |||
\csname LTb\endcsname% | |||
\put(1794,104){\makebox(0,0){\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(2127,104){\makebox(0,0){\strut{} 0.1}}% | |||
\csname LTb\endcsname% | |||
\put(2460,104){\makebox(0,0){\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(-42,2460){\makebox(0,0)[r]{\strut{}-0.1}}% | |||
\csname LTb\endcsname% | |||
\put(-42,2164){\makebox(0,0)[r]{\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1868){\makebox(0,0)[r]{\strut{} 0.1}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1572){\makebox(0,0)[r]{\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1278){\makebox(0,0)[r]{\strut{} 0.3}}% | |||
\csname LTb\endcsname% | |||
\put(-42,982){\makebox(0,0)[r]{\strut{} 0.4}}% | |||
\csname LTb\endcsname% | |||
\put(-42,686){\makebox(0,0)[r]{\strut{} 0.5}}% | |||
\csname LTb\endcsname% | |||
\put(-42,390){\makebox(0,0)[r]{\strut{} 0.6}}% | |||
}% | |||
\gplbacktext | |||
\put(0,0){\includegraphics{optimum-histo}}% | |||
\gplfronttext | |||
\end{picture}% | |||
\endgroup |
@@ -0,0 +1,488 @@ | |||
% GNUPLOT: LaTeX picture with Postscript | |||
\begingroup | |||
\makeatletter | |||
\providecommand\color[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package color not loaded in conjunction with | |||
terminal option `colourtext'% | |||
}{See the gnuplot documentation for explanation.% | |||
}{Either use 'blacktext' in gnuplot or load the package | |||
color.sty in LaTeX.}% | |||
\renewcommand\color[2][]{}% | |||
}% | |||
\providecommand\includegraphics[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package graphicx or graphics not loaded% | |||
}{See the gnuplot documentation for explanation.% | |||
}{The gnuplot epslatex terminal needs graphicx.sty or graphics.sty.}% | |||
\renewcommand\includegraphics[2][]{}% | |||
}% | |||
\providecommand\rotatebox[2]{#2}% | |||
\@ifundefined{ifGPcolor}{% | |||
\newif\ifGPcolor | |||
\GPcolortrue | |||
}{}% | |||
\@ifundefined{ifGPblacktext}{% | |||
\newif\ifGPblacktext | |||
\GPblacktexttrue | |||
}{}% | |||
% define a \g@addto@macro without @ in the name: | |||
\let\gplgaddtomacro\g@addto@macro | |||
% define empty templates for all commands taking text: | |||
\gdef\gplbacktext{}% | |||
\gdef\gplfronttext{}% | |||
\makeatother | |||
\ifGPblacktext | |||
% no textcolor at all | |||
\def\colorrgb#1{}% | |||
\def\colorgray#1{}% | |||
\else | |||
% gray or color? | |||
\ifGPcolor | |||
\def\colorrgb#1{\color[rgb]{#1}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color[rgb]{1,0,0}}% | |||
\expandafter\def\csname LT1\endcsname{\color[rgb]{0,1,0}}% | |||
\expandafter\def\csname LT2\endcsname{\color[rgb]{0,0,1}}% | |||
\expandafter\def\csname LT3\endcsname{\color[rgb]{1,0,1}}% | |||
\expandafter\def\csname LT4\endcsname{\color[rgb]{0,1,1}}% | |||
\expandafter\def\csname LT5\endcsname{\color[rgb]{1,1,0}}% | |||
\expandafter\def\csname LT6\endcsname{\color[rgb]{0,0,0}}% | |||
\expandafter\def\csname LT7\endcsname{\color[rgb]{1,0.3,0}}% | |||
\expandafter\def\csname LT8\endcsname{\color[rgb]{0.5,0.5,0.5}}% | |||
\else | |||
% gray | |||
\def\colorrgb#1{\color{black}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color{black}}% | |||
\expandafter\def\csname LT1\endcsname{\color{black}}% | |||
\expandafter\def\csname LT2\endcsname{\color{black}}% | |||
\expandafter\def\csname LT3\endcsname{\color{black}}% | |||
\expandafter\def\csname LT4\endcsname{\color{black}}% | |||
\expandafter\def\csname LT5\endcsname{\color{black}}% | |||
\expandafter\def\csname LT6\endcsname{\color{black}}% | |||
\expandafter\def\csname LT7\endcsname{\color{black}}% | |||
\expandafter\def\csname LT8\endcsname{\color{black}}% | |||
\fi | |||
\fi | |||
\setlength{\unitlength}{0.0500bp}% | |||
\begin{picture}(2590.00,2590.00)% | |||
\gplgaddtomacro\gplbacktext{% | |||
}% | |||
\gplgaddtomacro\gplfronttext{% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\csname LTb\endcsname% | |||
\put(130,104){\makebox(0,0){\strut{}-0.2}}% | |||
\csname LTb\endcsname% | |||
\put(421,104){\makebox(0,0){\strut{}-0.15}}% | |||
\csname LTb\endcsname% | |||
\put(713,104){\makebox(0,0){\strut{}-0.1}}% | |||
\csname LTb\endcsname% | |||
\put(1004,104){\makebox(0,0){\strut{}-0.05}}% | |||
\csname LTb\endcsname% | |||
\put(1295,104){\makebox(0,0){\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(1586,104){\makebox(0,0){\strut{} 0.05}}% | |||
\csname LTb\endcsname% | |||
\put(1877,104){\makebox(0,0){\strut{} 0.1}}% | |||
\csname LTb\endcsname% | |||
\put(2169,104){\makebox(0,0){\strut{} 0.15}}% | |||
\csname LTb\endcsname% | |||
\put(2460,104){\makebox(0,0){\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(-42,2460){\makebox(0,0)[r]{\strut{}-0.1}}% | |||
\csname LTb\endcsname% | |||
\put(-42,2201){\makebox(0,0)[r]{\strut{}-0.05}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1942){\makebox(0,0)[r]{\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1683){\makebox(0,0)[r]{\strut{} 0.05}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1425){\makebox(0,0)[r]{\strut{} 0.1}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1167){\makebox(0,0)[r]{\strut{} 0.15}}% | |||
\csname LTb\endcsname% | |||
\put(-42,908){\makebox(0,0)[r]{\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(-42,649){\makebox(0,0)[r]{\strut{} 0.25}}% | |||
\csname LTb\endcsname% | |||
\put(-42,390){\makebox(0,0)[r]{\strut{} 0.3}}% | |||
}% | |||
\gplbacktext | |||
\put(0,0){\includegraphics{ostro-histo}}% | |||
\gplfronttext | |||
\end{picture}% | |||
\endgroup |
@@ -0,0 +1,486 @@ | |||
% This is LLNCS.DEM the demonstration file of | |||
% the LaTeX macro package from Springer-Verlag | |||
% for Lecture Notes in Computer Science, | |||
% version 2.2 for LaTeX2e | |||
% | |||
\documentclass{llncs} | |||
% | |||
\usepackage{makeidx} % allows for indexgeneration | |||
\usepackage{graphicx} % for gnuplot epslatex stuff | |||
\usepackage{color} % ditto | |||
\usepackage{pstricks} % for inkscape TeX output | |||
% | |||
\begin{document} | |||
% | |||
\mainmatter % start of the contributions | |||
% | |||
\title{Reinstating Floyd-Steinberg: Improved Metrics for Quality Assessment | |||
of Error Diffusion Algorithms} | |||
% | |||
\titlerunning{Adapting Qualitative Metrics to Common Error Diffusion Algorithms} % abbreviated title (for running head) | |||
% also used for the TOC unless | |||
% \toctitle is used | |||
% | |||
\author{Sam Hocevar\inst{1} \and Gary Niger\inst{2}} | |||
% | |||
\authorrunning{Sam Hocevar et al.} % abbreviated author list (for running head) | |||
% | |||
%%%% modified list of authors for the TOC (add the affiliations) | |||
\tocauthor{Sam Hocevar, Gary Niger (Laboratoire d'Imagerie Bureautique et de | |||
Conception Artistique)} | |||
% | |||
\institute{Laboratoire d'Imagerie Bureautique et de Conception Artistique\\ | |||
14 rue de Plaisance, Paris, France | |||
\and | |||
143 Rolloffle Avenue, Tarzana, California 91356\\ | |||
\email{sam@hocevar.net}, \email{gary\_niger@gnaa.us}} | |||
\maketitle % typeset the title of the contribution | |||
\begin{abstract} | |||
In this contribution we introduce a little-known property of error diffusion | |||
halftoning algorithms which we call error diffusion displacement. | |||
By accounting for the inherent sub-pixel displacement caused by the error | |||
propagation, we correct an important flaw in most metrics used to assess the | |||
quality of resulting halftones. We find these metrics to usually highly | |||
underestimate the quality of error diffusion in comparison to more modern | |||
algorithms such as direct binary search. | |||
Using empirical observation, we give a method for creating computationally | |||
efficient, image-independent, model-based metrics for this quality assessment. | |||
Finally, we use the properties of error diffusion displacement to justify | |||
Floyd and Steinberg's well-known choice of algorithm coefficients. | |||
{\bf Keywords}: halftoning, error diffusion, image quality, human visual | |||
system, color quantization | |||
\end{abstract} | |||
% | |||
\section{Introduction} | |||
Image dithering is the process of reducing continuous-tone images to images | |||
with a limited number of available colours. Applications vary tremendously, | |||
from laser and ink-jet printing to display on small devices such as cellphones, | |||
or even the design of banknotes. | |||
Countless methods have been published for the last 40 years that try to best | |||
address the problem of colour reduction. Comparing two algorithms in terms of | |||
speed or memory usage is often straightforward, but how exactly a halftoning | |||
algorithm performs in terms of quality is a far more complex issue, as it | |||
highly depends on the display device and the inner workings of the human eye. | |||
Though this document focuses on the particular case of bilevel halftoning, | |||
most of our results can be directly adapted to the more generic problem of | |||
colour reduction. | |||
\section{Halftoning algorithms} | |||
The most ancient halftoning method is probably classical screening. This highly | |||
parallelisible algorithm consists in tiling a dither matrix over the image | |||
and using its elements as threshold values. Classical screening is known for | |||
its structural artifacts such as the cross-hatch patterns caused by Bayer | |||
ordered dither matrices \cite{bayer}. However, modern techniques such as the | |||
void-and-cluster method \cite{void1}, \cite{void2} allow to generate screens | |||
yielding visually pleasing results. | |||
Error diffusion dithering, introduced in 1976 by Floyd and Steinberg | |||
\cite{fstein}, tries to compensate for the thresholding error through the use | |||
of feedback. Typically applied in raster scan order, it uses an error diffusion | |||
matrix such as the following one: | |||
\[ \frac{1}{16} \left| \begin{array}{ccc} | |||
- & x & 7 \\ | |||
3 & 5 & 1 \end{array} \right| \] | |||
Though efforts have been made to make error diffusion parallelisable | |||
\cite{parfstein}, it is generally considered more computationally expensive | |||
than screening. | |||
Model-based halftoning is the third important algorithm category. It relies | |||
on a model of the human visual system (HVS) and attempts to minimise an error | |||
value based on that model. One such algorithm is direct binary seach (DBS) | |||
\cite{allebach}, also referred to as least-squares model-based halftoning | |||
(LSMB) \cite{lsmb}. | |||
HVS models are usually low-pass filters. Nasanen \cite{nasanen}, Analoui | |||
and Allebach \cite{allebach} found that using gaussian models gave visually | |||
pleasing results, an observation confirmed by independent visual perception | |||
studies \cite{mcnamara}. | |||
DBS yields halftones of impressive quality. However, despite efforts to make | |||
it more efficient \cite{bhatt}, it suffers from its large computational | |||
requirements and error diffusion remains a widely used technique. | |||
\section{Error diffusion displacement} | |||
Most error diffusion implementations parse the image in raster scan order. | |||
Boustrophedonic (serpentine) scan has been shown to cause fewer visual | |||
artifacts \cite{halftoning}, but other, more complex processing paths such as | |||
Hilbert curves \cite{spacefilling}, \cite{peano} are seldom used as they do not | |||
improve the image quality significantly. | |||
Intuitively, as the error is always propagated to the bottom-left or | |||
bottom-right of each pixel (Fig. \ref{fig:direction}), one may expect the | |||
resulting image to be slightly translated. This expectation is confirmed | |||
when alternatively viewing an error diffused image and the corresponding DBS | |||
halftone. | |||
\begin{figure} | |||
\begin{center} | |||
\input{direction} | |||
\caption{Floyd-Steinberg error diffusion direction in raster scan (left) | |||
and serpentine scan (right).}\label{fig:direction} | |||
\end{center} | |||
\end{figure} | |||
This small translation is visually innocuous but we found that it means a lot | |||
in terms of error computation. A common way to compute the error between an | |||
image $h_{i,j}$ and the corresponding halftone $b_{i,j}$ is to compute the | |||
mean square error between modified versions of the images, in the form: | |||
\begin{equation} | |||
E(h,b) = \frac{(||v * h_{i,j} - v * b_{i,j}||_2)^2}{wh} | |||
\end{equation} | |||
where $w$ and $h$ are the image dimensions, $*$ denotes the convolution and $v$ | |||
is a model for the human visual system. | |||
To compensate for the slight translation experienced in the halftone, we | |||
use the following error metric instead: | |||
\begin{equation} | |||
E_{dx,dy}(h,b) = \frac{(||v * h_{i,j} - v * t_{dx,dy} * b_{i,j}||_2)^2}{wh} | |||
\end{equation} | |||
where $t_{dx,dy}$ is an operator which translates the image along the $(dx,dy)$ | |||
vector. | |||
A simple example can be given using a gaussian HVS model: | |||
\begin{equation} | |||
v(x,y) = e^{\frac{x^2+y^2}{2\sigma^2}} | |||
\end{equation} | |||
Finding the second filter is then straightforward: | |||
\begin{equation} | |||
(v * t_{dx,dy})(x,y) = e^{\frac{(x-dx)^2+(y-dy)^2}{2\sigma^2}} | |||
\end{equation} | |||
Experiment shows that for a given image and a given corresponding halftone, | |||
$E_{dx,dy}$ has a local minimum almost always away from $(dx,dy) = (0,0)$ (Fig. | |||
\ref{fig:lena-min}). Let $E$ be an error metric where this remains true. We | |||
call the local minimum $E_{min}$: | |||
\begin{equation} | |||
E_{min}(h,b) = \min_{dx,dy}E_{dx,dy}(h,b) | |||
\end{equation} | |||
\begin{figure} | |||
\begin{center} | |||
\input{lena-min} | |||
\caption{Mean square error for the \textit{Lena} image. $v$ is a simple | |||
$11\times11$ gaussian convolution kernel with $\sigma = 1.2$ and | |||
$(dx,dy)$ vary in $[-1,1]\times[-1,1]$.} | |||
\label{fig:lena-min} | |||
\end{center} | |||
\end{figure} | |||
For instance, a Floyd-Steinberg dither of \textit{Lena}, with $\sigma = 1.2$ | |||
yields a per-pixel mean square error of $8.51\times10^{-4}$. However, when | |||
taking the displacement into account, the error becomes $7.77\times10^{-4}$ | |||
for $(dx,dy) = (0.167709,0.299347)$. The new, corrected error is significantly | |||
smaller, with the exact same input and output images. | |||
Experiment shows that the corrected error is always noticeably smaller except | |||
in the case of images that are already mostly pure black and white. The | |||
experiment was performed on a database of 10,000 images from common computer | |||
vision sets and from the image board \textit{4chan}, providing a representative | |||
sampling of the photographs, digital art and business graphics widely exchanged | |||
on the Internet. | |||
In addition to the classical Floyd-Steinberg and Jarvis, Judice and Ninke | |||
kernels, we tested two serpentine error diffusion algorithms: Ostromoukhov's | |||
simple error diffusion \cite{ostromoukhov}, which uses a variable coefficient | |||
kernel, and Wong and Allebach's optimum error diffusion kernel \cite{wong}. | |||
\begin{center} | |||
\begin{tabular}{|l|l|l|} | |||
\hline | |||
& $E$ & $E_{min}$ \\ \hline | |||
raster Floyd-Steinberg & 0.00089705 & 0.000346514 \\ \hline | |||
raster Ja-Ju-Ni & 0.0020309 & 0.000692003 \\ \hline | |||
Ostromoukhov & 0.00189721 & 0.00186343 \\ \hline | |||
% raster optimum kernel & 0.00442951 & 0.00135092 \\ \hline | |||
optimum kernel & 0.00146338 & 0.00136522 \\ | |||
\hline | |||
\end{tabular} | |||
\end{center} | |||
We clearly see that usual metrics underestimate the quality of error-diffused | |||
halftones, especially in raster scan. Algorithms such as direct binary search, | |||
on the other hand, do not suffer from this bias since they are designed to | |||
minimise the very error induced by the HVS model. | |||
\section{An image-independent corrected quality metric for error-diffused | |||
halftones} | |||
We have seen that for a given image, $E_{min}(h,b)$ is a better and fairer | |||
visual error measurement than $E(h,b)$. However, its major drawback is that it | |||
is highly computationally expensive: for each image, the new $(dx,dy)$ values | |||
need to be calculated to minimise the energy value. | |||
Fortunately, we found that for a given raster or serpentine scan | |||
error diffusion algorithm, there was often very little variation in | |||
the optimal $(dx,dy)$ values (Fig. \ref{fig:table-historaster} and | |||
\ref{fig:table-histoserp}). | |||
\begin{figure} | |||
\begin{center} | |||
\begin{minipage}[c]{0.50\textwidth} | |||
\input{fs-histo} | |||
\end{minipage} | |||
\begin{minipage}[c]{0.40\textwidth} | |||
\input{jajuni-histo} | |||
\end{minipage} | |||
\caption{error diffusion displacement histograms for the raster | |||
Floyd-Steinberg (left) and raster Jarvis, Judis and Ninke (right) | |||
algorithms applied to a corpus of 10,000 images} | |||
\label{fig:table-historaster} | |||
\end{center} | |||
\end{figure} | |||
\begin{figure} | |||
\begin{center} | |||
\begin{minipage}[c]{0.50\textwidth} | |||
\input{ostro-histo} | |||
\end{minipage} | |||
\begin{minipage}[c]{0.40\textwidth} | |||
\input{serpopt-histo} | |||
\end{minipage} | |||
\caption{error diffusion displacement histograms for the Ostromoukhov (left) and optimum kernel (right) algorithms applied to a corpus | |||
of 10,000 images} | |||
\label{fig:table-histoserp} | |||
\end{center} | |||
\end{figure} | |||
For each algorithm, we choose the $(dx,dy)$ values at the histogram peak and | |||
we refer to them as the \textit{algorithm's displacement}, as opposed to the | |||
\textit{image's displacement} for a given algorithm. We call $E_{fast}(h,b)$ | |||
the error computed at $(dx,dy)$. As $E_{fast}$ does not depend on the image, it | |||
is a lot faster to compute than $E_{min}$, and as it is statistically closer to | |||
$E_{min}$, we can expect it to be a better error estimation than $E$. | |||
\begin{center} | |||
\begin{tabular}{|l|l|l|l|l|} | |||
\hline | |||
& $E$ & $dx$ & $dy$ & $E_{fast}$ \\ \hline | |||
raster Floyd-Steinberg & 0.00089705 & 0.16 & 0.28 & 0.00083502 \\ \hline | |||
raster Ja-Ju-Ni & 0.0020309 & 0.26 & 0.76 & 0.00192991 \\ \hline | |||
Ostromoukhov & 0.00189721 & 0.00 & 0.19 & 0.00186839 \\ \hline | |||
optimum kernel & 0.00146338 & 0.00 & 0.34 & 0.00138165 \\ | |||
\hline | |||
\end{tabular} | |||
\end{center} | |||
\section{Using error diffusion displacement for optimum kernel design} | |||
We believe that our higher quality $E_{min}$ error metric may be useful in | |||
kernel design, because it is the very same error that admittedly superior yet | |||
computationally expensive algorithms such as DBS try to minimise. | |||
Our first experiment was a study of the Floyd-Steinberg-like 4-block error | |||
diffusion kernels. According to the original authors, the coefficients were | |||
found "mostly by trial and error" \cite{fstein}. With our improved metric, we | |||
now have the tools to confirm or infirm Floyd and Steinberg's initial proposal. | |||
We chose to do an exhaustive study of every $\frac{1}{16}\{a,b,c,d\}$ integer | |||
combination. We deliberately chose positive integers whose sum is 16. Error | |||
diffusion coefficients smaller than zero or adding up to more than 1 are known | |||
to be unstable \cite{stability}, and diffusing less than 100\% of the error is | |||
known to cause important error in shadow and highlight areas of the image. | |||
First we studied all possible coefficients on a pool of 250 images with an | |||
error metric $E$ based on a standard gaussian HVS model. Since we are studying | |||
algorithms on different images but error values are only meaningful for a given | |||
image, we chose a Condorcet voting scheme to determine winners. $E_{min}$ is | |||
only given here as an indication and had no role in the computation: | |||
\begin{center} | |||
\begin{tabular}{|c|c|c|c|} | |||
\hline | |||
rank & coefficients & $E$ & $E_{min}$ \\ \hline | |||
1 & 8 3 5 0 & 0.00129563 & 0.000309993 \\ \hline | |||
2 & 7 3 6 0 & 0.00131781 & 0.000313941 \\ \hline | |||
3 & 9 3 4 0 & 0.00131115 & 0.000310815 \\ \hline | |||
4 & 9 2 5 0 & 0.00132785 & 0.000322754 \\ \hline | |||
5 & 8 4 4 0 & 0.0013117 & 0.00031749 \\ \hline | |||
\dots & \dots & \dots & \dots \\ | |||
\hline | |||
\end{tabular} | |||
\end{center} | |||
The exact same operation using $E_{min}$ as the decision variable yields very | |||
different results. Again, $E$ is only given here as an indication: | |||
\begin{center} | |||
\begin{tabular}{|c|c|c|c|} | |||
\hline | |||
rank & coefficients & $E_{min}$ & $E$ \\ \hline | |||
1 & 7 3 5 1 & 0.000306251 & 0.00141414 \\ \hline | |||
2 & 6 3 6 1 & 0.000325488 & 0.00145197 \\ \hline | |||
3 & 8 3 4 1 & 0.000313537 & 0.00141632 \\ \hline | |||
4 & 7 3 4 2 & 0.000336239 & 0.00156376 \\ \hline | |||
5 & 6 4 5 1 & 0.000333702 & 0.00147671 \\ \hline | |||
\dots & \dots & \dots & \dots \\ | |||
\hline | |||
\end{tabular} | |||
\end{center} | |||
Our improved metric was able to confirm that the original Floyd-Steinberg | |||
coefficients were indeed the best possible for raster scan. | |||
For serpentine scan, however, our experiment suggests that | |||
$\frac{1}{16}\{7,4,5,0\}$ is a better choice than the Floyd-Steinberg | |||
coefficients that have nonetheless been widely in use so far (Fig. | |||
\ref{fig:lena7450}). | |||
\begin{figure} | |||
\begin{center} | |||
\includegraphics[width=0.8\textwidth]{lena.eps} | |||
\caption{halftone of \textit{Lena} using serpentine error diffusion and | |||
the optimum coefficients $\frac{1}{16}\{7,4,5,0\}$ that improve | |||
on the standard Floyd-Steinberg coefficients in terms of visual | |||
quality for a given HVS model} | |||
\label{fig:lena7450} | |||
\end{center} | |||
\end{figure} | |||
\section{Conclusion} | |||
We have disclosed an interesting property of error diffusion algorithms | |||
allowing to more precisely measure the quality of such halftoning methods. | |||
Having showed that such quality is often underestimated by usual metrics, | |||
we hope to see even more development in simple error diffusion methods. | |||
Confirming Floyd and Steinberg's 30-year old "trial-and-error" result with our | |||
work is only the beginning: future work may cover more complex HVS models, | |||
for instance by taking into account the angular dependance of the human eye | |||
\cite{sullivan}. And now that we have a proper metric, we plan to improve all | |||
error diffusion methods that may require fine-tuning of their propagation | |||
coefficients. | |||
% | |||
% ---- Bibliography ---- | |||
% | |||
\begin{thebibliography}{} | |||
% | |||
\bibitem[1]{bayer} | |||
B. Bayer, | |||
\textit{Color imaging array}. | |||
U.S. patent 3,971,065 (1976) | |||
\bibitem[2]{void1} | |||
R.A. Ulichney (Digital Equipment Corporation), | |||
\textit{Void and cluster apparatus and method for generating dither templates}. | |||
U.S. patent 5,535,020 (1992) | |||
\bibitem[3]{void2} | |||
H. Ancin, A. Bhattacharjya and J. Shu (Seiko Epson Corporation), | |||
\textit{Void-and-cluster dither-matrix generation for better half-tone | |||
uniformity}. | |||
U.S. patent 6,088,512 (1997) | |||
\bibitem[4]{fstein} | |||
R.W. Floyd, L. Steinberg, | |||
\textit{An adaptive algorithm for spatial grey scale}. | |||
Proceedings of the Society of Information Display 17, (1976) 75--77 | |||
\bibitem[5]{parfstein} | |||
P. Metaxas, | |||
\textit{Optimal Parallel Error-Diffusion Dithering}. | |||
Color Imaging: Device-Indep. Color, Color Hardcopy, and Graphic Arts IV, Proc. | |||
SPIE 3648, 485--494 (1999) | |||
\bibitem[6]{quality} | |||
T. D. Kite, | |||
\textit{Design and Quality Assessment of Forward and Inverse Error-Diffusion | |||
Halftoning Algorithms}. | |||
PhD thesis, Dept. of ECE, The University of Texas at Austin, Austin, TX, Aug. | |||
1998 | |||
\bibitem[7]{halftoning} | |||
R. Ulichney, | |||
\textit{Digital Halftoning} | |||
MIT Press, 1987 | |||
\bibitem[8]{spacefilling} | |||
L. Velho and J. Gomes, | |||
\textit{Digital halftoning with space-filling curves} | |||
Computer Graphics (Proceedings of SIGGRAPH 91), 25(4):81--90, 1991 | |||
\bibitem[9]{peano} | |||
I.~H. Witten and R.~M. Neal, | |||
\textit{Using peano curves for bilevel display of continuous-tone images} | |||
IEEE Computer Graphics \& Appl., 2:47--52, 1982 | |||
\bibitem[10]{nasanen} | |||
R. Nasanen, | |||
\textit{Visibility of halftone dot textures} | |||
IEEE Trans. Syst. Man. Cyb., vol. 14, no. 6, pp. 920--924, 1984 | |||
\bibitem[11]{allebach} | |||
M. Analoui and J.~P. Allebach, | |||
\textit{Model-based halftoning using direct binary search} | |||
Proc. of SPIE/IS\&T Symp. on Electronic Imaging Science and Tech., | |||
February 1992, San Jose, CA, pp. 96--108 | |||
\bibitem[12]{mcnamara} | |||
Ann McNamara, | |||
\textit{Visual Perception in Realistic Image Synthesis} | |||
Computer Graphics Forum, vol. 20, no. 4, pp. 211--224, 2001 | |||
\bibitem[13]{bhatt} | |||
Bhatt \textit{et al.}, | |||
\textit{Direct Binary Search with Adaptive Search and Swap} | |||
\url{http://www.ima.umn.edu/2004-2005/MM8.1-10.05/activities/Wu-Chai/halftone.pdf} | |||
\bibitem[14]{4chan} | |||
moot, | |||
\url{http://www.4chan.org/} | |||
\bibitem[15]{wong} | |||
P.~W. Wong and J.~P. Allebach, | |||
\textit{Optimum error-diffusion kernel design} | |||
Proc. SPIE Vol. 3018, p. 236--242, 1997 | |||
\bibitem[16]{ostromoukhov} | |||
Victor Ostromoukhov, | |||
\textit{A Simple and Efficient Error-Diffusion Algorithm} | |||
in Proceedings of SIGGRAPH 2001, in ACM Computer Graphics, Annual Conference | |||
Series, pp. 567--572, 2001 | |||
\bibitem[17]{lsmb} | |||
T.~N. Pappas and D.~L. Neuhoff, | |||
\textit{Least-squares model-baed halftoning} | |||
in Proc. SPIE, Human Vision, Visual Proc., and Digital Display III, San Jose, | |||
CA, Feb. 1992, vol. 1666, pp. 165--176 | |||
\bibitem[18]{stability} | |||
R. Eschbach, Z. Fan, K.~T. Knox and G. Marcu, | |||
\textit{Threshold Modulation and Stability in Error Diffusion} | |||
in Signal Processing Magazine, IEEE, July 2003, vol. 20, issue 4, pp. 39--50 | |||
\bibitem[19]{kite} | |||
T.~D. Kite, | |||
\textit{Design and quality assessment of forward and inverse error diffusion | |||
halftoning algorithms} | |||
Ph.~D. in Electrical Engineering (Image Processing), August 1998 | |||
\bibitem[20]{sullivan} | |||
J. Sullivan, R. Miller and G. Pios, | |||
\textit{Image halftoning using a visual model in error diffusion} | |||
J. Opt. Soc. Am. A, vol. 10, pp. 1714--1724, Aug. 1993 | |||
\end{thebibliography} | |||
\end{document} | |||
@@ -0,0 +1,423 @@ | |||
% GNUPLOT: LaTeX picture with Postscript | |||
\begingroup | |||
\makeatletter | |||
\providecommand\color[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package color not loaded in conjunction with | |||
terminal option `colourtext'% | |||
}{See the gnuplot documentation for explanation.% | |||
}{Either use 'blacktext' in gnuplot or load the package | |||
color.sty in LaTeX.}% | |||
\renewcommand\color[2][]{}% | |||
}% | |||
\providecommand\includegraphics[2][]{% | |||
\GenericError{(gnuplot) \space\space\space\@spaces}{% | |||
Package graphicx or graphics not loaded% | |||
}{See the gnuplot documentation for explanation.% | |||
}{The gnuplot epslatex terminal needs graphicx.sty or graphics.sty.}% | |||
\renewcommand\includegraphics[2][]{}% | |||
}% | |||
\providecommand\rotatebox[2]{#2}% | |||
\@ifundefined{ifGPcolor}{% | |||
\newif\ifGPcolor | |||
\GPcolortrue | |||
}{}% | |||
\@ifundefined{ifGPblacktext}{% | |||
\newif\ifGPblacktext | |||
\GPblacktexttrue | |||
}{}% | |||
% define a \g@addto@macro without @ in the name: | |||
\let\gplgaddtomacro\g@addto@macro | |||
% define empty templates for all commands taking text: | |||
\gdef\gplbacktext{}% | |||
\gdef\gplfronttext{}% | |||
\makeatother | |||
\ifGPblacktext | |||
% no textcolor at all | |||
\def\colorrgb#1{}% | |||
\def\colorgray#1{}% | |||
\else | |||
% gray or color? | |||
\ifGPcolor | |||
\def\colorrgb#1{\color[rgb]{#1}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color[rgb]{1,0,0}}% | |||
\expandafter\def\csname LT1\endcsname{\color[rgb]{0,1,0}}% | |||
\expandafter\def\csname LT2\endcsname{\color[rgb]{0,0,1}}% | |||
\expandafter\def\csname LT3\endcsname{\color[rgb]{1,0,1}}% | |||
\expandafter\def\csname LT4\endcsname{\color[rgb]{0,1,1}}% | |||
\expandafter\def\csname LT5\endcsname{\color[rgb]{1,1,0}}% | |||
\expandafter\def\csname LT6\endcsname{\color[rgb]{0,0,0}}% | |||
\expandafter\def\csname LT7\endcsname{\color[rgb]{1,0.3,0}}% | |||
\expandafter\def\csname LT8\endcsname{\color[rgb]{0.5,0.5,0.5}}% | |||
\else | |||
% gray | |||
\def\colorrgb#1{\color{black}}% | |||
\def\colorgray#1{\color[gray]{#1}}% | |||
\expandafter\def\csname LTw\endcsname{\color{white}}% | |||
\expandafter\def\csname LTb\endcsname{\color{black}}% | |||
\expandafter\def\csname LTa\endcsname{\color{black}}% | |||
\expandafter\def\csname LT0\endcsname{\color{black}}% | |||
\expandafter\def\csname LT1\endcsname{\color{black}}% | |||
\expandafter\def\csname LT2\endcsname{\color{black}}% | |||
\expandafter\def\csname LT3\endcsname{\color{black}}% | |||
\expandafter\def\csname LT4\endcsname{\color{black}}% | |||
\expandafter\def\csname LT5\endcsname{\color{black}}% | |||
\expandafter\def\csname LT6\endcsname{\color{black}}% | |||
\expandafter\def\csname LT7\endcsname{\color{black}}% | |||
\expandafter\def\csname LT8\endcsname{\color{black}}% | |||
\fi | |||
\fi | |||
\setlength{\unitlength}{0.0500bp}% | |||
\begin{picture}(2590.00,2590.00)% | |||
\gplgaddtomacro\gplbacktext{% | |||
}% | |||
\gplgaddtomacro\gplfronttext{% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\color{black}% | |||
\csname LTb\endcsname% | |||
\put(130,104){\makebox(0,0){\strut{}-0.3}}% | |||
\csname LTb\endcsname% | |||
\put(519,104){\makebox(0,0){\strut{}-0.2}}% | |||
\csname LTb\endcsname% | |||
\put(907,104){\makebox(0,0){\strut{}-0.1}}% | |||
\csname LTb\endcsname% | |||
\put(1295,104){\makebox(0,0){\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(1683,104){\makebox(0,0){\strut{} 0.1}}% | |||
\csname LTb\endcsname% | |||
\put(2071,104){\makebox(0,0){\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(2460,104){\makebox(0,0){\strut{} 0.3}}% | |||
\csname LTb\endcsname% | |||
\put(-42,2460){\makebox(0,0)[r]{\strut{}-0.1}}% | |||
\csname LTb\endcsname% | |||
\put(-42,2164){\makebox(0,0)[r]{\strut{} 0}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1868){\makebox(0,0)[r]{\strut{} 0.1}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1572){\makebox(0,0)[r]{\strut{} 0.2}}% | |||
\csname LTb\endcsname% | |||
\put(-42,1278){\makebox(0,0)[r]{\strut{} 0.3}}% | |||
\csname LTb\endcsname% | |||
\put(-42,982){\makebox(0,0)[r]{\strut{} 0.4}}% | |||
\csname LTb\endcsname% | |||
\put(-42,686){\makebox(0,0)[r]{\strut{} 0.5}}% | |||
\csname LTb\endcsname% | |||
\put(-42,390){\makebox(0,0)[r]{\strut{} 0.6}}% | |||
}% | |||
\gplbacktext | |||
\put(0,0){\includegraphics{serpopt-histo}}% | |||
\gplfronttext | |||
\end{picture}% | |||
\endgroup |
@@ -0,0 +1,41 @@ | |||
#include <stdio.h> | |||
#define N 128 | |||
#if 1 | |||
#define X1 -.1 | |||
#define X2 .4 | |||
#define Y1 -.05 | |||
#define Y2 .45 | |||
#endif | |||
int tab[N][N]; | |||
int main(void) | |||
{ | |||
float fx, fy; | |||
int x, y; | |||
for(;;) | |||
{ | |||
if(fscanf(stdin, "%g %g\n", &fx, &fy) != 2) | |||
break; | |||
x = (N - 0.000001) * (fx - X1) / (X2 - X1); | |||
y = (N - 0.000001) * (fy - Y1) / (Y2 - Y1); | |||
if(x < 0 || y < 0 || x >= N || y >= N) | |||
continue; | |||
tab[x][y]++; | |||
} | |||
for(y = 0; y < N; y++) | |||
{ | |||
for(x = 0; x < N; x++) | |||
printf("%g %g %i\n", (float)x * (X2 - X1) / (N - 1) + X1, | |||
(float)y * (Y2 - Y1) / (N - 1) + Y1, tab[x][y]); | |||
printf("\n"); | |||
} | |||
return 0; | |||
} |