C語言程式將RGB顏色模型轉換為HSV顏色模型


給定以整數形式表示的RGB顏色範圍;任務是透過轉換RGB顏色範圍來找到其相應的HSV顏色。

什麼是RGB顏色模型?

RGB顏色模型由三種顏色組成:紅色、綠色和藍色。RGB模型是一種廣泛應用於顯示技術的顏色模型;它是一種加色模型,其中我們將這三種顏色以不同的強度疊加,以在顯示裝置上產生數百萬種不同的顏色。

什麼是HSV顏色模型?

HSV顏色模型包含色相、飽和度、明度,也稱為HSB(色相、飽和度、亮度)。HSV是RGB顏色模型的另一種表示方式。它以人類視覺感知顏色屬性的方式對齊。由於其自然的顏色方案,這種顏色模型更常被藝術家使用。HSV的三個屬性可以是加色的,也可以是減色的。

程式中我們需要做什麼?

我們需要從使用者那裡獲取RGB模型值的輸入,然後用數學方法計算HSV顏色模型的輸出。

示例

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)

我們將使用的方法來解決給定的問題 -

  • 獲取3種顏色的輸入:紅色(r)、綠色(g)和藍色(b)。
  • 將所有顏色值除以255。
  • 現在計算cmax、cmin和差值。
  • 檢查 -
    • 如果cmax和cmin等於0,則色相或h將為0。
    • 如果cmax等於紅色(r),則色相(h) = (60 * ((g – b) / diff) + 360) % 360。
    • 如果cmax等於綠色(g),則色相(h) = (60 * ((b – r) / diff) + 120) % 360。
    • 如果cmax等於藍色(b),則色相(h) = (60 * ((r – g) / diff) + 240) % 360。
  • 要找到飽和度,我們將檢查 -
    • 如果cmax = 0,則飽和度(s) = 0。
    • 如果cmax不等於零,則飽和度(s) = (diff/cmax)*100
  • 明度計算 -
    • 明度(v) = cmax *100

演算法

Start
Step 1 -> In function float max(float a, float b, float c)
   Return (a > b)? (a > c ? a : c) : (b > c ? b : c)
Step 2 -> In function float min(float a, float b, float c)
   Return (a < b)? (a < c ? a : c) : (b < c ? b : c)
Step 3 -> In function int rgb_to_hsv(float r, float g, float b)
   Declare float h, s, v
      Set r = r / 255.0
      Set g = g / 255.0
      Set b = b / 255.0
      Set cmax = max(r, g, b)
      Set cmin = min(r, g, b)
      Set diff = cmax-cmin
      If cmax == cmin then,
         Set h = 0
      End if
      Else if cmax == r then,
         Set h = fmod((60 * ((g - b) / diff) + 360), 360.0)
      End Else if
      Else if cmax == g then,
         Set h = fmod((60 * ((b - r) / diff) + 120), 360.0)
      End Else if
      Else if cmax == b then,
         Set h = fmod((60 * ((r - g) / diff) + 240), 360.0)
      End Else if
         If cmax == 0 then,
         Set s = 0
      End if
      Else
         Set s = (diff / cmax) * 100
      End Else
      v = cmax * 100;
      Print h, s, v
      Step 4 -> int main(int argc, char const *argv[])
      Declare and initialize r = 45, g = 215, b = 0
      Call function 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 values are divided by 255
   // to change the range from 0..255 to 0..1:
   float h, s, v;
   r /= 255.0;
   g /= 255.0;
   b /= 255.0;
   float cmax = max(r, g, b); // maximum of r, g, b
   float cmin = min(r, g, b); // minimum of r, g, b
   float diff = cmax-cmin; // diff of cmax and 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);
   // if cmax equal zero
      if (cmax == 0)
         s = 0;
      else
         s = (diff / cmax) * 100;
   // compute v
   v = cmax * 100;
   printf("h s v=(%f, %f, %f)
", h, s, v );    return 0; } //main function int main(int argc, char const *argv[]) {    int r = 45, g = 215, b = 0;    rgb_to_hsv(r, g, b);    return 0; }

輸出

h s v=(107.441864, 100.000000, 84.313728)

更新於: 2019年11月20日

2K+ 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告