ITや趣味など気軽に投稿しています。

【Python】OpenCVで扱える主要な色空間(RGB、HSV)

今回は色空間についてだ。

色の空間?

うむ。色を扱ううえでの概念だが、画像解析においては重要なので触れておこうと思う。特に、OpenCV でよく扱う色空間とその特徴を紹介する。

おねがいします。

色空間とは

まず、色空間とは何ぞやという話だ。
色空間とは色を並べるルールのようなもので、これがあると色を座標で指定できる。

色を座標で指定できる、、?

あまりピンときていないようだが、色空間にもいくつか種類がある。
例えばRGBやHSVなども色空間だ。

RGBってなんか聞いたことあります

例えばExcelやPowerPointで色を選ぶ際、以下のような二次元平面から選ぶことはないかね。これが色空間であり、座標で指定することになる。

色空間の例(RGB)

あ、見覚えあります。意外と身近にあるんですね。

うむ。イメージが湧いたところで、主要な色空間を紹介しよう。

事前準備

まず、サンプルに用いる画像として、以下のルービックキューブの画像を用意した。

暗いルービックキューブの画像
明るいルービックキューブの画像

明るい画像と、暗い画像がありますね。

うむ。この画像はLearnOpenCVというサイトから拝借している。英語だが、OpenCVの解説がされているサイトで、非常にわかりやすいので、テック君も是非参考にしてみるといい。

https://learnopencv.com/color-spaces-in-opencv-cpp-python

暇なときに見てみます。

君はほぼ暇だろう。

、、失礼な!

RGB

RGBとは

まず、有名な色空間にRGBがある。

聞いたことありますね。

RGBは赤 (red) 緑 (green) 青 (blue) の頭文字で、BGRなど順番が変わることもある。RGBは加法混色と呼ばれる色空間になる。

加法混色?

加法混色とは、赤、緑、青の原色を混ぜ合わせることで様々な色を表現することを指す。RGBにおける三原色は光の三原色のことを指している。

光の三原色を指しているということは、、?

色を混ぜ合わせるごとに白に近づいていく。

RGB - Wikipedia
RGBのイメージ(Wikipediaより)

なるほど、リアルな絵の具とは逆なわけですね。

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()
RGE
明るいルービックキューブの画像

確かにR、G、Bに分かれてますね。

特に左上の白色に着目すると、3色とも色づいているのがわかる。3色混ざって白になっていることがわかるんだ。

なるほど、他の色だと緑がなかったり、青がなかったりしていますね。

HSV

HSVとは

HSVは色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Brightness)の三つの成分からなる色空間だ。

なんかRGBより難しそうですね!?

映像編集などではHSVを使うことが多い。例えば写真内の色ごとに明るくしたり、鮮やかにしたりすることができる。

Wikipedia様の図を借りると、HSVは以下のような円錐で表現できる。

HSV色空間の円錐(Wikipediaより)

カラフルな円錐ですね。

このとき、色相は円錐の底面(画像では上部)の色環で表され、彩度は円錐の中心からの距離、明度は円錐の頂点(画像では下部)からの距離で表される。

つまり、すべての色がこの円錐に詰まっているというわけですか。

その通りだ。

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()
HSV

Hueでは色の違いがわかりやすいですね。

Saturationでは鮮やかな部分が明るく表示されている。また、Valueでは明るい部分が明るく表示されている。

ありがとうございました~~♪

まとめ

主要な色空間として、RGBとHSVを紹介した。今回はここまでにしよう。

【ポイント】
・RGBは赤 (red) 緑 (green) 青 (blue)の加法混色。色を混ぜるほど白に近づく
・HSVは色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Brightness)の三つの成分からなる色空間