adding fimg_get_minmax_rgb function

This commit is contained in:
tth 2020-03-02 01:19:57 +01:00
parent 248061f46b
commit 20da2de7fb
5 changed files with 101 additions and 12 deletions

View File

@ -117,6 +117,14 @@ quelques milliers d'images standard à 256 niveaux, sans trop avoir
à se soucier des éventuelles pertes de précision. Mais ça demande à se soucier des éventuelles pertes de précision. Mais ça demande
à être confirmé par des esprits supérieurs. à être confirmé par des esprits supérieurs.
\subsection{Dynamique}\index{dynamique}
Dynamique, précision et macheps.
\subsection{Pixel négatif ?}
Il est très difficle d'imaginer une lumière négative.
% ------------------------------------------------------------------- % -------------------------------------------------------------------
\section{Premier exemple}\index{exemple}\label{exemple} \section{Premier exemple}\index{exemple}\label{exemple}
@ -229,7 +237,7 @@ dans un emplacement approprié, par exemple
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
@ -313,6 +321,11 @@ toutes les informations nécessaires pour exploiter au mieux la dynamique
de notre image dans les étapes ultérieures, puisque la valeur de notre image dans les étapes ultérieures, puisque la valeur
maximale théorique est égale à $fval * count$. 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.
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.
@ -442,7 +455,7 @@ de contraste, il y a quelques explication en page \pageref{exemplefunc}.
\end{figure} \end{figure}
Rappelons qu'il est possible pour un logiciel applicatif Rappelons qu'il est possible pour un logiciel applicatif
comme \texttt{grabvidseq} (Cf page \pageref{grabvidseq}) comme \texttt{grabvidseq} (cf page \pageref{grabvidseq})
de renseigner deux champs du descripteur d'image avec des de renseigner deux champs du descripteur d'image avec des
données pertinentes. données pertinentes.
Ces deux champs sont \textit{fval} et \textit{count}. Ces deux champs sont \textit{fval} et \textit{count}.
@ -462,9 +475,12 @@ festive qu'il manquait des données dans la chaine de traitement.
L'autre façon de procéder est d'explorer notre image à la L'autre façon de procéder est d'explorer notre image à la
recherche de la valeur maximale. recherche de la valeur maximale.
La fonction \texttt{float fimg\_get\_maxvalue(\&fimg)} est La fonction \texttt{float fimg\_get\_maxvalue(\&fimg)} est
faite pour ça. prévue pour ça de façon sommaire.
C'est actuellement la méthode utilisée par l'outil qui C'est actuellement la méthode utilisée par l'outil qui
sert à faire les modifications de contraste (page \pageref{fimgfx}). sert à faire les modifications de contraste (page \pageref{fimgfx}).
On pourra aussi envisager d'utiliser
\texttt{fimg\_get\_minmax\_rgb(FloatImg *head, float mmvals[6])},
qui permet un contrôle bien plus fin des dérives.
La prochaine étape consistera à trouver une façon de faire La prochaine étape consistera à trouver une façon de faire
une égalisation\index{égalisation} par histogramme\index{histogramme} une égalisation\index{égalisation} par histogramme\index{histogramme}
@ -477,7 +493,7 @@ de pixel flottant.
Très prochainement, le retour du blitter\index{blitter}. Très prochainement, le retour du blitter\index{blitter}.
Et pour attendre, un truc improbable, voire même Et pour attendre, un truc improbable, voire même
inutile. inutile, en fait l'inverse de l'upscaling.
\begin{lstlisting} \begin{lstlisting}
/* module funcs/geometry.c */ /* module funcs/geometry.c */
@ -1070,10 +1086,11 @@ v4l2.
\subsection{grabvidseq}\index{grabvidseq}\label{grabvidseq} \subsection{grabvidseq}\index{grabvidseq}\label{grabvidseq}
Un logiciel en évolution, qui permet déja la capture d'images en Un logiciel en évolution (trop ?) lente, qui permet déja la capture
d'images en
\textsl{longue pose} selon la méthode du cumul\index{cumul}, et \textsl{longue pose} selon la méthode du cumul\index{cumul}, et
devrait bientôt retrouver sa capacité à enregistrer des devrait bientôt retrouver sa capacité à enregistrer des
séquences. séquences d'images.
\begin{verbatim} \begin{verbatim}
tth@debian:~/Devel/FloatImg/v4l2$ ./grabvidseq -h tth@debian:~/Devel/FloatImg/v4l2$ ./grabvidseq -h

View File

@ -127,8 +127,9 @@ int fimg_dump_to_file(FloatImg *head, char *fname, int notused);
int fimg_load_from_dump(char *fname, FloatImg *where); int fimg_load_from_dump(char *fname, FloatImg *where);
int fimg_create_from_dump(char *fname, FloatImg *head); int fimg_create_from_dump(char *fname, FloatImg *head);
/* mathematics operations */ /* mathematics operations */
float fimg_get_maxvalue(FloatImg *head); float fimg_get_maxvalue(FloatImg *head);
int fimg_get_minmax_rgb(FloatImg *head, float mmvals[6]);
int fimg_meanvalues(FloatImg *head, float means[4]); int fimg_meanvalues(FloatImg *head, float means[4]);
int fimg_to_gray(FloatImg *head); int fimg_to_gray(FloatImg *head);
void fimg_add_cste(FloatImg *fi, float value); void fimg_add_cste(FloatImg *fi, float value);

View File

@ -54,13 +54,21 @@ else {
foo = fimg_clone(&src, &dst, 0); foo = fimg_clone(&src, &dst, 0);
fimg_filter_3x3(&src, &dst, &filter_a);
foo = fimg_clamp_negativ(&dst);
if (foo) {
fprintf(stderr, "clamped %d negative pixels\n", foo);
}
foo = fimg_save_as_png(&dst, "f3x3a.png", 0);
// foo = fimg_save_as_pnm(&dst, "f3x3a.pnm", 0);
fimg_filter_3x3(&src, &dst, &filter_b); fimg_filter_3x3(&src, &dst, &filter_b);
foo = fimg_clamp_negativ(&dst); foo = fimg_clamp_negativ(&dst);
if (foo) { if (foo) {
fprintf(stderr, "clamped %d negativ pixels\n", foo); fprintf(stderr, "clamped %d negative pixels\n", foo);
} }
foo = fimg_save_as_png(&dst, "f3x3.png", 0); foo = fimg_save_as_png(&dst, "f3x3b.png", 0);
foo = fimg_save_as_pnm(&dst, "f3x3.pnm", 0); // foo = fimg_save_as_pnm(&dst, "f3x3a.pnm", 0);
fimg_destroy(&src); fimg_destroy(&dst); fimg_destroy(&src); fimg_destroy(&dst);

View File

@ -8,6 +8,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <float.h> /* for FLT_MAX */
#include <math.h> #include <math.h>
#include "../floatimg.h" #include "../floatimg.h"
@ -44,6 +45,45 @@ switch (head->type) {
return maxval; return maxval;
} }
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
/*
* mmval[0] <- min(R) mmval[1] <- max(R)
*/
int fimg_get_minmax_rgb(FloatImg *head, float mmvals[6])
{
int idx, surface;
float fval;
if (head->type != FIMG_TYPE_RGB) {
fprintf(stderr, "%s : type %d invalide\n",
__func__, head->type);
return -2;
}
surface = head->width * head->height;
mmvals[0] = FLT_MAX; mmvals[1] = -FLT_MAX;
mmvals[2] = FLT_MAX; mmvals[3] = -FLT_MAX;
mmvals[4] = FLT_MAX; mmvals[5] = -FLT_MAX;
for (idx=0; idx<surface; idx++) {
fval = head->R[idx];
if (fval < mmvals[0]) mmvals[0] = fval;
else if (fval > mmvals[1]) mmvals[1] = fval;
fval = head->G[idx];
if (fval < mmvals[2]) mmvals[2] = fval;
else if (fval > mmvals[3]) mmvals[3] = fval;
fval = head->B[idx];
if (fval < mmvals[4]) mmvals[4] = fval;
else if (fval > mmvals[5]) mmvals[5] = fval;
}
#if 0
for (foo=0; foo<6; foo++) {
fprintf(stderr, "%3d %g\n", foo, mmvals[foo]);
}
#endif
return -0;
}
/* ---------------------------------------------------------------- */
int fimg_meanvalues(FloatImg *head, float means[4]) int fimg_meanvalues(FloatImg *head, float means[4])
{ {
int idx, surface; int idx, surface;

27
lib/t.c
View File

@ -55,7 +55,7 @@ int essai_interpolate(int k)
FloatImg A, B, C; FloatImg A, B, C;
int foo, idx; int foo, idx;
char ligne[200]; char ligne[200];
float fval; float fval, minmax[6];
foo = fimg_create(&A, WI, HI, FIMG_TYPE_RGB); foo = fimg_create(&A, WI, HI, FIMG_TYPE_RGB);
if (foo) { if (foo) {
@ -176,6 +176,29 @@ return 0;
#undef TAILLE #undef TAILLE
/* ---------------------------------------------------------------- */
int essai_get_values(char *fname)
{
int foo;
FloatImg dessin;
float vals[6];
foo = fimg_create_from_dump(fname, &dessin);
if (foo) {
fprintf(stderr, "in %s, error %d loading '%s'\n",
__func__, foo, fname);
return foo;
}
fimg_get_minmax_rgb(&dessin, vals);
for (foo=0; foo<6; foo++) {
fprintf(stderr, "%7d %17.6g\n", foo, vals[foo]);
}
return -1;
}
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
int essai_contraste(char *fname) int essai_contraste(char *fname)
@ -250,7 +273,7 @@ if (verbosity) fimg_print_version(0);
// foo = essai_clone_et_copy(0); // foo = essai_clone_et_copy(0);
// fprintf(stderr, "retour essai clone'n'copy -> %d\n", foo); // fprintf(stderr, "retour essai clone'n'copy -> %d\n", foo);
foo = essai_interpolate(0); foo = essai_get_values("quux.fimg");
fprintf(stderr, "retour essai interpolate -> %d\n", foo); fprintf(stderr, "retour essai interpolate -> %d\n", foo);
return 0; return 0;