カラーの画像処理をする時には、これら色相などの知識は必須となります。
Windows標準で付いてくるペイントで、色の作成の表示をすると、雰囲気が分かると思います。
基本的に以下の色相、彩度、明度を用いて色を表すのですが、変換式にいくつかの種類があります。
色相(Hue)
色合いを表します。
赤や緑、青などに色を0~360°(0~2π)の角度を用いて表します。
彩度(Saturation)
鮮やかさを表します。
と一般的に言われるのですが、鮮やかさ?と言われても、いまいちピンと来ませんが、下記に示した式から見ても分かるように、R,G,Bの値にどれだけ開きがあるか?を示しています。
このことは逆にいうと、R,G,Bの値に開きが無い場合は、グレーに近い事から、彩度は如何にグレーっぽく無いか?、という事から、どれだけ純色(赤、緑、青、黄、シアン、紫など)に近いか?を表しています。
明度(Brightness,Lightness,Intensity,Value)
色の明るさを表します。
HSV変換
6角錐モデルとも言います。
【RGB⇒HSV変換】
Imax = Max(R,G,B)
Imin = Min(R,G,B)
とすると
R = Imaxのとき
H = 60×(G – B) / (Imax – Imin)
G = Imaxのとき
H = 60×(B – R) / (Imax – Imin) + 120
B = Imaxのとき
H = 60×(R – G) / (Imax – Imin) + 240
S = (Imax – Imin) / Imax
V = Imax
【HSV⇒RGB変換】
h = floor(H / 60) floor()は切り捨て処理
P = V × (1 – S)
Q = V × (1 – S × (H / 60 – h))
T = V × (1 – S × (1 – H / 60 + h))
とすると
h= 0のとき
R = V, G = T, B = P
h= 1のとき
R = Q, G = V, B = P
h= 2のとき
R = P, G = V, B = T
h= 3のとき
R = P, G = Q, B = V
h= 4のとき
R = T, G = P, B = V
h= 5のとき
R = V, G = P, B = Q
HLS変換
双6角錐モデルとも言います。
【RGB⇒HLS変換】
Imax = Max(R,G,B)
Imin = Min(R,G,B)
とすると
R = Imaxのとき
H = 60×(G – B) / (Imax – Imin)
G = Imaxのとき
H = 60×(B – R) / (Imax – Imin) + 120
R = Imaxのとき
H = 60×(R – G) / (Imax – Imin) + 240
L = (Imax + Imin) / 2
L ≦ 0.5のとき
S = (Imax – Imin) / (Imax + Imin)
L > 0.5のとき
S = (Imax – Imin) / (2 – Imax – Imin)
【HLS⇒RGB変換】
h < 0のとき
h’ = h + 360
h ≧ 360のとき
h’ = h – 360
その他
h’ = h
L ≦ 0.5のとき
M2 = L × (1 + S)
L > 0.5のとき
M2 = L + S – L × S
M1 = 2 × L – M2
h’ < 60のとき
X = M1 + (M2 – M1) × h’ / 60
60 ≦ h’ < 180のとき
X = M2
180 ≦ h’ < 240のとき
X = M1 + (M2 – M1) × (240 – h’ ) / 60
240 ≦ h’ ≦ 360のとき
X = M1
とすると
R = X ただし、h = H + 120とする
G = X ただし、h = Hとする
B = X ただし、h = H – 120とする
カラー変換用関数
【Win32APIの場合】 VBの表記例
‘HLS変換(Windows 2000以降、またはInternet Explorer 5.0がインストールされてある環境。(SHLWAPI.DLL Version 5.00以上)
‘h (色相)
‘赤(0)、黄(40)、緑(80)、シアン(120)、青(160)、マゼンダ(200)の順に定義0~239まで設定可
‘L (明度)
‘色の明るさをあらわす。0~240まで設定可。0が黒、240が白になる。
‘s (彩度)
‘0~240まで設定可。240が純色になる。
Public Declare Sub ColorRGBToHLS Lib “SHLWAPI.DLL” _
(ByVal clrRGB As Long, _
pwHue As Integer, _
pwLuminance As Integer, _
pwSaturation As Integer)
Public Declare Function ColorHLSToRGB Lib “SHLWAPI.DLL” _
(ByVal wHue As Integer, _
ByVal wLuminance As Integer, _
ByVal wSaturation As Integer) As Long
最初に紹介したペイントの色の作成では、この関数と同様の変換(設定値を含めて同じ)をしています。
【.NET Frameworkの場合】
System.Drawing.Color構造体にて
GetHueメソッド HSBのH(色相)を取得
GetSaturationメソッド HSBのS(彩度)を取得
GetBrightnessメソッド HSBのB(明度)を取得
RGB⇒HSB変換はなし?
【OpenCVの場合】
cvCvtColor関数にて、以下の変換に対応
XYZ, YCrCb(YCC), HSV, HLS, L*a*b, L*u*v
その他 同じcvCvtColor関数で Bayer変換に対応
カラー画像処理例
そのカラー画像を色相、彩度、明度に分解し、それぞれの値(主に色相)でフィルタリング処理(バンドパスフィルタ)を行い、カラー画像に逆変換する事により、特定の色だけを抽出する事が可能になります。これにより、色の位置や個数などの検査をする事が可能となります。
→ | ||
処理前 | 処理後 |
ただし、彩度の値の小さな色(白やグレーに近い色)は彩度の値が不安的になりがちなので、カラー画像処理には不向きです。
ピンバック: 【Webデザインの基礎】初心者が最低限覚えておきたいスキルやツール | 猫でもわかる!デザイン教室
ピンバック: 水玉カメラ | 水玉製作所
【RGB⇒HSV変換】のところ、「R = Imaxのとき」が二つあります。
二つ目は、「B = Imaxのとき」ではないかと。
また、【HSV⇒RGB変換】のところ、「T = V × (1 – S × (1 – H / 60 + h))」ではなくて、
「T = V × (1 – S × (1 – (H / 60 + h)))」じゃないと、計算があいません。
また、Sが0の場合、R=G=B=Vとなるのも加えたほうが良いと思います。
参考
http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93
umhrさん。コメント頂きありがとうございます。
ご指摘の通り、「R = Imaxのとき」は誤記でしたね。
本記事も修正しました。
また、Tの式についてですが、ここにある式であっていませんか?
参考のページの式でもfを代入すると同じようになりましたが...
R=G=Bの時は色相が不定になるので、扱いは迷ったのですが、認識はお任せします。
おっと、HSV⇒RGB変換の方はこちらのミスでした。失礼しました。
参考にして、作ってみました。
http://www.mztm.jp/2013/07/15/dotsimage/
ピンバック: 色相、彩度、明度の計算方法 | イメージングソリューション