libtthimage/Lib/classif.c

175 lines
3.9 KiB
C

/*
* classif.c novembre 2002
* --------- -------------
*/
#include <stdio.h>
#include <math.h>
#include "../tthimage.h"
/*::------------------------------------------------------------------::*/
/*
* A vrai dire, je ne sais pas trop comment traiter ce genre
* de truc. Il va falloir que je me documente serieusement.
*/
static Une_Classe_Sph classes[] =
{
{ 64, 64, 64, 50, 128, 128, 128 },
{ 64, 192, 64, 50, 128, 255, 128 },
{ 64, 64, 192, 50, 128, 128, 255 },
{ 64, 192, 192, 50, 255, 255, 255 },
{ 192, 64, 64, 50, 255, 128, 128 },
{ 192, 192, 64, 50, 255, 255, 128 },
{ 192, 64, 192, 50, 255, 128, 255 },
{ 192, 192, 192, 50, 255, 255, 255 }
};
#define NBC (sizeof(classes)/sizeof(Une_Classe_Sph))
#define CUB(x) ((x)*(x))
/*::------------------------------------------------------------------::*/
int
Image_classif_0(Image_Desc *src, Image_Desc *dst)
{
int foo, x, y, z, r, g, b, plotted;
long nbrplot;
if ( (foo=Image_compare_desc(src, dst)) )
{
fprintf(stderr, "Image classif 0: images are differents %d\n", foo);
return foo;
}
#if DEBUG_LEVEL
fprintf(stderr, "Classif 0: nombre de classes = %d\n", NBC);
#endif
nbrplot = 0;
for (y=0; y<src->height; y++)
{
for (x=0; x<src->width; x++)
{
Image_getRGB(src, x, y, &r, &g, &b);
plotted = 0;
for (foo=0; foo<(int)NBC; foo++)
{
z = CUB(r-classes[foo].rc) +
CUB(g-classes[foo].gc) +
CUB(b-classes[foo].bc);
if (z < CUB(classes[foo].rad))
{
Image_plotRGB(dst, x, y,
classes[foo].r, classes[foo].g, classes[foo].b);
plotted = 1;
nbrplot++;
break;
}
}
if ( ! plotted ) Image_plotRGB(dst, x, y, 0, 0, 0);
} /* fin for x */
}
dst->modified = 1;
#if DEBUG_LEVEL
fprintf(stderr, " plotted: %ld / %d : %4.2f %%\n", nbrplot,
src->width*src->height,
((float)nbrplot)/(float)(src->width*src->height) * 100.0);
#endif
return FUNC_IS_BETA;
}
/*::------------------------------------------------------------------::*/
/* new 14 mai 2007, avenue St Exupery */
int
Image_classif_1(Image_Desc *src, Image_Desc *dst,
Une_Classe_Sph *classes, int nbrclasses, int flag)
{
int foo, x, y, z, r, g, b, plotted;
long nbrplot;
if ( (foo=Image_compare_desc(src, dst)) ) {
fprintf(stderr, "Image classif 1: images are differents %d\n", foo);
return foo;
}
#if DEBUG_LEVEL
fprintf(stderr, " Classif 1: nombre de classes = %d\n", nbrclasses);
fprintf(stderr, " Classif 1: flag is %d\n", flag);
#endif
nbrplot = 0;
for (y=0; y<src->height; y++)
{
for (x=0; x<src->width; x++)
{
Image_getRGB(src, x, y, &r, &g, &b);
plotted = 0;
for (foo=0; foo<nbrclasses; foo++)
{
z = CUB(r-classes[foo].rc) +
CUB(g-classes[foo].gc) +
CUB(b-classes[foo].bc);
if (z < CUB(classes[foo].rad))
{
if (flag)
Image_plotRGB(dst, x, y,
classes[foo].r, classes[foo].g, classes[foo].b);
else
Image_plotRGB(dst, x, y, r, g, b);
plotted = 1;
nbrplot++;
break;
}
} /* fin for classe */
if ( ! plotted ) Image_plotRGB(dst, x, y, 0, 0, 0);
} /* fin for x */
}
dst->modified = 1;
#if DEBUG_LEVEL
fprintf(stderr, " plotted: %ld / %d\n", nbrplot, src->width*src->height);
#endif
return FUNC_NOT_FINISH;
}
/*::------------------------------------------------------------------::*/
int Image_display_classes(Une_Classe_Sph *cla, int nbr, char *texte, int flags)
{
int foo;
#if DEBUG_LEVEL
fprintf(stderr, "%s ( %p %4d $%04x %s )\n", __func__, cla, nbr, flags, texte);
#endif
if (flags) {
fprintf(stderr, "%s --> flags 0x%04X !\n", __func__, flags);
/* return error ? */
}
for (foo=0; foo<nbr; foo++) {
printf("%3d '%-20s' ", foo, texte);
printf("%5d %5d %5d ", cla[foo].rc, cla[foo].gc, cla[foo].bc) ;
puts("");
}
puts("-- "); /* #include <sigrot.h> */
return FUNC_IS_BETA;
}
/*::------------------------------------------------------------------::*/