【C言語】RGBカラーモデルをHSVカラーモデルに変換するプログラムの書き方
整数値として与えられたRGBカラー値をHSVカラーモデルへ変換し、対応するHSVの値を求めるのが本記事の目的です。RGBからHSVへの変換は、画像処理やコンピュータグラフィックスの分野で頻繁に登場する基本テクニックなので、ぜひマスターしておきましょう。
RGBカラーモデルとは
RGBカラーモデルは、赤(Red)、緑(Green)、青(Blue)という3つの原色で構成される色モデルです。ディスプレイ技術で最も広く使われており、「加法混色モデル」と呼ばれる方式を採用しています。これは、3色の光をそれぞれ異なる強度で重ね合わせることで、数百万種類にも及ぶ多彩な色を画面上に表現できる仕組みです。
HSVカラーモデルとは
HSVカラーモデルは、色相(Hue)、彩度(Saturation)、明度(Value)の3要素で構成され、HSB(Hue, Saturation, Brightness)と呼ばれることもあります。HSVはRGBカラーモデルを別の観点から表現したものであり、人間が色を知覚する仕組みに合わせて整理されている点が大きな特徴です。直感的に色を扱えるため、デザイナーやアーティストに好んで利用されています。また、HSVの各属性は加法的にも減法的にも扱うことが可能です。
プログラムで行う処理
ユーザーからRGBモデルの値を受け取り、数学的な計算によってHSVカラーモデルの値へと変換して出力します。
実行例
入力: r = 31, g = 52, b = 29 出力: h s v = (114.782608, 44.230770, 20.392157) 入力: r = 129, g = 88, b = 47 出力: h s v=(30.000000, 63.565895, 50.588238)
問題を解くためのアプローチ
- 赤(r)、緑(g)、青(b)の3色の値を入力として受け取ります。
- すべての色の値を255で割り、範囲を0〜1に正規化します。
- cmax(最大値)、cmin(最小値)、diff(両者の差)を計算します。
- 次の条件分岐で色相(Hue)を求めます。
- cmaxとcminが等しい場合: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
- 彩度(Saturation)は次のように判定します。
- cmax = 0 の場合:s = 0
- cmax ≠ 0 の場合:s = (diff / cmax) × 100
- 明度(Value)の計算:
- v = cmax × 100
アルゴリズム
開始
ステップ1 → 関数 float max(float a, float b, float c)
return (a > b)? (a > c ? a : c) : (b > c ? b : c)
ステップ2 → 関数 float min(float a, float b, float c)
return (a < b)? (a < c ? a : c) : (b < c ? b : c)
ステップ3 → 関数 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
そうでなければ もし cmax == r ならば、
h = fmod((60 * ((g - b) / diff) + 360), 360.0)
そうでなければ もし cmax == g ならば、
h = fmod((60 * ((b - r) / diff) + 120), 360.0)
そうでなければ もし cmax == b ならば、
h = fmod((60 * ((r - g) / diff) + 240), 360.0)
もし cmax == 0 ならば、
s = 0
そうでなければ、
s = (diff / cmax) * 100
v = cmax * 100
h, s, v を表示
ステップ4 → 関数 int main(int argc, char const *argv[])
r = 45, g = 215, b = 0 を宣言・初期化
rgb_to_hsv(r, g, b) を呼び出す
終了
C言語による実装例
#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..255 から 0..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;
}
// main関数
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)
まとめ
このように、RGBの各成分を0〜1に正規化したうえで最大値・最小値・差分を求めれば、色相・彩度・明度を段階的に算出できます。色相はどの成分が最大かによって計算式が切り替わる点、彩度と明度は百分率(0〜100)で表現する点がポイントです。この手法は画像編集ソフトやカラーピッカーなど、さまざまなアプリケーションで幅広く応用されています。
-
Windows 10でタスクバーの色を変更する方法!基本の手順と裏ワザを徹底解説
Windows 10が多くのユーザーに支持されている理由のひとつは、自分のニーズや好みに合わせて細かくカスタマイズできる点にあります。壁紙の変更からアクセントカラーの選択まで、豊富な設定オプションが用意されています。中でもスタートメニューとタスクバーは、最もよく目にするUI要素であり、これらも思い通りにカスタマイズ可能です。この記事では、Windows 10でタスクバーの色を変更する方法を、初心者の方にもわかりやすく丁寧に解説します。 Windows 10でタスクバーの色を変更する手順 まず押さえておきたいポイントとして、タスクバーの色を変更できる機能はWindows 10 バージョン19
-
Windows 11でタスクバーの色を変更する方法【アクセントカラーの設定も解説】
毎日使うパソコンのタスクバー、いつも同じ色では少し物足りないと感じていませんか? ご安心ください! この記事では、Windows 11でタスクバーの色を変更する方法を、初心者の方にもわかりやすく丁寧に解説します。あわせてアクセントカラーの設定方法や、色が変更できないときの対処法についてもご紹介します。 それでは始めましょう。 Windows 11の主な特徴 Windows 11は、これまでのWindowsの中でも最も注目されたバージョンです。モダンで洗練されたデザインと数々の新機能により、操作性が大きく向上しました。 生産性を高める機能も豊富に搭載されており、複数の作業を一つの画面で同時に進