色相、彩度、明度の計算方法

シェアする

  • このエントリーをはてなブックマークに追加
最近の記事
  • 7/6 【参考書籍】画像処理・機械学習プログラミング OpenCV 3対応
  • 6/20 【Python,matplotlib】動くグラフをAnimationGifに保存する方法
  • 6/17 シグモイド関数の微分
  • 6/15 シグモイド関数
  • 6/13 合成関数の微分
  • 6/12 WordPressで数式エディタ風に数式を入力したい
  • 6/11 PythonをVisual Studioでインストールする方法
  • 6/9 【Python】OpenCVをAnacondaでインストール(Windows編)
  • 6/6 【Python】Anacondaで複数バージョンの環境切り替え
  • 6/6 画像センシング展2017に出展します。
  • 6/1 【Office365】Web版Outlookのフォントサイズ変更
  • 6/1 【Anaconda】モジュールのアップデートでエラー発生
  • 6/1 【Anaconda】コマンドリストの表示
  • 5/29 Windows10パソコン購入
  • 5/24 Anacondaのアンインストール
  • 5/24 【Jupyter Notebook】新規プログラムの作成
  • 5/23 【Python】開発環境の構築
  • 5/23 Pythonはじめました
  • 4/6 【Office365】Web版Outlookのスレッド表示を解除する方法
  • 4/5 【Excel】フーリエ解析(FFT)
  • 3/20 Canny edge detection
  • 3/20 【Excel2016】分析ツールの表示
  • 3/5 【Visual Studio】黒い背景色を白に変更する方法
  • 2/8 【Windows10】拡張モニタに表示されたウィンドウを元に戻す
  • 2/7 複素数の計算
  • 1/18 【Excel】棒グラフの横軸の目盛を0始まりにする
  • 1/16 【Excel】フーリエ変換
  • 1/6 【OpenCV】疑似カラー(カラーマップ)
  • 11/8 【Visual Studio】検索結果のウィンドウ表示
  • 11/3 ニコン 一眼レフカメラ D5500レビュー
  • 10/26 カラーカメラはモノクロカメラを兼ねない
  • 9/6 (Free Soft)Animation GIF Builder
  • 8/30 【C#】タブの無いTabControlっぽいものを作る
  • 8/29 【OpenCvSharp】サンプルプログラムの公開
  • 8/28 【PowerPoint】部分的にカラーにする(セレクトカラー処理)
  • 8/27 【C#】引数の値渡し、参照渡し(ref, out)
  • 8/26 【Word/Excel】図形内に文字を挿入する
  • 8/25 【C#】NumericUpDownコントロール
  • 8/24 ニコン D3400 VS D5500 仕様比較
  • 8/22 【C#】MDIフォームにリサイズ可能なPanelを設置する
  • 8/20 【Visual Studio 2015】文字の色が変、かすむ
  • 8/20 【Visual Studio】行のコピー、切り取り、貼り付け
  • 8/20
  • 8/16
  • 7/7 標準偏差のよくある誤解
  • 6/17 ホーム
  • 6/15
  • 6/15
  • 6/15
  • 6/15

  • 色相Hue:色合い)、彩度Saturation:鮮やかさ)、明度Brightness,Lightness,Intensity,Value:明るさ)については、以前、変換式には色相、彩度、明度ほかのページにまとめたのですが、実は訳も分からず公式だけをまとめていました。

    で、なんだか気持ちが悪かったので色相、彩度、明度について、よ~く調べてみました。
    私なりの理解ですが、以下にまとめました。

    R、G、Bの色空間については、下図のようにRGBをXYZのように三次元座標で表すと、一辺の長さが255で表される立方体の範囲内で全ての色を表す事が出来ます。(R,G,B各8bitの場合)

    色相、彩度、明度

    この立方体を白(255、255、255)に位置から黒(0、0、0)の方向へ見て、R軸を右側に取ると、

    色相、彩度、明度

    のように、正六角形となります。
    この時、の方向を0°として、反時計回りにの位置が120°240°色相(0~360°(2π))を定めます。
    彩度は一番外側の六角形に対して、どの割合の位置に配されているかを0~1.0で表したものが彩度となります。

    詳細は後述しますが、色相彩度はカメラやパソコンなどの性能評価(使いやすさ、価格、処理速度など)を表す時に用いるレーダーチャート(クモの巣グラフ)もどきみたいな物?!と思うと、自分の中で少し整理ができました。

    さらに、この六角形の高さ方法に明度を割り振ると、HSV(六角錐モデル)やHLS(双六角錐モデル)となります。
    それぞれの違いは明度の定義が異なり、R、G、Bの最大輝度値をImax、最小輝度値をIminとしたときに

    明度V = Imax

    としたものがHSV

    明度L = ( Imax + Imin ) / 2

    としたものがHLSとなり、明度の値は0~1.0で表されます。

    これを立体で表すと

    HSV(六角錐モデル)

    色相、彩度、明度

    HLS(双六角錐モデル)

    色相、彩度、明度

    となります。
    このHSV、HLSともに、六角錐の斜面の部分が彩度が1.0となります。

    以下、色相、彩度、明度の詳細な計算方法です。

    HSVの計算方法

    はじめにR、G、Bの輝度値の範囲を0~255から0~1.0となるように変換します。
    (R、G、Bのそれぞれの値を255で割ります。)

    【色相Hの求め方】
    下図のように、0°方向にR、120°方向にG、240°方向にBだけ進み、最後の点の位置のR軸に対する角度が色相となります。

    色相、彩度、明度の計算方法

    この最後の点の座標は中心を(x、y) = (0、0) とすると、R、G、Bの方向のなす角度から

    色相、彩度、明度の計算方法

    となり、xとyより色相Hが求まります。

    色相、彩度、明度の計算方法

    ただし、アークタンジェントの計算が出来ない場合など、この方法とは別に、近似的に求める方法もあります。(こちらの方が一般的)

    下図を見ても分かる?ようにR、G、Bの成分の比を比べ、

    Rが最大の場合、色相は-60°(300°)~60° (R方向の0°±60°)
    Gが最大の場合、色相は 60°~180° (G方向の120°±60°)
    Bが最大の場合、色相は 180°~300° (B方向の240°±60°)

    の範囲内に色相は収まります。

    色相、彩度、明度の計算方法

    以下、Rの値が最大の場合を例に取って説明したいと思います。

    下図のように、2つの矢印の長さが分かれば、その矢印の比で角度60°を分割することで、角度(色相)を近似することが出来ます。

    色相、彩度、明度の計算方法

    R、G、Bの大きさがR≧G≧Bの場合

    色相H = 60° × (G – B) / (R – B)

    色相、彩度、明度の計算方法

    R、G、Bの大きさがR≧B≧Gの場合

    色相H = 60° × (G – B) / (R – G)

    色相、彩度、明度の計算方法

    となります。
    ただし、この場合、色相の値が負となるので、

    色相H = 60° × (G – B) / (R – G) + 360°

    とします。

    と、なる理屈を理解するのに苦労しました...
    図中に書いてある黄色い正三角形がポイント!
    正三角形なので、三辺の長さが等しい分けで。
    R以外のGやBが最大となる場合も理屈は同じです。
    120°づつ回転させて考えてみると分かります。

    この式を一般的に書くと、R、G、Bの成分のうち、最大の成分をImax、最小の成分をIminとすると

    ImaxがRのとき

    色相、彩度、明度の計算方法

    ImaxがGのとき

    色相、彩度、明度の計算方法

    ImaxがBのとき

    色相、彩度、明度の計算方法

    となります。

    【明度Vの求め方】

    明度は、もともとHSVの定義よりR、G、Bの成分のうち、最大の成分をImaxとすると

    明度V = Imax

    とします。
    明度Vの範囲は0~1.0となります。

    【彩度Sの求め方】
    R、G、Bの成分のうち、最大の成分をImax、最小の成分をIminとすると

    彩度S = (Imax – Imin) / Imax

    となります。
    彩度Sの範囲は0~1.0となります。

    色相、彩度、明度の計算方法

    HLSの計算方法

    【色相Hの求め方】
    色相HはHSVの色相Hの求め方と同じです。

    【明度Lの求め方】
    明度Lは、もともとHLSの定義よりR、G、Bの成分のうち、最大の成分をImaxとすると

    明度L = ( Imax + Imin ) / 2

    とします。
    明度Lの範囲は0~1.0となります。

    【彩度Sの求め方】
    R、G、Bの成分のうち、最大の成分をImax、最小の成分をIminとすると

    L≦0.5のとき

    彩度S = (Imax – Imin) / (Imax + Imin)

    L>0.5のとき

    彩度S = (Imax – Imin) / (2 – Imax – Imin)

    となります。
    彩度Sの範囲は0~1.0となります。

    以下、補足説明です。
    彩度Sは下図の外側の六角形に対して、内側の六角形の大きさの割合で求められます。

    色相、彩度、明度の計算方法

    この六角形の大きさはR,G,Bの輝度値が最大となる軸上で考えると比較的分かりやすいと思います。
    今回はRの値が最大となる場合とします。

    HLSは双六角錐モデルであるため、明度Lが0.5以下の場合、外側の六角形の大きさ(上図のE’の位置)は

    E’ = Imax + Imin

    で求まります。

    色相、彩度、明度の計算方法

    明度Lが0.5より大きい場合、外側の六角形の大きさ(上図のE’の位置)は

    E’ = 2 – Imax – Imin

    となります。

    色相、彩度、明度の計算方法

    以上のことから、最初の彩度Sの式が求まります。

    色相、彩度、明度を使った色判別時の注意点

    色相および彩度を用いると、画像の明るさ(明度)が変動しても似た色の領域を抽出する事が可能となりますが、彩度の値が小さい場合、つまりR、G、Bの値がそれぞれ近い場合は色相の値が不安定になります。

    例えば、
    (R、G、B) = (121、120、120)の場合、 色相H = 0°
    (R、G、B) = (120、121、120)の場合、 色相H = 120°
    (R、G、B) = (120、120、121)の場合、 色相H = 240°

    と、ほんの少しのR、G、Bの値の違いでも色相の値は大きく異なります。

    また、色相Hは角度で表されるので、例えば1°も359°も値こそ離れていますが、どちらも0°±1°の範囲内で角度的には近いので、色相Hの値で単純に二値化処理することで色の領域を抽出する場合は注意して下さい。

    画像処理アルゴリズムへ戻る

    コメント

    1. Mimuchan より:

      はじめまして.
      いつも参考にさせていただいております.

      中段付近に記載してある色相角の計算方法において,

      ***************************************
      ImaxがBのとき
      H=60*(B-R)/(Imax-Imin)+120
      ***************************************

      となっておりますが,

      ***************************************
      ImaxがBのとき
      H=60*(R-G)/(Imax-Imin)+240
      ***************************************

      ではないでしょうか.
      ご検討よろしくお願いします.

      • akira より:

        Mimuchanさん。ご指摘頂きありがとうございます。
        おっしゃる通りに、間違っていますね。
        画像の貼り付けミスをしてしまったようで、後程修正したいと思います。
        どうもありがとうございました。