diff --git a/funcs/Makefile b/funcs/Makefile index 67f3b62b..147d364f 100644 --- a/funcs/Makefile +++ b/funcs/Makefile @@ -4,7 +4,8 @@ COPT = -Wall -fpic -g -no-pie -DDEBUG_LEVEL=0 DEPS = ../floatimg.h Makefile OBJS = fimg-png.o fimg-tiff.o misc-plots.o filtrage.o utils.o \ fimg-libpnm.o rampes.o sfx0.o geometry.o rotate.o \ - equalize.o fimg-fits.o saturation.o histogram.o + equalize.o fimg-fits.o saturation.o histogram.o \ + hsv.o #--------------------------------------------------------------- @@ -57,5 +58,8 @@ sfx0.o: sfx0.c $(DEPS) rampes.o: rampes.c $(DEPS) gcc $(COPT) -c $< +hsv.o: hsv.c $(DEPS) + gcc $(COPT) -c $< + utils.o: utils.c $(DEPS) gcc $(COPT) -c $< diff --git a/funcs/hsv.c b/funcs/hsv.c new file mode 100644 index 00000000..ba70b0b8 --- /dev/null +++ b/funcs/hsv.c @@ -0,0 +1,95 @@ +/* + * FloatImg library + * HUE - SATURATION - VALUE + */ + +#include +#include +#include +#include +#include "../floatimg.h" + +extern int verbosity; + +/* --------------------------------------------------------------------- */ +/* helper functions */ +static float maxi3f(float a, float b, float c) +{ +return ((a > b)? (a > c ? a : c) : (b > c ? b : c)); +} +static float mini3f(float a, float b, float c) +{ +return ((a < b)? (a < c ? a : c) : (b < c ? b : c)); +} +static int pseudoeq(float a, float b) +{ +return (fabsf(a-b)<0.00000000000001); // UGLY HACK ??? +} +/* --------------------------------------------------------------------- */ +/* + * WARNING : ALL THIS CODE IS SHIT + */ +int fimg_rgb2hsv(float rgb[3], float hsv[3], float scale) +{ +// float h, s, v; +float cmin, cmax, diff; + +// scale input value to [0..1] +rgb[0] /= scale; rgb[1] /= scale; rgb[2] /= scale; + +hsv[0] = hsv[1] = hsv[2] = -12345.6789; + +cmin = mini3f(rgb[0], rgb[1], rgb[2]); +cmax = maxi3f(rgb[0], rgb[1], rgb[2]); +diff = cmax - cmin; + +if (pseudoeq(cmax, cmin)) hsv[0] = 0.0; +else if (pseudoeq(cmax, rgb[0])) + hsv[0] = fmod((60 * ((rgb[1] - rgb[2]) / diff) + 360), 360.0); +else if (pseudoeq(cmax, rgb[1])) + hsv[0] = fmod((60 * ((rgb[2] - rgb[0]) / diff) + 120), 360.0); +else if (pseudoeq(cmax, rgb[2])) + hsv[0] = fmod((60 * ((rgb[0] - rgb[1]) / diff) + 240), 360.0); + +if (pseudoeq(cmax, 0.0)) hsv[1] = 0.0; +else hsv[1] = (diff / cmax) / 100.0; + +hsv[2] = cmax * 100.0; /* WHAT THE FUCK ? */ + +#if DEBUG_LEVEL +fprintf(stderr, "cmin/cmax %f %f\n", cmin, cmax); +#endif + +return 0; +} +/* --------------------------------------------------------------------- */ +int fimg_essai_hsv(char *fname) +{ +float colors[3], values[3]; +int foo, r, g, b; + +#define INC 16 +for (r=0; r<255; r+=INC) { + for (g=0; g<255; g+=INC) { + for (b=0; b<255; b+=INC) { + + printf("%4d %4d %4d ", r, g, b); + + colors[0] = (float)r; + colors[1] = (float)g; + colors[2] = (float)b; + foo = fimg_rgb2hsv(colors, values, 255.0); + if (foo) { + exit(1); + } + + printf(" %9.5f %9.5f %9.5f\n", + values[0], values[1], values[2]); + + } + } +} + +return -1; +} +/* --------------------------------------------------------------------- */ diff --git a/funcs/t.c b/funcs/t.c index 0805507b..c8afb2b8 100644 --- a/funcs/t.c +++ b/funcs/t.c @@ -402,8 +402,10 @@ return 0; } /* --------------------------------------------------------------------- */ - /* func in histogram.c */ -int fimg_essai_histo(FloatImg *src, char *outpic, int k); + +int fimg_essai_histo(FloatImg *src, char *outpic, int k); /* histogram.c */ +int fimg_essai_hsv(char *fname); /* hsv.c */ + int essai_histogramme(char *fname, int k) { @@ -432,7 +434,7 @@ return 0; } /* --------------------------------------------------------------------- */ enum nCmd { Equalize=1, Rotate, Sfx0, F3x3, MIRE, Wfits, Wpng, Wtiff, - Histo }; + Histo, Hsv }; typedef struct { char *name; int Cmd; @@ -448,6 +450,7 @@ Command commands[] = { { "wpng", Wpng }, { "wtiff", Wtiff }, { "histo", Histo }, + { "hsv", Hsv }, { NULL, 0 } } ; @@ -541,6 +544,9 @@ switch(opt) { case Histo: foo = essai_histogramme(filename, 98765); break; + case Hsv: + foo = fimg_essai_hsv(filename); + break; default: fprintf(stderr, "%s : bad command\n", command); exit(1);