diff --git a/.gitignore b/.gitignore index f7d1ee5..07b608f 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ doc/*.idx doc/*.ilg doc/*.ind doc/co*.tex +doc/foo.html funcs/t funcs/*.o diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..0fa244c --- /dev/null +++ b/doc/README.md @@ -0,0 +1,11 @@ +# The FloatImg Hack + +Et voilà la documentation... + + +Pour la générer : + +`bash mkdoc.sh` + + + diff --git a/doc/the_floatimg_hack.tex b/doc/the_floatimg_hack.tex index b6db691..0753a94 100644 --- a/doc/the_floatimg_hack.tex +++ b/doc/the_floatimg_hack.tex @@ -12,11 +12,11 @@ \lstset{basicstyle=\ttfamily\small} \lstset{aboveskip=0.222em,belowskip=0.222em} -\usepackage{babel} +\usepackage{babel} % ? -\usepackage{graphicx} % for gnuplot ylabel rotate +\usepackage{graphicx} % for gnuplot ylabel rotate -\usepackage{pifont} % caractères rigolos +\usepackage{pifont} % caractères rigolos \usepackage{enumitem} \setitemize[1]{label={\ding{87}}} \frenchbsetup{CompactItemize=false} @@ -29,7 +29,7 @@ \setlength \parskip {0.35em} \makeatletter -% exlication de ce truc ? +% explication de ce truc ? \def\verbatim@font{\normalfont\ttfamily\small} \makeatother @@ -145,6 +145,7 @@ nous allons créer une image RGB\index{RGB} complètement noire, puis l'enregistrer dans un fichier \texttt{.fimg}\index{.fimg}, un format complètement inconnu, puisque je viens de l'inventer à l'instant même. +Enfin, non, il y a déja longtemps, avant la pandémie. Tout d'abord, nous devons déclarer et garnir quelques variables pour gérer la machinerie interne. @@ -155,9 +156,9 @@ char *fname = "exemple.fimg"; FloatImg fimg; \end{lstlisting} -Ensuite, nous enchainerons trois étapes : création de l'image -en mémoire centrale, initialisation des valeurs de chaque pixel à 0.0, -et pour conclure, enregistrement dans un fichier\footnote{Au format +Ensuite, nous enchainerons trois étapes : la création de l'image +en mémoire centrale, l'initialisation des valeurs de chaque pixel à 0.0, +et pour conclure, l'enregistrement dans un fichier\footnote{Au format ésotérique, mais très véloce.} binaire. \begin{lstlisting} @@ -206,13 +207,13 @@ lesquels sont décrits en page \pageref{outils}. \section{Installation} Sauf indications contraires, ces instructions se réfèrent à -une distribution Debian\index{Debian} récente. - -\textit{Attention, ça devient un peu gore. Myrys, punk, toussa\dots} +une distribution Debian\index{Debian} récente, mais ça marche +quasiment pareil avec Fedora\index{Fedora}. +\textit{Attention, ça devient un peu gore\dots} \subsection{Prérequis} -Vous devez, en dehors des outils classiques (bash, gcc, make\dots), +Vous devez, en dehors des outils classiques (gcc, Awk, make\dots), avoir quelques bibliothèques installées\footnote{Les \texttt{-dev} en plus pour Debian et dérivées}~: \textsf{ @@ -250,7 +251,7 @@ vous pouvez copier les deux fichiers \texttt{floatimg.h} et Le script \texttt{install.sh}, à la racine du projet, est censé faciliter un peu la chose. Il prend également en compte la copie des divers binaires du dossier \texttt{tools/} (cf page \pageref{outils}) -dans le répertoire prévu à cet effet : \texttt{/usr/local/bin}. +dans le répertoire prévu à cet effet~: \texttt{/usr/local/bin}. Il reste enfin quelques exemples d'utilisation des outils de la ligne de commande depuis un shell @@ -274,7 +275,7 @@ Au niveau du code source, ces fonctions sont approximativement classées en deux catégories : \texttt{lib/} et \texttt{funcs/}. La première contient les choses qui sont relativement figées, et la seconde celles qui risquent de bouger. Cette classification -est en fait arbitraire. +est en fait indécement arbitraire. \subsection{Structures, macros\dots} @@ -286,6 +287,7 @@ dans une jolie structure que nous allons examiner dès maintenant. \begin{lstlisting} /* in memory descriptor */ typedef struct { + int magic; int width; int height; int type; @@ -296,7 +298,9 @@ typedef struct { } FloatImg; \end{lstlisting}\index{FloatImg} -Les deux premiers champs sont \textsl{obvious}. +Le premier champ, \texttt{magic}, servira un de ces jours à +robustifier l'ensemble du machin. +Les deux suivants sont \textsl{obvious}. Le troisième est le type d'image : pour le moment, il y en a % trois un certain nombre qui sont définis\footnote{et plus ou moins bien gérés\dots} : @@ -328,7 +332,7 @@ quelques images... Le champ \textsl{count} sera mis à 0 et le champ \textsl{fval} sera initialisé à 15.0 -(qui est la valeur maximale que peut renvoyer le capteur). +(qui est la valeur maximale que peut renvoyer ce capteur). Ensuite, dans la boucle capture/cumul, \textsl{count} sera incrémenté à chaque passe, et nous aurons donc, en finale, toutes les informations nécessaires pour exploiter au mieux la dynamique @@ -338,11 +342,12 @@ maximale théorique est égale à $fval * count$. La fonction \texttt{fimg\_printhead(FloatImg *h)} affiche sommairement le contenu de ce descripteur, et \texttt{fimg\_describe(FloatImg *head, char *txt)} propose -un affichage plus détaillé. Ça aide parfois. +un affichage plus détaillé. Ça peut parfois aider. Une bonne partie des fonctions que nous allons voir est indéterministe. Ce qui veut dire, en langage de tous les soirs, que ça risque de ne -pas être la même chose dans l'avenir. +pas être la même chose dans l'avenir. Mais après tout, ce n'est +encore qu'un concept en devenir, n'est-ce pas ? % ---------------------------------- @@ -360,7 +365,8 @@ int fimg_destroy(FloatImg *fimg); L'appelant doit lui-même gérer le descripteur d'image (une structure C décrite plus haut) en le considérant comme un type semi-opaque dont -la forme peut varier. Certains membres de cette structure sont +la forme \emph{peut} varier. +Certains membres de cette structure sont documentés dans ce document, et les autres sont dangereux à toucher. Les types d'images actuellement gérés sont les trois grands classiques : gray, rgb et rgba. et expliquées quelques lignes plus haut. @@ -444,7 +450,7 @@ $x$ et $y$ de la demande. Quand au canal \textsl{alpha}\index{alpha}, il est pour le moment superbement ignoré. Ceci dit, on vient de me faire remarquer qu'il peut être utilisable aussi pour faire du -\textsl{z-buffer}\index{z-buffer}\index{rgbz} \dots +\textsl{z-buffer}\index{z-buffer}\index{rgbz}\dots % ---------------------------------- @@ -529,12 +535,15 @@ inutile, en fait l'inverse de l'upscaling. \begin{lstlisting} int fimg_halfsize_0(FloatImg *src, FloatImg *dst, int notused); +int fimg_halfsize_1(FloatImg *src, FloatImg *dst, int notused); \end{lstlisting} Attention lors de l'appel, le descripteur \texttt{dst} ne doit pas contenir d'image, et doit être effacé avec un bon \texttt{memset(\&result, 0, sizeof(FloatImg));} bien senti. -Et le résultat est très moyen : il n'y a pas d'interpolation. + +La première propose un résultat très moyen : il n'y a pas d'interpolation, +alors que la seconde semble bien mieux. \begin{lstlisting} int fimg_extract_0(FloatImg *src, FloatImg *dst, int x, int y); @@ -572,6 +581,9 @@ typedef struct { la valeur maximale, la date de création, une longueur d'onde, et bien plus encore. +Le champ \texttt{magic[8]} doit contenir une valeur magique. +Le champ \texttt{t} (le type de l'image) doit avoir les trois octets +de poids fort à 0. % ---------------------------------- @@ -639,10 +651,10 @@ de gérer une foultitude de formats numériques. C'est aussi un format classique proposé par les gros scanners corporates. \begin{lstlisting} -int fimg_write_as_png(FloatImg *src, char *outname, int flags); +int fimg_write_as_tiff(FloatImg *src, char *outname, int flags); \end{lstlisting} -Tous les flags doivent être à zéro. +Tous les flags doivent être à zéro. Pour le moment. \subsubsection{Vers FITS}\index{FITS} @@ -1157,7 +1169,8 @@ des deux valeurs \textsc{nbre} et \textsc{offs} calculées en préambule. \end{verbatim} Cette seconde partie sert à calculer avec la commande -\texttt{bc}\index{bc} +\texttt{bc}\index{bc}% +\footnote{\texttt{bc}, c'est vraiment un truc à découvrir.} un coefficient variable en fonction du temps : $sin(idx/16)$ afin d'avoir une oscillation du coefficient entre -1.0 et 1.0, deux valeurs probablement glitchantes. @@ -1252,7 +1265,7 @@ vaguement expliqué page \pageref{contraste}. L'option \texttt{-X} me permet d'intégrer des \textit{fritures} expérimentales dans le binaire, et ne doit donc pas être -utilisée dans des scripts si on a des visions à long +utilisée dans des scripts si on a des visions à long (ou même) terme. \subsubsection{Upscaling}\index{upscaling}\label{upscaling} @@ -1321,7 +1334,7 @@ Je compte donc sur le bouquin de \textsl{Brunus} pour avancer\dots Mmmmm... Ça semble un peu plus compliqué. La documentation à ce sujet me semble ésotérique. D'un autre coté, il -faut faire ça en \textbf{C}, ce qui ne peut être négatif. +faut faire ça en \textbf{C}, ce qui ne peut pas être négatif. \subsection{ffmpeg}\index{ffmpeg} @@ -1341,9 +1354,37 @@ ffmpeg -nostdin \ Il y a d'autres logiciels pour lesquels écrire une fonction d'importation serait bien~: \textsl{Geeqie}, un visualiseur d'image fort pratique, ou -\textsl{Krita} qui semble avoir les faveurs de dessinateurs de talent. +\textsl{Krita} qui semble avoir les faveurs de +dessinateurs de talent\footnote{Oui, David, c'est à toi que je pense.}. % ------------------------------------------------------------------- +% =================================================================== +\section{Le flou temporel} + +Et si nous jouions sur l'axe du temps ? + +Nous avons plus ou moins la magie du cumul sur la prise de vue +d'\textbf{image} en enchainant plusieurs capture d'image. +Maintenant, voyons ce que l'on peut faire à partir de plusieurs images. +On peut d'abord penser faire une moyenne (ou la somme, en fait) de toutes +ces images. Mais ce n'est qu'une façon déguisée de faire du cumul. +C'est à ce moment que nous changeons l'axe de vue du défi. + +\subsection{textsl{moving average}} + +Moyenne mobile. + +\subsection{Interpolator}\index{interpolator} + +Juste des calculs pas si simple que ça. + +\subsection{Déviance} + +Là, nous tombons dans la troiD de haut niveau, avec plein de maths +à l'intérieur. + +% =================================================================== + \section{Et pour la suite ?} En fait, je fait de la photo par la méthode du « cumul »\index{cumul}