This commit is contained in:
tth 2021-04-18 00:46:45 +02:00
parent 4095750024
commit 34ab825670
3 changed files with 79 additions and 26 deletions

1
.gitignore vendored
View File

@ -24,6 +24,7 @@ doc/*.idx
doc/*.ilg doc/*.ilg
doc/*.ind doc/*.ind
doc/co*.tex doc/co*.tex
doc/foo.html
funcs/t funcs/t
funcs/*.o funcs/*.o

11
doc/README.md Normal file
View File

@ -0,0 +1,11 @@
# The FloatImg Hack
Et voilà la documentation...
Pour la générer :
`bash mkdoc.sh`

View File

@ -12,7 +12,7 @@
\lstset{basicstyle=\ttfamily\small} \lstset{basicstyle=\ttfamily\small}
\lstset{aboveskip=0.222em,belowskip=0.222em} \lstset{aboveskip=0.222em,belowskip=0.222em}
\usepackage{babel} \usepackage{babel} % ?
\usepackage{graphicx} % for gnuplot ylabel rotate \usepackage{graphicx} % for gnuplot ylabel rotate
@ -29,7 +29,7 @@
\setlength \parskip {0.35em} \setlength \parskip {0.35em}
\makeatletter \makeatletter
% exlication de ce truc ? % explication de ce truc ?
\def\verbatim@font{\normalfont\ttfamily\small} \def\verbatim@font{\normalfont\ttfamily\small}
\makeatother \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}, puis l'enregistrer dans un fichier \texttt{.fimg}\index{.fimg},
un format complètement inconnu, puisque je viens de l'inventer un format complètement inconnu, puisque je viens de l'inventer
à l'instant même. à 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 Tout d'abord, nous devons déclarer et garnir quelques variables
pour gérer la machinerie interne. pour gérer la machinerie interne.
@ -155,9 +156,9 @@ char *fname = "exemple.fimg";
FloatImg fimg; FloatImg fimg;
\end{lstlisting} \end{lstlisting}
Ensuite, nous enchainerons trois étapes : création de l'image Ensuite, nous enchainerons trois étapes : la création de l'image
en mémoire centrale, initialisation des valeurs de chaque pixel à 0.0, en mémoire centrale, l'initialisation des valeurs de chaque pixel à 0.0,
et pour conclure, enregistrement dans un fichier\footnote{Au format et pour conclure, l'enregistrement dans un fichier\footnote{Au format
ésotérique, mais très véloce.} binaire. ésotérique, mais très véloce.} binaire.
\begin{lstlisting} \begin{lstlisting}
@ -206,13 +207,13 @@ lesquels sont décrits en page \pageref{outils}.
\section{Installation} \section{Installation}
Sauf indications contraires, ces instructions se réfèrent à Sauf indications contraires, ces instructions se réfèrent à
une distribution Debian\index{Debian} récente. une distribution Debian\index{Debian} récente, mais ça marche
quasiment pareil avec Fedora\index{Fedora}.
\textit{Attention, ça devient un peu gore. Myrys, punk, toussa\dots} \textit{Attention, ça devient un peu gore\dots}
\subsection{Prérequis} \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} avoir quelques bibliothèques installées\footnote{Les \texttt{-dev}
en plus pour Debian et dérivées}~: en plus pour Debian et dérivées}~:
\textsf{ \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é Le script \texttt{install.sh}, à la racine du projet, est censé
faciliter un peu la chose. Il prend également en compte la copie faciliter un peu la chose. Il prend également en compte la copie
des divers binaires du dossier \texttt{tools/} (cf page \pageref{outils}) 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 Il reste enfin quelques exemples d'utilisation des outils de la
ligne de commande depuis un shell 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/}. classées en deux catégories : \texttt{lib/} et \texttt{funcs/}.
La première contient les choses qui sont relativement figées, La première contient les choses qui sont relativement figées,
et la seconde celles qui risquent de bouger. Cette classification et la seconde celles qui risquent de bouger. Cette classification
est en fait arbitraire. est en fait indécement arbitraire.
\subsection{Structures, macros\dots} \subsection{Structures, macros\dots}
@ -286,6 +287,7 @@ dans une jolie structure que nous allons examiner dès maintenant.
\begin{lstlisting} \begin{lstlisting}
/* in memory descriptor */ /* in memory descriptor */
typedef struct { typedef struct {
int magic;
int width; int width;
int height; int height;
int type; int type;
@ -296,7 +298,9 @@ typedef struct {
} FloatImg; } FloatImg;
\end{lstlisting}\index{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 Le troisième est le type d'image : pour le moment, il y en a % trois
un certain nombre un certain nombre
qui sont définis\footnote{et plus ou moins bien gérés\dots} : 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{count} sera mis à 0 et
le champ \textsl{fval} sera initialisé à 15.0 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 Ensuite, dans la boucle capture/cumul, \textsl{count} sera
incrémenté à chaque passe, et nous aurons donc, en finale, incrémenté à chaque passe, et nous aurons donc, en finale,
toutes les informations nécessaires pour exploiter au mieux la dynamique 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 La fonction \texttt{fimg\_printhead(FloatImg *h)} affiche
sommairement le contenu de ce descripteur, sommairement le contenu de ce descripteur,
et \texttt{fimg\_describe(FloatImg *head, char *txt)} propose 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. 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 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 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 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 à documentés dans ce document, et les autres sont dangereux à
toucher. Les types d'images actuellement gérés sont les trois grands 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. classiques : gray, rgb et rgba. et expliquées quelques lignes plus haut.
@ -529,12 +535,15 @@ inutile, en fait l'inverse de l'upscaling.
\begin{lstlisting} \begin{lstlisting}
int fimg_halfsize_0(FloatImg *src, FloatImg *dst, int notused); int fimg_halfsize_0(FloatImg *src, FloatImg *dst, int notused);
int fimg_halfsize_1(FloatImg *src, FloatImg *dst, int notused);
\end{lstlisting} \end{lstlisting}
Attention lors de l'appel, le descripteur \texttt{dst} ne doit pas Attention lors de l'appel, le descripteur \texttt{dst} ne doit pas
contenir d'image, et doit être effacé avec un bon contenir d'image, et doit être effacé avec un bon
\texttt{memset(\&result, 0, sizeof(FloatImg));} bien senti. \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} \begin{lstlisting}
int fimg_extract_0(FloatImg *src, FloatImg *dst, int x, int y); 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, la valeur maximale, la date de création, une longueur d'onde,
et bien plus encore. 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. classique proposé par les gros scanners corporates.
\begin{lstlisting} \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} \end{lstlisting}
Tous les flags doivent être à zéro. Tous les flags doivent être à zéro. Pour le moment.
\subsubsection{Vers FITS}\index{FITS} \subsubsection{Vers FITS}\index{FITS}
@ -1157,7 +1169,8 @@ des deux valeurs \textsc{nbre} et \textsc{offs} calculées en préambule.
\end{verbatim} \end{verbatim}
Cette seconde partie sert à calculer avec la commande 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 : un coefficient variable en fonction du temps :
$sin(idx/16)$ afin d'avoir une oscillation du coefficient entre $sin(idx/16)$ afin d'avoir une oscillation du coefficient entre
-1.0 et 1.0, deux valeurs probablement glitchantes. -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} L'option \texttt{-X} me permet d'intégrer des \textit{fritures}
expérimentales dans le binaire, et ne doit donc pas être 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. terme.
\subsubsection{Upscaling}\index{upscaling}\label{upscaling} \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é. Mmmmm... Ça semble un peu plus compliqué.
La documentation à ce sujet me semble ésotérique. La documentation à ce sujet me semble ésotérique.
D'un autre coté, il 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} \subsection{ffmpeg}\index{ffmpeg}
@ -1341,9 +1354,37 @@ ffmpeg -nostdin \
Il y a d'autres logiciels pour lesquels écrire une fonction d'importation Il y a d'autres logiciels pour lesquels écrire une fonction d'importation
serait bien~: \textsl{Geeqie}, un visualiseur d'image fort pratique, ou 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 ?} \section{Et pour la suite ?}
En fait, je fait de la photo par la méthode du « cumul »\index{cumul} En fait, je fait de la photo par la méthode du « cumul »\index{cumul}