YUY2とは何か?4:2:2のパックドYUVフォーマットを徹底解説と実装ガイド

YUY2 とは — 概要

YUY2(しばしば YUYV、YUYV422、または YUV422 パックドとも呼ばれる)は、8ビット成分で表現される Y'CbCr(一般には「YUV」と呼ばれることが多い)色空間のパックド(interleaved)形式のピクセルフォーマットです。クロマ(色差成分、Cb と Cr)は水平方向で 2 ピクセルごとにサンプリングされ、輝度(Y)は各ピクセルごとに持つ 4:2:2 のサブサンプリングを採用します。つまり、同一ライン上の隣接する 2 ピクセル間で U(Cb)と V(Cr)が共有されます。

データレイアウト(バイト順序)

YUY2 の典型的なバイト並びは、2ピクセル単位で次のようになります。

  • Y0 U0 Y1 V0

ここで Y0, Y1 が各ピクセルの輝度、U0 がそのペアに共通の Cb(青色差)、V0 が共通の Cr(赤色差)です。メモリ上は 16 ビット/ピクセル(2 バイト/ピクセル)となるため、横幅が奇数の場合はペアあわせのために幅を偶数にする必要があります(ストライドも通常は幅 × 2 バイト)。

YUY2 の位置づけ・長所と短所

  • 長所
    • RGB に比べてデータ量が小さく、処理・転送コストを抑えやすい(RGB24 と比べ 1.5 倍程度ではないが、YUY2 は 2 バイト/ピクセル、RGB24 は 3 バイト/ピクセル)。
    • 輝度情報がフル解像で保持されるため、人間の視覚に重要なエッジやディテールの保持に有利。
    • パックド形式のため、メモリアクセスが連続し扱いやすく、リアルタイム映像キャプチャやコンピュータビジョン処理でよく使われる。
  • 短所
    • クロマが水平方向に半分の解像度(4:2:2)なので、色の精細さは低下する。特に高彩度の細かい模様では色ムラやにじみが見える場合がある。
    • アルファチャンネルを持たない(透過情報は扱えない)。
    • 現代ではハードウェアやコーデックが 4:2:0(例:NV12, I420)を好むため、動画コーデックやデコーダーとの組合せで変換コストが発生することがある。

YUY2 と他フォーマットの比較

  • YUY2(packed 4:2:2) vs NV12 / I420(planar 4:2:0)
    • YUY2 はパックドで 4:2:2、NV12/I420 はプレーンで 4:2:0。NV12 は多くのハードウェアデコーダーが好む形式で、クロマが垂直方向にも間引かれている(4:2:0)。結果として NV12 は YUY2 より帯域幅や容量が小さいが、YUY2 は水平解像保持で色の精度が高い。
  • YUY2 vs UYVY
    • 両者はほぼ同じ 4:2:2 パックドフォーマットだが、バイト順が異なる(UYVY は U0 Y0 V0 Y1)。使用する API やハードウェアがどちらを期待するかに注意。
  • YUY2 vs RGB
    • RGB は各ピクセルで色成分を分けて持つため編集に便利だが、データ量がより大きい。YUY2 は圧縮ではないがサブサンプリングで色情報を削減している。

色変換(Y'CbCr → RGB)と色基準

YUY2 は Y'CbCr(あるいは慣用的に YUV と呼ばれる)で表現されるため、表示やアルゴリズムで RGB が必要な場合は変換が必要です。変換では「色域(色空間)の規格」と「レンジ(フルレンジ 0-255 か、ビデオレンジ 16-235 等)」を正しく扱うことが重要です。代表的な係数は以下の通りです。

ITU-R BT.601(SD コンテンツ、リミテッドレンジ 16–235)での近似(浮動小数点):

  • R = 1.164*(Y - 16) + 1.596*(Cr - 128)
  • G = 1.164*(Y - 16) - 0.391*(Cb - 128) - 0.813*(Cr - 128)
  • B = 1.164*(Y - 16) + 2.018*(Cb - 128)

フルレンジ(0–255)での簡易式:

  • R = Y + 1.402*(Cr - 128)
  • G = Y - 0.344136*(Cb - 128) - 0.714136*(Cr - 128)
  • B = Y + 1.772*(Cb - 128)

HD コンテンツでは BT.709 の係数を使う必要があり、係数が若干異なります。どの係数を用いるかはソースの色基準(metadata)に依存します。

実装上の注意点・パフォーマンス

  • ストライド:1 ピクセルあたり 2 バイトなので、行のバイト幅 = width × 2(必要に応じてパディングされる)。幅は偶数でなければならない。
  • ピクセルアクセス:2 ピクセルごとに同一の U/V を適用するため、フィルタや補間(例えばリサイズ、回転、サブピクセル処理)ではクロマの位置(チャンネルのセンタリング)に注意する。クロマがピクセル間の「中心」にあるのか端に寄っているのかで補間結果が変わる。
  • 高速化:整数演算による近似、ルックアップテーブル、SIMD(SSE/AVX/NEON)を用いたベクトル化はカラースペース変換やスケーリングで有力。多くのライブラリ(libyuv、ffmpeg の sws_scale 等)は最適化実装を提供している。
  • 色域/レンジの扱い:リミテッドレンジとフルレンジを誤って扱うとコントラストや色が大きく崩れる。ソース・ディスプレイ双方の規格を確認し、適切にスケーリング(±16/220 の補正等)を実施する。

利用例・用途

  • Web カメラやビデオキャプチャデバイス:多くの古典的なキャプチャデバイスやドライバは YUY2(または UYVY)でフレームを出力する。Windows の DirectShow/Video for Windows 周りでよく見られる。
  • 放送・プロダクション:放送用途では 4:2:2 はしばしば選好される。YUY2 自体は消費者〜プロシューマ向けに多いが、放送クラスではより高精度なサンプルや機器が使われることもある。
  • リアルタイム処理:色認識や顔検出など、輝度情報が重要であり帯域を抑えたいリアルタイム処理に向く。
  • ファイル形式:非圧縮の AVI や RAW フレームの格納フォーマットとして利用されることがある(FourCC "YUY2" 等)。

互換性と API 名称

  • Windows(DirectShow/VFW)では FourCC コード "YUY2" が使われることが一般的です。
  • Linux の V4L2 では V4L2_PIX_FMT_YUYV('YUYV')として定義されています。
  • FFmpeg や libav では pixel format 名 yuyv422(または yuv422p はプレーン版)として扱われます。
  • ライブラリ選定時は、API が期待するバイトオーダ(YUY2 と UYVY の違い)に注意してください。

実際のバイト列例

2 ピクセル分(横並び)を 8 ビット値で具体例として示すと:

Y0 = 100, U0 = 120, Y1 = 110, V0 = 140 の場合、メモリ上は次の 4 バイトが順に格納されます:

  • 100, 120, 110, 140 → Y0, U0, Y1, V0

これが連続して並ぶことでフレーム全体を構成します。

実務でのチェックポイント・よくあるミス

  • 幅が奇数であることによるアライメント不具合。幅は偶数にするか、パディングを入れる。
  • U/V の順序(YUY2 と UYVY の混同)による色の大きな錯誤(赤と青が入れ替わる等)。
  • 色レンジ(リミテッド vs フル)の誤扱い。コントラストや色飽和がおかしく見える原因になる。
  • カラーマトリクス(BT.601 と BT.709)の誤適用。特に SD と HD の混在で色味が変わる。

まとめ

YUY2 は 4:2:2 のパックド Y'CbCr(YUV)フォーマットで、映像キャプチャやリアルタイム処理の分野で広く使われてきました。輝度がフル解像度で保持される一方、クロマは水平方向に半分となるため色精細度が制限されます。色変換時には色域(BT.601/709)やレンジ(フル/ビデオ)の扱い、バイト順序(YUY2 vs UYVY)などの取り扱いに注意する必要があります。現代のワークフローでは NV12 や 4:2:0 系が多く採用されるため、YUY2 との相互変換が必要になるケースが頻繁に発生しますが、用途次第では YUY2 の利点(処理の容易さ、輝度重視の特性)が活きます。

参考文献