色空間と変換についてのメモ
この記事は 株式会社ガラパゴス(有志) Advent Calendar 2025 の20日目の記事です。
前書き
こんにちは。@samechaaです。
しばらくぶりに画像処理をやろうとしたら色空間の変換方法を全く覚えていなかったので、覚え書きとして書き残しておきます。
色空間
色空間とは色を数値の組み合わせで表現するための座標系のようなものです。
立方体(RGB色空間)、円錐(HSV色空間)などで可視化されているのをよく見かけるのではないでしょうか。
エンジニアがよく使うのはRGB空間(画像のデジタルデータ)やYUV色空間またはYCbCr色空間(カメラからの入力や映像データ)、HSV色空間かと思います。
RGB色空間
Red, Green, Blueの3色を組み合わせて色を表現する方法です。
これら3色は光の三原色とも呼ばれ、色を重ねるごとに明るくなり、3つを等量で混ぜ合わせると白色になることから、加法混色(additive mixture)と呼ばれます。
CMYK色空間
印刷物で色を表現するのに用いられる色空間です。
シアン(Cyan), マゼンタ(Magenta), イエロー(Yellow)の3色に加えて、K(Key plate)[1]を加えた4色で表現されます。
これら3色は色料の三原色と呼ばれ、混ぜ合わせるほど暗く黒い色に近づくことから減法混色(subtractive mixture)と呼ばれます。
YUV色空間, YCbCr色空間
YUV色空間、YCbCr色空間は輝度信号Yと2つの色差信号U(Cb), V(Cr)で表現される映像信号用の色空間です。
色差(color difference)とはRGBの各色から輝度成分のYを差し引いた信号のことです。
- U(Cb):輝度信号と青色成分の差
- V(Cr):輝度信号と赤色成分の差。
YUV色空間とYCbCr色空間の主な用途は以下の通りです。
| 色空間 | 主な用途 | 信号タイプ |
|---|---|---|
| YUV | NTSCなどのアナログビデオ信号 | アナログ |
| YCbCr | DVDやHD映像などのデジタルビデオ信号 | デジタル |
なおYUV色空間とYCbCr色空間はよく似ていますが、値域や規格が異なります。デジタル映像を扱う場合はITU-R BT.601やBT.709などの規格に準拠したYCbCrが用いられます。変換時には、準拠する規格によって係数が変わることに注意が必要です。
HSV色空間
色相(Hue)、彩度(saturation)、明度(ValueまたはIntensity)によって色を表現します。
| 要素 | 内容 |
|---|---|
| 色相(H) | 色の種類。円錐の角度で表され、0°~360°の範囲をとります。 |
| 彩度(S) | 色の鮮やかさ。円錐の中心からの距離で表され、0.0~1.0の範囲をとります。 |
| 明度(V) | 色の明るさ。円錐の高さで表され、0.0~1.0の範囲をとります。 |
HSV色空間は、明るさの変動を受けにくく、特定の色を抽出したり、色合いを変えたりするなどの画像処理を直観的に行いやすいという利点があります。
色空間の変換
以下に主な色空間間の変換式をまとめます。
BT.601はアナログTV解像度用です。HD映像を扱う場合は、BT.709が適用されます。
RGB→YUV (ITU-R BT.601準拠)
RGBの値域は0.0~1.0に正規化されているものとし、変換後の値域の幅は1.0とします。
YUV→RGB (ITU-R BT.601準拠)
RGBの値域は0.0~1.0に正規化しているものとし、変換後の値域の幅は1.0とします。
RGB→YUVの変換時の逆行列ですね。
RGB→YCbCr (ITU-R BT.601準拠, 8bit デジタル Limited Range)
RGBの値域は0~255になっているものとします。
YCbCr→RGB (ITU-R BT.601準拠, 8bit デジタル Limited Range)
RGBの値域は0~255になっているものとします。
RGB→HSV
RGBの値域は0.0~1.0に正規化されているものとし、
値域
- 色相Hは0.0°~360.0°で変化します。(範囲外の値は360で割った余剰でこの範囲に対応できます。)
- 彩度Sおよび明度Vは0.0~1.0の範囲で変化します。
HSV→RGB
色相Hが0.0°~360.0°、彩度S,明度Vがそれぞれ0.0~1.0の間で変化するものとします。
特殊なケース:
-
のときはH=360° として扱います。H=0° -
の場合、最終的な色は無彩色(無色もしくは灰色)となります。このような場合、S=0.0 となります。(この場合R=G=B=V は無意味となります)。H
一般的なケース
ここで、関数
YUV,YCbCRの係数はどこから来たのか?
YUVの場合
公式では輝度信号
式差
ただし、色が全くないとき(白やグレー)、色差信号を0にするというルールがあります。
これらを表に表したものが公式の[2.5.1 - TABLE 1 Normalized signal values]です。
| Condition | ||||||
|---|---|---|---|---|---|---|
| White Black |
1.0 0 |
1.0 0 |
1.0 0 |
1.0 0 |
0 0 |
0 0 |
| Red Green Blue |
1.0 0 0 |
0 1.0 0 |
0 0 1.0 |
0.299 0.587 0.114 |
–0.701 –0.587 –0.114 |
–0.299 –0.587 0.886 |
上記を見て分かるように単純に
例えば青の成分が最大
Y = 0.114 B - Y = 1.0 - 0.114 = 0.886
であるため、青が最小の場合
このままだとデータの扱いが不便なため、すべての色が最大,最小になったとき、値が
Uの場合:
Vの場合:
これらのスケーリング関数を
になります。これでRGB→YUV (ITU-R BT.601準拠)に記載した変換式の係数がどうやって決まっているかがわかりました。
YCbCrの場合
YCbCrでも輝度および色差の考え方は基本的に同じです。ではなぜYUVと係数が異なるかというと、YCbCrはLimited Rangeという制限された範囲を使用するためです。
Yは16~235, CbおよびCrは16~240の範囲であるため、フルレンジ(0~255)であるRGB値は制限範囲内に収めるためのスケーリング処理を行います。
ちなみに0~15の値をfootroom, 236~255の値をheadroomと呼びます。
輝度の係数
輝度
この係数を前述の輝度
色差の係数
色差Cb,Crの有効範囲は16~240の224段階です。
- 基本式で輝度
を算出するY - 1で算出した輝度とR,Bの差を計算します。(
,(B - Y) )(R - Y) - 2の最大値を、有効範囲(16〜240の224段階)に収まるようにスケーリング係数を掛け、色差の係数を算出します。
オフセット
16や128といった値はデジタル化(今回は8bit)のためにオフセットとして使用しています。
輝度
色差
まとめ
備忘録として変換式を書き記しましたが、多くのプログラミング言語やフレームワークで変換用の関数が用意されています。
次回は、Swiftにおけるこれらの変換方法やユースケースについて紹介したいと思います。
参考
- [小枝正直・上田悦子・中村恭之]. [OpenCVによる画像処理入門]. [第4刷], [株式会社 講談社], [2015]
- KATEX - The fastest math typesetting library for the web
- BT.601 : Studio encoding parameters of digital television for standard 4:3 and wide screen 16:9 aspect ratios
-
印刷において黒の板(キープレート)が重要であることに由来します。 ↩︎
Discussion