There are several different colors. Is there a way to determine which one is more saturated ?
There are several different colors. Is there a way to determine which one is more saturated ?
#include <stdio.h>
#include <math.h>
typedef struct {
double r;
double g;
double b;
} RGB;
typedef struct {
double h;
double s;
double v;
} HSV;
HSV rgb_to_hsv(RGB rgb) {
HSV hsv;
double min, max, delta;
min = rgb.r < rgb.g ? rgb.r : rgb.g;
min = min < rgb.b ? min : rgb.b;
max = rgb.r > rgb.g ? rgb.r : rgb.g;
max = max > rgb.b ? max : rgb.b;
hsv.v = max;
delta = max - min;
if (max > 0.0) {
hsv.s = (delta / max);
} else {
hsv.s = 0.0;
hsv.h = NAN;
return hsv;
}
if (rgb.r >= max)
hsv.h = (rgb.g - rgb.b) / delta;
else if (rgb.g >= max)
hsv.h = 2.0 + (rgb.b - rgb.r) / delta;
else
hsv.h = 4.0 + (rgb.r - rgb.g) / delta;
hsv.h *= 60.0;
if (hsv.h < 0.0)
hsv.h += 360.0;
return hsv;
}
void compare_saturation(RGB color1, RGB color2) {
HSV hsv1 = rgb_to_hsv(color1);
HSV hsv2 = rgb_to_hsv(color2);
if (hsv1.s > hsv2.s) {
printf("Color 1 (%.0f, %.0f, %.0f) is more saturated\n", color1.r * 255, color1.g * 255, color1.b * 255);
} else if (hsv2.s > hsv1.s) {
printf("Color 2 (%.0f, %.0f, %.0f) is more saturated\n", color2.r * 255, color2.g * 255, color2.b * 255);
} else {
printf("Both colors have the same saturation\n");
}
}
int main() {
RGB color1 = {1.0, 0.0, 0.0}; // Pure red
RGB color2 = {0.78, 0.39, 0.39}; // Less saturated red
compare_saturation(color1, color2);
return 0;
}Thank you, Antonio! Could you show the use of this example in FWH ?
#include "FiveWin.ch"
function Main()
local nRed := CLR_RED
local nRedLessSaturated := RGB( 255, 1, 1 )
MsgInfo( RGBTOHSV( nRed ) > RGBTOHSV( nRedLessSaturated ) )
return nil
#pragma BEGINDUMP
#include <hbapi.h>
#include <math.h>
typedef struct {
double r;
double g;
double b;
} RGB;
typedef struct {
double h;
double s;
double v;
} HSV;
HSV rgb_to_hsv(RGB rgb) {
HSV hsv;
double min, max, delta;
min = rgb.r < rgb.g ? rgb.r : rgb.g;
min = min < rgb.b ? min : rgb.b;
max = rgb.r > rgb.g ? rgb.r : rgb.g;
max = max > rgb.b ? max : rgb.b;
hsv.v = max;
delta = max - min;
if (max > 0.0) {
hsv.s = (delta / max);
} else {
hsv.s = 0.0;
hsv.h = NAN;
return hsv;
}
if (rgb.r >= max)
hsv.h = (rgb.g - rgb.b) / delta;
else if (rgb.g >= max)
hsv.h = 2.0 + (rgb.b - rgb.r) / delta;
else
hsv.h = 4.0 + (rgb.r - rgb.g) / delta;
hsv.h *= 60.0;
if (hsv.h < 0.0)
hsv.h += 360.0;
return hsv;
}
HB_FUNC( RGBTOHSV )
{
int color = hb_parnl( 1 );
RGB rgbColor;
HSV hsvColor;
rgbColor.r = (double)( color & 255 );
rgbColor.g = (double)( ( color >> 8 ) & 255 );
rgbColor.b = (double)( ( color >> 16 ) & 255 );
hsvColor = rgb_to_hsv( rgbColor );
hb_retnd( hsvColor.s );
}
#pragma ENDDUMPOkay, I'll try
#if !defined(NAN)
extern float _RTLENTRY _EXPDATA __ieee_32_p_nanq;
#define NAN __ieee_32_p_nanq
#endiflook for math.h and provide its path when compiling the C code
-Ic:\bcc77\include\windows\crtl
Antonio, thank you, program is quite working.
For example, I read pixel gaps (contours of areas on the map) with increasing red saturation and confidently received the most brightly colored pixel.
It would be quite good to specify the boundaries of the contour brightness. For example, when reading a contour, there is a sharp turn/break. In this case, I have to find a continuation of the contour (on maps, the contour does not consist of a single color )
For example, the pixel color is one of the shades of red. Is it possible to find out that this color is basically red? (similar to green, blue, etc.)
You could compare the red, green and blue values and check if they are near values
Thanks, I get it! How can I convert a color from a number to an RGB array ?
? hb_jsonEncode( int2rgb( 13882323 ) )
function Int2RGB( nColor )
local aRGB := { 0, 0, 0 }
aRGB[1] := Int( nColor / 65536 )
aRGB[2] := Int( ( nColor / 256 ) % 256 )
aRGB[3] := Int( nColor % 256 )
return aRGBThank you, Lailton !