※ replitで「You've used up all your Development time」というメッセージが出た人は
こちらを参考にして新しくreplitのアカウントを作ってください。
※ 本題に入る前に、必ず動画の
連絡
を見てください。
- 色相の変更
- 彩度の変更
- 明度の変更
HSV表現と色立体
ピクセルの色を表すには、いままで使っていたRGBの値を使う方法のほかに、色相、彩度、明度の3つの情報を使う方法 (
HSV表現) がある。
- 色相 (Hue) : 色の種類。OpenCVでは0~179の値であらわす。
- 彩度 (Saturation) : 色の鮮やかさ。大きいほど鮮やかになる。色空間では中心軸からの距離として扱い、OpenCVでは0~255の値であらわす。
- 明度 (Value) : 明るさ。色空間では縦方向の座標として扱い、OpenCVは0~255の値であらわす。
これを下のような図で表わしたものを
色立体とよび、この3つの座標で表わされる空間を
色空間という。
OpenCVでは、通常のBGR形式の画像 image から HSV形式の画像を作るには以下の命令を実行する。
hsvimage = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
逆に、HSV形式からBGR形式に変換するには以下の命令を実行する。
image = cv2.cvtColor(hsvimage, cv2.COLOR_HSV2BGR)
元画像の選定
今回は色相・彩度・明度に変更を加えてその結果を確認するので、元画像は以下の条件を満たすものにする。
- 赤・黄・緑・シアン・青・マゼンタの6色のいずれかに近い色を含む
- 鮮やかすぎずくすみ過ぎてもいないエリアを含む
- 明るすぎず暗すぎないエリアを含む
Hue (色相)
Hue は色合いを表す量で、OpenCVでは0~179の値をとる。色と値は図のように対応する。
Hue の2倍の値が図の右側からの時計回りの角度に対応する。
hsvimage の各ピクセルの Hue は以下の書式で取得できる。
以下のようにすれば「hsvimage の各ピクセル色相を dh 増やし、180を超えたら剰余をとる」という処理になる。
hsvimage[:, :, 0] = (hsvimage[:, :, 0] + dh) % 180
元画像に対してHueを30, 60, 90, 120, 150増やす (180以上になった色は180による剰余にする) 処理を行うと以下のようになる。
元画像

+30

+60

+90

+120

+150

Saturation (彩度)
Saturation は色の鮮やかさを表す量で、OpenCVでは0~255の値をとる。これが大きくなるほど鮮やかに、小さくなるとくすんだ色になる。
hsvf の各ピクセルの Saturation は以下の書式で取得できる。
以下のようにすれば「hsvf の各ピクセルの色相を ds 変え、0~255の範囲を超えたら範囲内に入るように変更する」という処理になる。
hsvf[:, :, 1] = np.clip(hsvf[:, :, 1] + ds, 0, 255)
元画像に対してSaturationを100増やす、100減らす処理を行うと以下のようになる。
Value (明度)
Value は色の明るさを表す量で、OpenCVでは0~255の値をとる。これが大きくなるほど明るく、小さくなると暗くなる。
hsvf の各ピクセルの Value は以下の書式で取得できる。
以下のようにすれば「hsvf の各ピクセルの明度を dv 変え、0~255の範囲を超えたら範囲内に入るように変更する」という処理になる。
hsvf[:, :, 2] = np.clip(hsvf[:, :, 2] + dv, 0, 255)
元画像に対してValueを100増やす、100減らす処理を行うと以下のようになる。