第12回 HSV表現

※ replitで「You've used up all your Development time」というメッセージが出た人はこちらを参考にして新しくreplitのアカウントを作ってください。
※ 本題に入る前に、必ず動画の連絡 を見てください。

  1. 色相の変更
  2. 彩度の変更
  3. 明度の変更

HSV表現と色立体
ピクセルの色を表すには、いままで使っていたRGBの値を使う方法のほかに、色相、彩度、明度の3つの情報を使う方法 (HSV表現) がある。
これを下のような図で表わしたものを色立体とよび、この3つの座標で表わされる空間を色空間という。

OpenCVでは、通常のBGR形式の画像 image から HSV形式の画像を作るには以下の命令を実行する。
hsvimage = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
逆に、HSV形式からBGR形式に変換するには以下の命令を実行する。
image = cv2.cvtColor(hsvimage, cv2.COLOR_HSV2BGR)
元画像の選定
今回は色相・彩度・明度に変更を加えてその結果を確認するので、元画像は以下の条件を満たすものにする。
Hue (色相)
Hue は色合いを表す量で、OpenCVでは0~179の値をとる。色と値は図のように対応する。
Hue の2倍の値が図の右側からの時計回りの角度に対応する。

hsvimage の各ピクセルの Hue は以下の書式で取得できる。
hsvimage[:, :, 0]
以下のようにすれば「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[:, :, 1]
以下のようにすれば「hsvf の各ピクセルの色相を ds 変え、0~255の範囲を超えたら範囲内に入るように変更する」という処理になる。
hsvf[:, :, 1] = np.clip(hsvf[:, :, 1] + ds, 0, 255)
元画像に対してSaturationを100増やす、100減らす処理を行うと以下のようになる。

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

元画像
+100
-100

画像

課題解答