今回は色空間についてだ。
色の空間?
うむ。色を扱ううえでの概念だが、画像解析においては重要なので触れておこうと思う。特に、OpenCV でよく扱う色空間とその特徴を紹介する。
おねがいします。
色空間とは
まず、色空間とは何ぞやという話だ。
色空間とは色を並べるルールのようなもので、これがあると色を座標で指定できる。
色を座標で指定できる、、?
あまりピンときていないようだが、色空間にもいくつか種類がある。
例えばRGBやHSVなども色空間だ。
RGBってなんか聞いたことあります
例えばExcelやPowerPointで色を選ぶ際、以下のような二次元平面から選ぶことはないかね。これが色空間であり、座標で指定することになる。

あ、見覚えあります。意外と身近にあるんですね。
うむ。イメージが湧いたところで、主要な色空間を紹介しよう。
事前準備
まず、サンプルに用いる画像として、以下のルービックキューブの画像を用意した。


明るい画像と、暗い画像がありますね。
うむ。この画像はLearnOpenCVというサイトから拝借している。英語だが、OpenCVの解説がされているサイトで、非常にわかりやすいので、テック君も是非参考にしてみるといい。
https://learnopencv.com/color-spaces-in-opencv-cpp-python
暇なときに見てみます。
君はほぼ暇だろう。
、、失礼な!
RGB
RGBとは
まず、有名な色空間にRGBがある。
聞いたことありますね。
RGBは赤 (red) 緑 (green) 青 (blue) の頭文字で、BGRなど順番が変わることもある。RGBは加法混色と呼ばれる色空間になる。
加法混色?
加法混色とは、赤、緑、青の原色を混ぜ合わせることで様々な色を表現することを指す。RGBにおける三原色は光の三原色のことを指している。
光の三原色を指しているということは、、?
色を混ぜ合わせるごとに白に近づいていく。

なるほど、リアルな絵の具とは逆なわけですね。
RGBで色を分解(Python)
では、画像の色をRGBで分解してみよう。
色の分解はcv2.split()を使う。
import cv2
import numpy as np
img = cv2.imread('input/cube_outdoor.jpg', cv2.IMREAD_COLOR)
cv2.imshow('img_blue', img_blue)
cv2.imshow('img_green', img_green)
cv2.imshow('img_red', img_red)
cv2.waitKey(0)
cv2.destroyAllWindows()


確かにR、G、Bに分かれてますね。
特に左上の白色に着目すると、3色とも色づいているのがわかる。3色混ざって白になっていることがわかるんだ。
なるほど、他の色だと緑がなかったり、青がなかったりしていますね。
HSV
HSVとは
HSVは色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Brightness)の三つの成分からなる色空間だ。
なんかRGBより難しそうですね!?
映像編集などではHSVを使うことが多い。例えば写真内の色ごとに明るくしたり、鮮やかにしたりすることができる。
Wikipedia様の図を借りると、HSVは以下のような円錐で表現できる。

カラフルな円錐ですね。
このとき、色相は円錐の底面(画像では上部)の色環で表され、彩度は円錐の中心からの距離、明度は円錐の頂点(画像では下部)からの距離で表される。
つまり、すべての色がこの円錐に詰まっているというわけですか。
その通りだ。
HSVで色を分解(Python)
HSVで色を分解してみよう。色相を見せるためにmatplotlibを使っている。
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('input/cube_outdoor.jpg')
height, width, channels = img.shape[:3]
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
plt.figure(figsize=(10, 6))
plt.subplot(1, 3, 1)
plt.imshow(hsv[:, :, 0], cmap='hsv') # Hue
plt.title("Hue")
plt.subplot(1, 3, 2)
plt.imshow(hsv[:, :, 1], cmap='gray') # Saturation
plt.title("Saturation")
plt.subplot(1, 3, 3)
plt.imshow(hsv[:, :, 2], cmap='gray') # Value
plt.title("Value")
plt.tight_layout()
plt.show()

Hueでは色の違いがわかりやすいですね。
Saturationでは鮮やかな部分が明るく表示されている。また、Valueでは明るい部分が明るく表示されている。
ありがとうございました~~♪
まとめ
主要な色空間として、RGBとHSVを紹介した。今回はここまでにしよう。
【ポイント】
・RGBは赤 (red) 緑 (green) 青 (blue)の加法混色。色を混ぜるほど白に近づく
・HSVは色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Brightness)の三つの成分からなる色空間