Compare commits

..

2 Commits

Author SHA1 Message Date
tth
004f24689b doc about fimg2text + small patches 2021-04-24 15:18:06 +02:00
tth
5ac050fa10 bla 2021-04-24 08:49:09 +02:00
3 changed files with 73 additions and 7 deletions

View File

@ -3,7 +3,7 @@
Avec toutes ces fonctions disponibles et `grabvidseq`, nous Avec toutes ces fonctions disponibles et `grabvidseq`, nous
savons faire des images **floues**. L'étape suivante, les plus savons faire des images **floues**. L'étape suivante, les plus
pervers d'entre vous le savent déja, est celle de la création pervers d'entre vous le savent déja, est celle de la création
de **films flous** dans le domaine spacial. de **films flous** dans le domaine spacio-temporel.
À l'heure actuelle, il y a plusieurs programmes distincts. Le premier À l'heure actuelle, il y a plusieurs programmes distincts. Le premier
(fonderie) fait une moyenne mobile sur N images consécutives, (fonderie) fait une moyenne mobile sur N images consécutives,
@ -16,7 +16,7 @@ de filtres...
## Chaine de filtres ## Chaine de filtres
Ce système connait un certain nombre de filtres et d'effets spéciaux Ce système connait un certain nombre de filtres et d'effets spéciaux
destinés à la kitchitude du produit final. Ils peuvent être chainés destinés à augmenter la kitchitude du produit final. Ils peuvent être chainés
les uns après les autres, à l'entrée et à la sortie du process les uns après les autres, à l'entrée et à la sortie du process
de floutagement. de floutagement.
@ -26,7 +26,8 @@ L'option `-L` de ces logiciels permet d'obtenir la liste des filtres.
Une chaine de filtres est constituée d'une liste de nom ou de numéro Une chaine de filtres est constituée d'une liste de nom ou de numéro
de filtre, séparés par le caractère `:`, une façon de faire très de filtre, séparés par le caractère `:`, une façon de faire très
classique dans notre univers, en fait. classique dans notre univers, en fait. Et si on veut prendre des risques,
on doit continuer à appeler les filtres par leur numéro, jdçjdr.
`mirsplit:ctr2x2:3:killlines` `mirsplit:ctr2x2:3:killlines`

View File

@ -995,17 +995,75 @@ ne devrait pas être trop difficile. Des volontaires ?
\textsl{D'ailleurs, pourquoi $N$ logiciels indépendants alors q'un \textsl{D'ailleurs, pourquoi $N$ logiciels indépendants alors q'un
seul devrait être nécessaire ?} seul devrait être nécessaire ?}
% -------------------------
\subsection{fimg2text}
Voici donc quelque chose qui retourne vers la bonne vieille
tradition Unix\index{Unix} et permet de traiter des images
flottantes avec des outils classiques comme l'injustement
méconnu \texttt{Awk}\index{Awk}.
Dans le comportement par défaut (le seul actuellement) cet outil
sort, pour chaque pixel, cinq valeurs~:
\begin{itemize}
\item Les coordonnées entières $x,y$ du pixel
\item Les valeurs flottantes des composantes \textsc{rgb}
\end{itemize}
On peut même espérer qu'un jour, il soit possible de faire
la transformation inverse. Quelle joie de générer des images
flottantes avec un programme écrit en \textit{gw-basic} :)
\begin{verbatim}
tth@fubar:~/Devel/FloatImg/doc$ fimg2text -h
usage:
fimg2text [options] foo.fimg > bar.csv
options:
-v increase verbosity
-n 3.14 normalize picture
-s N steps on x & y
\end{verbatim}
Vous voulez un petit exemple ?
\begin{verbatim}
tth@fubar:~/Devel/FloatImg/doc$ mkfimg -t drand48 quux.fimg 4 2
tth@fubar:~/Devel/FloatImg/doc$ fimg2text -s 1 quux.fimg
0 0 142.518127 84.036987 20.688946
1 0 164.273315 68.397079 138.501587
2 0 45.887970 25.905518 93.683243
3 0 53.292942 222.000000 111.711548
0 1 82.289795 113.054855 180.530014
1 1 42.051765 114.543625 4.249123
2 1 71.826775 96.219109 63.222294
3 1 160.535675 136.104919 204.020691
tth@fubar:~/Devel/FloatImg/doc$
\end{verbatim}
Et maintenant, vous voulez un gros exemple ?
% -------------------------
\subsection{fimg2gray}\index{fimg2gray}\label{fimg2gray} \subsection{fimg2gray}\index{fimg2gray}\label{fimg2gray}
Nous avons vu dans ce document que chaque image flottante pouvait Nous avons vu dans ce document que chaque image flottante pouvait
avoir plusieurs plans de réalité. Il ne faut en négliger aucun. avoir plusieurs plans de réalité. Il ne faut en négliger aucun,
voire même tenter de les faire se rencontrer, se combiner et
s'influencer mutuellement.
Il faut quand même deviner que pour passer de l'espace RGB\index{RGB} Il faut quand même deviner que pour passer de l'espace RGB\index{RGB}
à une abstraction linéaire mono-dimensionnelle, il existe une foultitude à une abstraction linéaire mono-dimensionnelle, il existe une foultitude
de méthodes, toutes plus légitimes que les autres. de méthodes, toutes plus légitimes que les autres.
\index{procrastination} \index{procrastination}
Et face à l'incertitude du choix, j'ai reporté l'écriture de ce Et face à l'incertitude du choix, j'ai reporté l'écriture de ce
logiciel aux calendes grecques, voire même plus tard. logiciel aux calendes grecques, voire même plus tard,
après la grande pandémie\dots
% -------------------------
\subsection{cumulfimgs}\index{cumulfimgs}\label{cumulfimgs} \subsection{cumulfimgs}\index{cumulfimgs}\label{cumulfimgs}

View File

@ -90,6 +90,11 @@ fprintf(stderr, ">>> %25s ( '%s' '%s' %d )\n", __func__,
srcname, dstname, notused); srcname, dstname, notused);
#endif #endif
if (steps < 1) {
fprintf(stderr, "%s: steps MUST be > 0\n", __func__);
exit(1);
}
foo = fimg_fileinfos(srcname, infos); foo = fimg_fileinfos(srcname, infos);
if (foo) { if (foo) {
fprintf(stderr, "'%s' get dims -> %d\n", srcname, foo); fprintf(stderr, "'%s' get dims -> %d\n", srcname, foo);
@ -142,11 +147,13 @@ exit(0);
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int foo, opt; int foo, opt;
int steps = 16; int steps = 1;
float norm_val = 222.0; /* < 0 : don't normalize */ float norm_val = 222.0; /* < 0 : don't normalize */
char separator = ' ';
while ((opt = getopt(argc, argv, "hn:s:v")) != -1) { while ((opt = getopt(argc, argv, "f:hn:s:v")) != -1) {
switch(opt) { switch(opt) {
case 'f': separator = optarg[0]; break;
case 'v': verbosity++; break; case 'v': verbosity++; break;
case 'h': help(1); exit(1); case 'h': help(1); exit(1);
case 's': steps = atoi(optarg); break; case 's': steps = atoi(optarg); break;