RGB カラーについて何か知っている場合は、(255、255、255) が カラー ホワイトの 8 ビット RGB トリプレットであることがわかります。 しかし、このトリプレットによって定義された実際の 色 は何ですか?
答えは驚くべきかもしれません:追加情報がなければ、このトリプレットは特定の色を定義していません! RGB 値の意味は 、色空間によって異なります。 色空間がわからない場合は、厳密に言えば、色はわかりません。
色空間は、特定の色値の数値表現を物理的な光として再現する方法を定義します。 ビデオが 1 つの色空間でエンコードされていても、別の色で表示されている場合、ビデオが色補正されない限り、色が歪みます。 したがって、正確な色再現性を実現するには、ソース ビデオの色空間を把握することが重要です。 以前は、Windows のビデオ パイプラインには、目的の色空間に関する情報が含まれていませんでした。 Windows Vista 以降では、DirectShow と Media Foundation の両方で、メディアの種類の拡張カラー情報がサポートされています。 この情報は、DirectX ビデオ アクセラレーション (DXVA) でも使用できます。
色空間を数学的に記述する標準的な方法は、国際照明委員会 (CIE) によって定義された CIE XYZ 色空間を使用することです。 ビデオで CIE XYZ 値を直接使用することは実用的ではありませんが、CIE XYZ カラー スペースは、色空間間で変換するときに中間表現として使用できます。
色を正確に再現するには、次の情報が必要です。
- 色の原色。 色の原色は、CIE XYZ 三刺激値を RGB コンポーネントとして表す方法を定義します。 実際には、色の原色は、指定された RGB 値の "意味" を定義します。
- 転送関数。 伝達関数は、線形 RGB 値を非線形 R'G'B' 値に変換する関数です。 この関数はガンマ 補正とも呼ばれます。
- 転送マトリックス。 転送マトリックスは、R'G'B' を Y'PbPr に変換する方法を定義します。
- 彩度サンプリング。 ほとんどのYUVビデオは、ルマよりも彩度成分の解像度が低く送信されます。 彩度サンプリングは、ビデオ形式の FOURCC によって示されます。 たとえば、YUY2 は 4:2:2 形式です。つまり、彩度サンプルは水平方向に 2 倍サンプリングされます。
- クロム座る。 クロムをサンプリングする場合、luma サンプルに対する彩度サンプルの位置によって、欠落しているサンプルを補間する方法が決まります。
- 標準範囲。 標準範囲は、Y'PbPr 値を Y'CbCr にスケーリングする方法を定義します。
メディアタイプの色空間
DirectShow、Media Foundation、DirectX Video Acceleration (DXVA) には、ビデオ形式を表すさまざまな方法があります。 さいわい、関連する列挙体は同じであるため、色空間情報を相互に変換するのは簡単です。
DXVA 1.0: 色空間情報は 、DXVA_ExtendedFormat 構造体で指定されます。
DXVA 2.0: 色空間情報は 、DXVA2_ExtendedFormat 構造で指定されます。 この構造体は DXVA 1.0 構造体と同じであり、フィールドの意味は同じです。
DirectShow: 色空間情報は 、VIDEOINFOHEADER2 構造体で指定されます。 情報は dwControlFlags フィールドの上位 24 ビットに格納されます。 色空間情報が存在する場合は、dwControlFlags で AMCONTROL_COLORINFO_PRESENT フラグを設定します。 このフラグが設定されている場合、 dwControlFlags フィールドは DXVA_ExtendedFormat 構造体として解釈する必要があります。ただし、構造体の下位 8 ビットは AMCONTROL_xxx フラグ用に予約されています。
ビデオ キャプチャ ドライバー: 色空間情報は 、KS_VIDEOINFOHEADER2 構造で提供されます。 この構造は VIDEOINFOHEADER2 構造と同じであり、フィールドの意味は同じです。
Media Foundation: 色空間情報は、メディアの種類に属性として格納されます。
色情報 特性 色の原色 MF_MT_VIDEO_PRIMARIES 転送関数 MF_MT_TRANSFER_FUNCTION 転送マトリックス MF_MT_YUV_MATRIX 彩度サブサンプリング MF_MT_SUBTYPE
(FOURCC によって指定され、サブタイプ GUID の最初の DWORD に格納されます)。クロメート座る MF_MT_VIDEO_CHROMA_SITING 標準範囲 MF_MT_VIDEO_NOMINAL_RANGE
色空間変換
ある Y'CbCr 空間から別の Y'CbCr 空間への変換には、次の手順が必要です。
逆量子化: ソース名目範囲を使用して、Y'CbCr 表現を Y'PbPr 表現に変換します。
アップサンプリング: 彩度値を補間して、サンプリングした彩度値を 4:4:4 に変換します。
YUV から RGB への変換: ソース転送行列を使用して、Y'PbPr から非線形 R'G'B' に変換します。
逆伝達関数: 転送関数の逆関数を使用して、非線形 R'G'B' を線形 RGB に変換します。
RGB 色空間変換: カラー プライマリを使用して、ソース RGB 空間からターゲット RGB 空間に変換します。
伝達関数: ターゲット転送関数を使用して、線形 RGB を非線形 R'G'B に変換します。
RGB から YUV への変換: ターゲット転送マトリックスを使用して、R'G'B' を Y'PbPr に変換します。
ダウンサンプリング: 彩度の値をフィルター処理して、4:4:4 から 4:2:2、4:2:0、または 4:1:1 に変換します。
量子化: ターゲットの標準範囲を使用して、Y'PbPr を Y'CbCr に変換します。
手順 1 ~ 4 はソース カラー空間で行われ、手順 6 ~ 9 はターゲットの色空間で行われます。 実際の実装では、中間ステップを近似し、隣接するステップを組み合わせることができます。 一般に、精度と計算コストの間にはトレードオフがあります。
たとえば、RT.601 から RT.709 に変換するには、次のステージが必要です。
逆量子化: Y'CbCr(601) から Y'PbPr(601)
アップサンプリング: Y'PbPr(601)
YUV から RGB: Y'PbPr(601) から R'G'B'(601)
逆転送関数: R'G'B'(601) から RGB(601)
RGB 色空間変換: RGB(601) から RGB(709)
転送関数: RGB(709) から R'G'B'(709)
RGB から YUV: R'G'B'(709) から Y'PbPr(709)
ダウンサンプリング: Y'PbPr(709)
量子化: Y'PbPr(709) から Y'CbCr(709)
拡張色情報の使用
パイプライン全体で色の忠実性を維持するには、ソースまたはデコーダーで色空間情報を導入し、パイプライン全体を通してシンクに伝達する必要があります。
ビデオ キャプチャ デバイス
ほとんどのアナログ キャプチャ デバイスでは、ビデオのキャプチャ時に明確に定義された色空間が使用されます。 キャプチャ ドライバーは、色情報を含む KS_VIDEOINFOHEADER2 形式ブロックを含む形式を提供する必要があります。 下位互換性のために、ドライバーは色情報を含まない形式を受け入れる必要があります。 これにより、ドライバーが拡張色情報を受け入れられないコンポーネントを操作できるようになります。
ファイル ベースのソース
ビデオ ファイルを解析するときに、メディア ソース (DirectShow のパーサー フィルター) で色情報の一部を提供できる場合があります。 たとえば、DVD ナビゲーターは、DVD コンテンツに基づいて色空間を決定できます。 デコーダーは、その他の色情報を使用できる場合があります。 たとえば、MPEG-2 基本ビデオ ストリームは、sequence_display_extension フィールドの色情報を提供します。 ソースで色情報が明示的に記述されていない場合は、コンテンツの種類によって暗黙的に定義される可能性があります。 たとえば、NTSC と PAL の種類の DV ビデオでは、それぞれ異なる色空間が使用されます。 最後に、デコーダーは、ソースのメディアの種類から取得した色情報を使用できます。
その他のコンポーネント
他のコンポーネントでは、メディアの種類で色空間情報を使用する必要がある場合があります。
- ソフトウェアの色空間コンバーターでは、変換アルゴリズムを選択するときに色空間情報を使用する必要があります。
- ビデオ ミキサー (拡張ビデオ レンダラー (EVR) ミキサーなど) では、さまざまな種類のコンテンツのビデオ ストリームを混在させる際に色情報を使用する必要があります。
- DXVA ビデオ処理 API と DDI を使用すると、呼び出し元は色空間情報を指定できます。 GPU は、ハードウェア ビデオ ミキシングを実行するときにこの情報を使用する必要があります。
関連トピック