English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Programa C que cambia el modelo de color RGB al modelo de color HSV

Dada la gama de colores RGB (en forma de entero); la tarea es encontrar el HSV adecuado para la gama de colores RGB a través de la conversión.

¿Qué es el modelo de color RGB?

El modelo de color RGB está compuesto por los colores rojo, verde y azul. El modelo RGB es un modelo de color ampliamente utilizado en tecnologías de visualización. Es un modelo acumulativo, donde sumamos estos tres colores de diferentes intensidades para producir millones de colores diferentes en el dispositivo de visualización.

¿Qué es el modelo de color HSV?

El modelo de color HSV incluye matiz, saturación, valor, también conocido como HSB (matiz, saturación, brillo). HSV es una representación substituta del modelo de color RGB. Se ajusta de acuerdo con las propiedades de percepción visual del color humano. Debido a su paleta de colores natural, este modelo de color se utiliza a menudo por los artistas. Las tres propiedades de HSV se pueden sumar o restar.

Lo que debemos hacer en el programa

Debemos obtener la entrada del usuario en valores del modelo RGB y luego calcular matemáticamente la salida del modelo de color HSV.

Ejemplo

Entrada: r = 31, g = 52, b = 29
Salida: h s v = (114.782608, 44.230770, 20.392157)
Entrada: r = 129, g = 88, b = 47
Salida: h s v = (30.000000, 63.565895, 50.588238)

La metodología que utilizaremos para resolver el problema dado-

  • Se ingresa con los colores rojo (r), verde (g) y azul (b) en tres colores.

  • Dividiremos todos los valores de color por255.

  • Ahora calculamos cmax, cmin y la diferencia.

  • Verificar-

    • Si cmax y cmin son iguales a 0, entonces el matiz o h será 0.

    • Si cmax es igual a Red(r), entonces el matiz (h) = (60 *((g – b)/ diff)+ 360) %360.

    • Si cmax es igual a Green(g), entonces el matiz (h) = (60 *((b – r)/ diff)+ 120) %360.

    • Si cmax es igual a Blue(b), entonces el matiz (h) = (60 *((r – g)/ diff)+ 240) %360.

  • Para encontrar la saturación, verificaremos-

    • Si cmax = 0, entonces la saturación (s) = 0.

    • Si cmax no es cero, entonces, la saturación (s) = (diff / cmax)* 100

  • Cálculo del valor-

    • Valor(v) = cmax * 100

Algoritmo

Inicio
Paso 1 -> En la función float max(float a, float b, float c)
   Retornar (a > b) ? (a > c ? a : c) : (b > c ? b : c)
Paso 2 -> En la función float min(float a, float b, float c)
   Retornar (a < b) ? (a < c ? a : c) : (b < c ? b : c)
Paso 3 -> En la función int rgb_to_hsv(float r, float g, float b)
   Declarar float h, s, v
      Establecer r = r / 255.0
      Establecer g = g / 255.0
      Establecer b = b / 255.0
      Establecer cmax = max(r, g, b)
      Establecer cmin = min(r, g, b)
      Establecer diff = cmax-cmin
      Si cmax == cmin entonces,
         Establecer h = 0
      Fin if
      Else if cmax == r then,
         Establecer h = fmod((60 * ((g - b) / diff) + 360), 360.0)
      Fin Else if
      Else if cmax == g then,
         Establecer h = fmod((60 * ((b - r) / diff) + 120), 360.0)
      Fin Else if
      Else if cmax == b then,
         Establecer h = fmod((60 * ((r - g) / diff) + 240), 360.0)
      Fin Else if
         Si cmax == 0 entonces,
         Establecer s = 0
      Fin if
      Else
         Establecer s = (diff / cmax) * 100
      Fin Else
      v = cmax * 100;
      Imprimir h, s, v
      Paso 4 -> int main(int argc, char const *argv[])
      Declarar e inicializar r = 45, g = 215, b = 0
      Llame a la función rgb_to_hsv(r, g, b)
Detener

Ejemplo

#include <stdio.h>
#include <math.h>
float max(float a, float b, float c) {
   return ((a > b) ? (a > c ? a : c) : (b > c ? b : c));
}
float min(float a, float b, float c) {
   return ((a < b)? (a < c ? a : c) : (b < c ? b : c));
}
int rgb_to_hsv(float r, float g, float b) {
   //Valores de R, G, B divididos por255-
   //Cambiar el rango de 0..255Cambiar a 0..1:
   float h, s, v;
   r /= 255.0;
   g /= 255.0;
   b /= 255.0;
   float cmax = max(r, g, b); // máximo de r, g, b
   float cmin = min(r, g, b); // mínimo de r, g, b
   float diff = cmax-cmin; // diferencia de cmax y cmin.
   if (cmax == cmin)
      h = 0;
   else if (cmax == r)
      h = fmod((60 * ((g - b) / diff) + 360), 360.0);
   else if (cmax == g)
      h = fmod((60 * ((b - r) / diff) + 120), 360.0);
   else if (cmax == b)
      h = fmod((60 * ((r - g) / diff) + 240), 360.0);
   //Si cmax es cero
      if (cmax == 0)
         s = 0;
      else
         s = (diff / cmax) * 100;
   //Calcular v-
   v = cmax * 100;
   printf("h s v=(%f, %f, %f)\n", h, s, v );
   return 0;
}
//Función principal
int main(int argc, char const *argv[]) {
   int r = 45, g = 215, b = 0;
   rgb_to_hsv(r, g, b);
   return 0;
}

Resultado de salida

h s v=(107.441864, 100.000000, 84.313728)