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

C-Programm, um das RGB-Farbmuster in das HSV-Farbmuster umzuwandeln

Der gegebene RGB-Farbraum (in Integerform); die Aufgabe ist es, durch Konvertierung des RGB-Farbraums einen geeigneten HSV-Farbton zu finden

Was ist das RGB-Farbraummodell?

Das RGB-Farbraummodell besteht aus den Farben Rot, Grün und Blau. Das RGB-Modell ist ein weit verbreitetes Farbmodell in der Displaytechnologie. Es ist ein Additionsmodell, bei dem wir diese drei Farben mit verschiedenen Intensitäten addieren, um auf Displaygeräten Millionen verschiedener Farben zu erzeugen.

Was ist das HSV-Farbraummodell?

Das HSV-Farbraummodell umfasst Farbton, Sättigung, Wert und wird auch als HSB (Farbton, Sättigung, Helligkeit) bezeichnet. HSV ist eine Alternative Darstellung des RGB-Farbraummodells. Es wird so angepasst, dass es dem menschlichen Farbempfinden entspricht. Aufgrund seiner natürlichen Farbkombination wird dieses Farbmodell oft von Künstlern verwendet. Die drei Eigenschaften von HSV können addiert oder subtrahiert werden.

Was wir im Programm tun müssen

Wir müssen die Eingaben des Benutzers für die RGB-Modellwerte erhalten und dann mathematisch die Ausgabe im HSV-Farbraum berechnen.

示例

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

Wir werden das Verfahren verwenden, um das gegebene Problem zu lösen-

  • Mit den Farben Rot (r), Grün (g) und Blau (b) wird als Eingabe gegeben.

  • Dividieren wir alle Farbwerte durch255.

  • Jetzt berechnen wir cmax, cmin und den Unterschied.

  • Überprüfen-

    • Wenn cmax und cmin gleich 0 sind, beträgt der Farbton oder h 0.

    • Wenn cmax gleich Red(r) ist, beträgt der Farbton (h) = (60 *((g – b)/ diff)+ 360) %360.

    • Wenn cmax gleich Green(g) ist, beträgt der Farbton (h) = (60 *((b – r)/ diff)+ 120) %360.

    • Wenn cmax gleich Blue(b) ist, beträgt der Farbton (h) = (60 *((r – g)/ diff)+ 240) %360.

  • Um die Sättigung zu finden, werden wir überprüfen-

    • Wenn cmax = 0, beträgt die Sättigung (s) 0.

    • Wenn cmax ungleich Null ist, dann ist der Sättigkeitsgrad (s) = (diff / cmax)* 100

  • Wertsberechnung-

    • Wert(v) = cmax * 100

Algorithmus

Start
Schritt 1 -> In der Funktion float max(float a, float b, float c)
   Rückgabe (a > b) ? (a > c ? a : c) : (b > c ? b : c)
Schritt 2 -> In der Funktion float min(float a, float b, float c)
   Rückgabe (a < b) ? (a < c ? a : c) : (b < c ? b : c)
Schritt 3 -> In der Funktion int rgb_to_hsv(float r, float g, float b)
   Erklärung von float h, s, v
      Setze r = r / 255.0
      Setze g = g / 255.0
      Setze b = b / 255.0
      Setze cmax = max(r, g, b)
      Setze cmin = min(r, g, b)
      Setze diff = cmax-cmin
      Wenn cmax == cmin dann,
         Setze h = 0
      Ende Wenn
      Weniger Wenn cmax == r dann,
         Setze h = fmod((60 * ((g - b) / diff) + 360), 360.0)
      Ende Wenn nicht Wenn
      Weniger Wenn cmax == g dann,
         Setze h = fmod((60 * ((b - r) / diff) + 120), 360.0)
      Ende Wenn nicht Wenn
      Weniger Wenn cmax == b dann,
         Setze h = fmod((60 * ((r - g) / diff) + 240), 360.0)
      Ende Wenn nicht Wenn
         Wenn cmax == 0 dann,
         Setze s = 0
      Ende Wenn
      Weniger
         Setze s = (diff / cmax) * 100
      Ende Wenn nicht
      v = cmax * 100;
      Drucke h, s, v aus
      Schritt 4 -> int main(int argc, char const *argv[])
      Erklärung und Initialisierung von r = 45, g = 215, b = 0
      Aufruf der Funktion rgb_to_hsv(r, g, b)
Stop

示例

#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) {
   //R,G,B-Werte durch255-
   //den Bereich von 0..255in 0..1:
   float h, s, v;
   r /= 255.0;
   g /= 255.0;
   b /= 255.0;
   float cmax = max(r, g, b); // Maximum von r, g, b
   float cmin = min(r, g, b); // Minimum von r, g, b
   float diff = cmax-cmin; // Differenz von cmax und 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);
   //wenn cmax gleich null
      if (cmax == 0)
         s = 0;
      else
         s = (diff / cmax) * 100;
   //berechnen v-
   v = cmax * 100;
   printf("h s v=(%f, %f, %f)\n", h, s, v );
   return 0;
}
//Hauptfunktion
int main(int argc, char const *argv[]) {
   int r = 45, g = 215, b = 0;
   rgb_to_hsv(r, g, b);
   return 0;
}

Ausgabewert

h s v=(107.441864, 100.000000, 84.313728)