adding HSV functions, with native bugs

This commit is contained in:
Tonton Th 2020-09-08 22:55:17 +02:00
parent 3cf887e103
commit 44165c0a03
3 changed files with 109 additions and 4 deletions

View File

@ -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 $<

95
funcs/hsv.c Normal file
View File

@ -0,0 +1,95 @@
/*
* FloatImg library
* HUE - SATURATION - VALUE
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#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;
}
/* --------------------------------------------------------------------- */

View File

@ -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);