アプリ版:「スタンプのみでお礼する」機能のリリースについて

RGB値からHSV値への変換式に関して質問があります.

S=MAX[R,G,B]-MIN[R,G,B]
V=MAX[R,G,B]

の2式は分光分布を見れば,その式の意味は理解できました.

ただ,
H=60*(G-B)/(MAX[R,G,B]-MIN[R,G,B]) if R=MAX[R,G,B]
H=60*(B-R)/(MAX[R,G,B]-MIN[R,G,B])+120 if G=MAX[R,G,B]
H=60*(R-G)/(MAX[R,G,B]-MIN[R,G,B])+240 if B=MAX[R,G,B]

の式の意味が理解できません.
なぜ,最大値でない残りの2値の差を彩度で割ると色相が算出されるのでしょうか.
どなたか分かる方,回答よろしくお願い致します.

A 回答 (2件)

> 冒頭でS=1.0,V=1.0としたのには何か意味があるのでしょうか?



「純粋な「色」パラメータを考え」た結果です。
S(彩度)が低くなっていくと、無彩色に近づきなります。S=0は灰色(もしくは白や黒)
V(明度)が低くなっていくと、暗くなります。V=0は黒色。

逆に「S=1.0、V=1.0」になっているのが「純色」です。

> R' = (R-MIN(R,G,B))/(MAX(R,G,B)-MIN(R,G,B))
> の変換式はどこから出てきたのでしょうか?

例えば「最小値0.3、最大値0.7で分布する数値」を「最小値0.0、最大値1.0に変換」する場合を考えます。

このとき「R-0.3」「G-0.3」「B-0.3」という式で「最小値0.0」に出来ます。
ただし、この三数の最大値は0.4(=0.7-0.3)です。
おそこで、さらにこの数値を0.4で割れば、最小値が0.0のまま、最大値が1.0になります。
つまり、「(R-0.3)/0.4」「(G-0.3)/0.4」「(B-0.3)/0.4」で、「最小値0.0、最大値1.0に変換」できることになります。

これを一般的な式で書くと「(R-MIN)/(MAX-MIN)」になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

理解できました.
丁寧な回答ありがとうございます!

お礼日時:2010/05/21 10:30

まず、RGB値から、SとVを除いた純粋な「色」パラメータを考えます。


言い換えれば、同じ色相でS=1.0、V=1.0になるようなRGB値。

これを(R', G', B')とすると、MAX(R',G',B')=1.0、MIN(R',G',B')=0.0になるわけですから、変換式は


R' = (R-MIN(R,G,B))/(MAX(R,G,B)-MIN(R,G,B))
G' = (G-MIN(R,G,B))/(MAX(R,G,B)-MIN(R,G,B))
B' = (B-MIN(R,G,B))/(MAX(R,G,B)-MIN(R,G,B))

となります。

この(R',G',B')は、「最大値が1.0で最小値が0.0」ですから、言い換えると、「1つは1.0、1つは0.0、残り1つは0.0~1.0」です。

この「残り1つのパラメータがいくらになっているか」で「色」を表すことにします。
パターンとしては、
a) R'が1.0、G'が0.0、B'が0.0~1.0
b) R'が1.0、B'が0.0、G'が0.0~1.0
c) G'が1.0、B'が0.0、R'が0.0~1.0
d) G'が1.0、R'が0.0、B'が0.0~1.0
e) B'が1.0、R'が0.0、G'が0.0~1.0
f) B'が1.0、G'が0.0、R'が0.0~1.0
の6通りあるので、この6パターンそれぞれに60度ずつ割り当てることで、HSVにおける360度の「色相」となるのです。

ここで、
a)とb)は、「G'-B'」を計算すると
  a)G'=0、B'=0~1.0 なので、G'-B'=0.0~-1.0
  b)B'=0、G'=0~1.0 なので、G'-B'=0.0~+1.0
となるので、「G'-B'」が「-1.0~1.0」の範囲に分布するものとして、まとめて計算できます。
これを-60~60に割り当てます。式は

H=60×(G'-B')

です。この式に、G'、B'の定義を代入すると、
H=60×((G-MIN)/(MAX-MIN) - (B-MIN)/(MAX-MIN))
=60×((G-MIN)-(B-MIN))/(MAX-MIN)
=60×(G-B)/(MAX-MIN)
になります。
これが、RGBからHを求める式になります。この式を利用する条件は、R'=1.0の時、すなわち、R=MAX(R,G,B)の時です。

同様にして、

c)とd)をH=60~180に割り当てると、H=(B'-R')×60+120になり、その時のRGBからのHの算出式は
H=60×(B-R)/(MAX-MIN)+120 (G'=1.0の時、すなわち、G=MAXの時)

e)とf)をH=180~300に割り当てると、H=(R'-G')×60+240 になり、その時のRGBからのHの算出式は
H=60×(R-G)/(MAX-MIN)+240 (B'=1.0の時、すなわち、B=MAXの時)

となります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

よく意味が分からない点があります.

冒頭でS=1.0,V=1.0としたのには何か意味があるのでしょうか?

また,

R' = (R-MIN(R,G,B))/(MAX(R,G,B)-MIN(R,G,B))
G' = (G-MIN(R,G,B))/(MAX(R,G,B)-MIN(R,G,B))
B' = (B-MIN(R,G,B))/(MAX(R,G,B)-MIN(R,G,B))

の変換式はどこから出てきたのでしょうか?

理解が足りず申し訳ありませんが,追加説明をお願い致します.

お礼日時:2010/05/19 17:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!