全文検索(S)
[]

0. はじめに

PhotoShop の HSB(Hue、Saturation、Brightness)カラーモデルは、基本的にはWindows API のカラー選択ダイアログで提供されている HSV(Hue、Saturation、Value)カラーモデルと同じです。

ただ細かいことですが、PhotoShop の HSB 値は、RGB 値と 1 対 1 で対応していません。RGB には、24bit すなわち 16,777,216 通りの値があり得ますが、HSB には、彩度 360 度、彩度と明度 0~100 % のそれぞれ101通りで、
360 × 101 × 101 = 3,672,360
通りしかありません。ということは、RGB から HSB を求める計算は不可逆ということになります。

Windows のカラー選択ダイアログでは HSV も 24bit で表現しているので、可逆だろうと思います。

Windowsの色選択ダイアログ

さて、本筋に戻って、RGB 値 から HSB 値を求めることを考えます。数学風の式だと(私が)書き難いので、C 風に書きます。前振りとして、

int max (int num1, int num2, int num3);

という関数と

int min (int num1, int num2, int num3);

という関数を定義しときます。

前者は num1、num2、num3の中の最大値を返し、後者は最小値を返す関数です。また、RGB値の範囲は、0~255 の整数、HSB値の範囲は PhotoShop にならいます。

1. 色相(Hue)

色相は、360度の円環で表します。学校の美術の授業で目にしたアレです。

色相リング 000度(255, 0, 0)
060度(255, 255, 0)
120度(0 ,255, 0)
180度(0, 255, 255)
240度( 0, 0, 255)
300度(255, 0, 255)
360度(255, 0, 0)

こんな風に決められています。これを求める式を手っ取り早く考えると、if 文の羅列になりそうです。

max = max (r, g, b);
min = min (r, g, b);

if (g == max) {
hue= (b - r) / ( max - min ) * 60 + 120;
}
else if (b == max) {
hue= (r - g) / ( max - min ) * 60 + 240;
}
else if (g < b) {
hue= (g - b) / ( max - min ) * 60 + 360;
}
else {
hue= (g - b) / ( max - min ) * 60;
}

2. 彩度(Saturation)

彩度は、RGB の最大値と最小値の差を最大値で割ったものです。

max = max (r, g, b);
min = min (r, g, b);
saturation = ( max - min ) / max * 100;

マンセル色系では ( max - min ) のことを Chroma(クロマ)と呼ぶそうです。

3. 明度(Brightness)

明度は、RGB 各チャンネルのうちの最大値です。

brightness = max (r, g, b) / 2.55;

明度は、色相・彩度のダイアログや、情報パレット上での表示などでしか使用されていません。PhothShopで重要な明るさの指標は、次の輝度です。

4. 輝度(Luminance)

PhotoShop には明度の他にもう1つ明るさを表現する指標があり、輝度(Luminance または Luminosity)と呼ばれています。

luminance = ( 0.298912 * r + 0.586611 * g + 0.114478 * b );

輝度は以上のような RGB 値の加重平均で決定されます。この係数は、“人間の眼はそう感じているようだ”という経験則から導かれているようです。

レイヤーのブレンドなどの際には、明度ではなく輝度が使用されています。両者は明確に異なるので、混同しないようにしてください。PhotoShop で使われる輝度は、NTSC の Y / C や JPEG のエンコードで分離する Y 成分と同じものです。なお、PhotoShop がグレースケールや Lab モードで利用している明るさの指標は、この輝度とは微妙に異なるものです。


<CG Tips>

[ Copyright 1996-2023 Mishiki Sakana. Some Rights Reserved. ]