Merge branch 'master' of ssh://tetalab.org:2213/tTh/FloatImg

Ok
This commit is contained in:
tonton Th 2019-12-04 11:29:19 +01:00
commit 9e4b0e795c
5 changed files with 74 additions and 11 deletions

View File

@ -317,7 +317,8 @@ dans l'upscaling.} effectuées.
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. C'est la méthode utilisée par l'outil qui faite pour ça.
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}.
\vspace{1em} \vspace{1em}
@ -370,7 +371,8 @@ return 0;
\end{verbatim} \end{verbatim}
Je vous laisse imaginer les dégats que peut faire cette Je vous laisse imaginer les dégats que peut faire cette
fontion en utilisation réelle. fontion en utilisation réelle. Mieux, je vous propose
d'essayer par vous-même.
En particulier tout le reste du code qui suppose qu'un pixel En particulier tout le reste du code qui suppose qu'un pixel
ne peut \textbf{pas} être négatif. ne peut \textbf{pas} être négatif.
Vous pouvez aussi remarquer qu'il n'y a pas de controle Vous pouvez aussi remarquer qu'il n'y a pas de controle
@ -438,7 +440,8 @@ en première approche, alors commençont par le plus simple,
les valeurs moyennes de chaque composante. les valeurs moyennes de chaque composante.
Puis nous rajouterons\footnote{Les patchs sont les bienvenus} Puis nous rajouterons\footnote{Les patchs sont les bienvenus}
le calcul de la variance\index{variance}. le calcul de la variance\index{variance}. Les compétences
de \texttt{schmod777} sont attendues au dd2\index{dd2}.
\subsection{fimgfx}\index{fimgfx}\label{fimgfx} \subsection{fimgfx}\index{fimgfx}\label{fimgfx}
@ -446,6 +449,17 @@ le calcul de la variance\index{variance}.
Attention, je vais expérimenter un parsing un peu étrange Attention, je vais expérimenter un parsing un peu étrange
sur les arguments de la ligne de commande. coredump expected.} sur les arguments de la ligne de commande. coredump expected.}
\vspace{1em}
À l'heure actuelle\footnote{décembre 2019, vers 15:30}, nous avons
déja quelques ajustements basiques de contraste.
\begin{verbatim}
tth@daubian:~/Devel/FloatImg/tools$ ./fimgfx -v -h
--- fimg special effects ---
cos01 cos010 pow2 sqrt
\end{verbatim}
\subsection{fimgops}\index{fimgops}\label{fimgops} \subsection{fimgops}\index{fimgops}\label{fimgops}
Quelques opérations diverses entre deux images, qui doivent être Quelques opérations diverses entre deux images, qui doivent être

View File

@ -2,7 +2,7 @@
* floatimg.h * floatimg.h
*/ */
#define FIMG_VERSION 78 #define FIMG_VERSION 80
/* /*
* in memory descriptor * in memory descriptor
@ -41,6 +41,7 @@ typedef struct {
#define CONTRAST_SQRT 1 #define CONTRAST_SQRT 1
#define CONTRAST_POW2 2 #define CONTRAST_POW2 2
#define CONTRAST_COS01 3 #define CONTRAST_COS01 3
#define CONTRAST_COS010 4
/* /*
* core module * core module
@ -83,7 +84,7 @@ int fimg_id_contraste(char *name);
int fimg_square_root(FloatImg *s, FloatImg *d, double maxval); int fimg_square_root(FloatImg *s, FloatImg *d, double maxval);
int fimg_power_2(FloatImg *s, FloatImg *d, double maxval); int fimg_power_2(FloatImg *s, FloatImg *d, double maxval);
int fimg_cos_01(FloatImg *s, FloatImg *d, double maxval); int fimg_cos_01(FloatImg *s, FloatImg *d, double maxval);
int fimg_cos_010(FloatImg *s, FloatImg *d, double maxval);
int fimg_mk_gray_from(FloatImg *src, FloatImg*dst, int k); int fimg_mk_gray_from(FloatImg *src, FloatImg*dst, int k);

View File

@ -20,6 +20,7 @@ if (!strcmp(str, "none")) return CONTRAST_NONE;
if (!strcmp(str, "sqrt")) return CONTRAST_SQRT; if (!strcmp(str, "sqrt")) return CONTRAST_SQRT;
if (!strcmp(str, "pow2")) return CONTRAST_POW2; if (!strcmp(str, "pow2")) return CONTRAST_POW2;
if (!strcmp(str, "cos01")) return CONTRAST_COS01; if (!strcmp(str, "cos01")) return CONTRAST_COS01;
if (!strcmp(str, "cos010")) return CONTRAST_COS010;
return -1; return -1;
} }
@ -132,6 +133,38 @@ for (idx=0; idx<nbre; idx++) {
return 0; return 0;
} }
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
int fimg_cos_010(FloatImg *s, FloatImg *d, double maxval)
{
int nbre, idx;
double dval;
if (s->type != FIMG_TYPE_RGB) {
fprintf(stderr, "%s : type %d invalide\n",
__func__, s->type);
return -4;
}
if (NULL==d) {
d = s;
}
else {
if (d->type != FIMG_TYPE_RGB) {
fprintf(stderr, "%s : dst type %d invalide\n",
__func__, d->type);
return -4;
}
}
nbre = s->width * s->height * 3;
for (idx=0; idx<nbre; idx++) {
dval = s->R[idx] / maxval;
d->R[idx] = maxval * (0.5 - 0.5 * cos(2*3.141592654*dval));
}
return 0;
}
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */

View File

@ -19,10 +19,11 @@ typedef struct {
int nbarg; int nbarg;
} Fx; } Fx;
enum fxid { Fx_cos01, Fx_pow2, Fx_sqrt }; enum fxid { Fx_cos01, Fx_cos010, Fx_pow2, Fx_sqrt };
Fx fx_list[] = { Fx fx_list[] = {
{ "cos01", Fx_cos01, 0 }, { "cos01", Fx_cos01, 0 },
{ "cos010", Fx_cos010, 0 },
{ "pow2", Fx_pow2, 0 }, { "pow2", Fx_pow2, 0 },
{ "sqrt", Fx_sqrt, 0 }, { "sqrt", Fx_sqrt, 0 },
{ NULL, 0, 0 } { NULL, 0, 0 }
@ -52,11 +53,14 @@ return -1;
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static void help(int lvl) static void help(int lvl)
{ {
Fx *fx;
printf("fimg special effects (%d)\n", lvl); puts("--- fimg special effects ---");
printf("\t");
for (fx=fx_list; fx->name; fx++) {
printf("%s ", fx->name);
}
puts("");
exit(0); exit(0);
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
@ -88,6 +92,8 @@ if (foo) {
switch (act) { switch (act) {
case Fx_cos01: case Fx_cos01:
fimg_cos_01(&src, &dest, maxval); break; fimg_cos_01(&src, &dest, maxval); break;
case Fx_cos010:
fimg_cos_010(&src, &dest, maxval); break;
case Fx_pow2: case Fx_pow2:
fimg_power_2(&src, &dest, maxval); break; fimg_power_2(&src, &dest, maxval); break;
case Fx_sqrt: case Fx_sqrt:

View File

@ -122,6 +122,10 @@ FloatImg cumul;
while ((opt = getopt(argc, argv, "c:d:ghn:o:O:p:s:uv")) != -1) { while ((opt = getopt(argc, argv, "c:d:ghn:o:O:p:s:uv")) != -1) {
switch(opt) { switch(opt) {
case 'c': contrast = fimg_id_contraste(optarg); case 'c': contrast = fimg_id_contraste(optarg);
if (contrast < 0) {
fputs("unknow contrast\n", stderr);
exit(1);
}
break; break;
case 'd': dev_name = optarg; break; case 'd': dev_name = optarg; break;
case 'g': to_gray = 1; break; case 'g': to_gray = 1; break;
@ -234,8 +238,10 @@ cumul.count = 0;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE; type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
xioctl(fd, VIDIOC_STREAMON, &type); xioctl(fd, VIDIOC_STREAMON, &type);
#if 0
if (verbosity) fprintf(stderr,"pid %d grabbing %d picz...\n", if (verbosity) fprintf(stderr,"pid %d grabbing %d picz...\n",
getpid(), nbre_capt); getpid(), nbre_capt);
#endif
for (i = 0; i < nbre_capt; i++) { for (i = 0; i < nbre_capt; i++) {
do { do {
@ -331,7 +337,7 @@ if (verbosity) {
} }
switch (contrast) { switch (contrast) {
case CONTRAST_NONE: case CONTRAST_NONE:
fprintf(stderr, "contrast: none\n"); // if (verbosity) fprintf(stderr, "contrast: none\n");
break; break;
case CONTRAST_SQRT: case CONTRAST_SQRT:
fimg_square_root(&cumul, NULL, maxvalue); fimg_square_root(&cumul, NULL, maxvalue);
@ -342,6 +348,9 @@ switch (contrast) {
case CONTRAST_COS01: case CONTRAST_COS01:
fimg_cos_01(&cumul, NULL, maxvalue); fimg_cos_01(&cumul, NULL, maxvalue);
break; break;
case CONTRAST_COS010:
fimg_cos_010(&cumul, NULL, maxvalue);
break;
default: default:
fprintf(stderr, "bad contrast method\n"); fprintf(stderr, "bad contrast method\n");
break; break;