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

RGBカラーモデルをHSVカラーモデルに変更するCプログラム

与えられたRGB色範囲(整数形式);RGB色範囲をHSV色に変換するタスク

RGB色モデルとは何ですか

RGB色モデルは赤、緑、青の3つの色で構成されています。RGBモデルは表示技術で広く使用される色モデルです。これは累加モデルであり、異なる強度のこれらの3つの色を加算して、表示デバイス上に数百万種類の異なる色を生成します。

HSV色モデルとは何ですか?

HSV色モデルは色相、飽和度、値を含みます。またHSB(色相、飽和度、明度)と呼ばれます。HSVはRGB色モデルの代替表示です。人間の視覚感知に基づいて調整されています。自然な配色スキーマにより、この色モデルは芸術家によってよく使用されます。HSVの3つの属性は加算および減算ができます。

プログラムで行うこと

ユーザーからRGBモデルの値を取得し、それを数学的に計算してHSV色モデルの出力を得なければなりません。

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

私たちが問題を解決するために使用する方法-

  • 赤(r)、緑(g)および青(b)の3つの色で入力されます。

  • すべての色値を除以255。

  • 今、cmax、cminおよび差を計算します。

  • 確認します-

    • もしcmaxとcminが0に等しい場合、色相またはhは0になります。

    • もしcmaxがRed(r)に等しい場合、色相(h)=(60 *((g – b)/ diff)+ 360)%360。

    • もしcmaxがGreen(g)に等しい場合、色相(h)=(60 *((b – r)/ diff)+ 120)%360。

    • もしcmaxがBlue(b)に等しい場合、色相(h)=(60 *((r – g)/ diff)+ 240)%360。

  • 飽和度を見つけるために、以下を確認します-

    • もしcmaxが0の場合、飽和度(s)は0です。

    • cmaxが0でない場合、則は饱和度(s) = (diff / cmax)* 100

  • 値計算-

    • 値(v) = cmax * 100

アルゴリズム

開始
ステップ 1 -> function float max(float a, float b, float c)
   return (a > b) ? (a > c ? a : c) : (b > c ? b : c)
ステップ 2 -> function float min(float a, float b, float c)
   return (a < b) ? (a < c ? a : c) : (b < c ? b : c)
ステップ 3 -> function int rgb_to_hsv(float r, float g, float b)
   変数 float h, s, v を宣言する
      r = r / 255.0
      g = g / 255.0
      b = b / 255.0
      cmax = max(r, g, b)
      cmin = min(r, g, b)
      diff = cmax-cmin
      cmax == cmin なら、
         h = 0
      if 終了
      Else if cmax == r なら、
         h = fmod((60 * ((g - b) / diff) + 360), 360.0)
      Else if 終了
      Else if cmax == g なら、
         h = fmod((60 * ((b - r) / diff) + 120), 360.0)
      Else if 終了
      Else if cmax == b なら、
         h = fmod((60 * ((r - g) / diff) + 240), 360.0)
      Else if 終了
         cmax == 0 なら、
         s = 0
      if 終了
      Else
         s = (diff / cmax) * 100
      Else End
      v = cmax * 100;
      h, s, v を表示する
      ステップ 4 -> int main(int argc, char const *argv[])
      変数 r を宣言し初期化する 45, g = 215, b = 0
      function rgb_to_hsv(r, g, b) を呼び出す
停止

#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値を除く255-
   //範囲を0..に変更する2550..に変更する1:
   float h, s, v;
   r /= 255.0;
   g /= 255.0;
   b /= 255.0;
   float cmax = max(r, g, b); // r, g, b の最大値
   float cmin = min(r, g, b); // r, g, b の最小値
   float diff = cmax-cmin; // cmax と 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);
   //もし cmax が 0 なら
      if (cmax == 0)
         s = 0;
      else
         s = (diff / cmax) * 100;
   //計算v-
   v = cmax * 100;
   printf("h s v=(%f, %f, %f)\n", h, s, v );
   return 0;
}
//主要機能
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)