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

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

画像処理において、色を理解し適切に扱うことは非常に重要です。色の扱い方を理解することで、特定の色部分だけを抽出したり、照明条件に左右されない処理を実装したりできます。

この記事では、色空間(Color Space)の概念と、OpenCVでよく使われるRGBHSVの2つの色空間を紹介します。

色空間とは

色空間とは、色をルールに従って座標で表現する仕組みです。例えば、ExcelやPowerPointで色を選択する際に二次元の色パレットから選ぶことがありますが、あれも色空間の一例です。

色空間の例(RGB)

色空間にはいくつか種類があり、代表的なものにRGBやHSVがあります。

事前準備

サンプルとして、以下のルービックキューブの画像を使用します。

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

明るい画像と暗い画像を比較することで、色空間による違いを確認します。

この画像はLearnOpenCVから引用しています。

RGB

RGBとは

RGBは赤(Red)、緑(Green)、青(Blue)の3つの原色で色を表現する加法混色の色空間です。

光の三原色を基にしているため、色を混ぜ合わせるほど白に近づきます(絵の具の減法混色とは逆です)。

RGB - Wikipedia

注意: OpenCVでは内部的にBGR(Blue, Green, Red)の順序で色を保持します。色を指定する際はBGRの順番に注意してください。

RGBで色を分解(Python)

cv2.split()を使って画像をR、G、Bの各チャネルに分解します。

import cv2
import numpy as np

img = cv2.imread('input/cube_outdoor.jpg', cv2.IMREAD_COLOR)

# チャネル分割
img_blue, img_green, img_red = cv2.split(img)
cv2.imshow('img_blue', img_blue)
cv2.imshow('img_green', img_green)
cv2.imshow('img_red', img_red)
cv2.waitKey(0)
cv2.destroyAllWindows()
RGB分解結果
明るいルービックキューブの画像

白色の部分に着目すると、R・G・B全てのチャネルで高い値を示しています。3色が混ざって白になっていることが確認できます。

HSV

HSVとは

HSVは色相(Hue)、彩度(Saturation)、明度(Value)の3つの成分からなる色空間です。映像編集では、特定の色だけの明るさや鮮やかさを調整する際に活用されます。

  • 色相(H): 色環上の位置で「色の種類」を表す
  • 彩度(S): 色の鮮やかさを表す
  • 明度(V): 色の明るさを表す

HSVで色を分解(Python)

cv2.cvtColor()でHSVに変換した後、cv2.split()で分解します。色相を可視化するために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: 赤・緑・青の加法混色。直感的だが明るさの影響を受けやすい
  • HSV: 色相・彩度・明度に分離。明るさに依存しない色の判別に有効
  • cv2.split()でチャネルごとに分解し、各成分を確認できる