UYVY 4:2:2 の完全ガイド:ピクセルフォーマットとメモリレイアウトを実務視点で解説
UYVY とは — 概要
UYVY(しばしば UYVY422、uyvy422 とも表記される)は、デジタル映像で使われるピクセルフォーマットの一つで、8ビット成分のパックド(packed)YUV 4:2:2 表現です。各ピクセルごとに輝度(Y)と色差(U, V)を持ちますが、クロマ(U, V)は水平方向にサブサンプリングされ、隣接する2画素につき1つずつ共有されます。
メモリレイアウト(バイトオーダー)
UYVY のデータはバイト単位で並び、基本ユニットは 4 バイト(2画素)です。1ユニットの並びは次のようになります:
- U0, Y0, V0, Y1
つまり左の画素(画素0)は Y0 と U0/V0(U0 と V0 のうち U0 が共用)、右の画素(画素1)は Y1 と同じ U0/V0 を共有します。繰り返すと次は U2, Y2, V2, Y3 ... となります。
注意:これはバイトストリーム上の並びです。CPU のエンディアンや 16 ビットワードの解釈により見かけが異なることがありますが、基本的なコンポーネント順序は上記です。API(V4L2、DirectShow など)や FourCC 名称でも同じ順序が想定されます。
YUV / Y'CbCr の解説 — 用語とカラースペース
「YUV」と呼ばれることが多いですが、正確にはディジタル映像では Y'CbCr の表現(ガンマ補正後の輝度成分 Y' と色差成分 Cb, Cr)が一般的です。UYVY はこの Y'CbCr(8-bit)をパックして保存した形式と解釈できます。
カラースペース(色域・変換行列)には ITU-R BT.601(SD)、BT.709(HD)などがあり、Y↔RGB 変換係数が異なります。さらに、成分のレンジ(スタジオ/限定レンジ=Y:16–235, CbCr:16–240 か、フルレンジ 0–255)も重要で、変換結果に影響します。
UYVY と似たフォーマットとの比較
- YUY2 / YUYV:バイト順が Y0 U0 Y1 V0。UYVY は U0 Y0 V0 Y1 の並びで、どちらも 4:2:2 のパックド形式。
- NV12:プレーン(セミプラナー)形式で Y 平面がまず並び、その後に UV が交互に並ぶ(4:2:0)。GPU 転送やハードウェアデコーダでよく使われる。
- I420 / YV12:3平面の 4:2:0(I420 は Y, U, V の順)。圧縮前後・ストレージ用途で頻繁に使われる。
用途により「パックド(UYVY/YUY2)」と「プラナー(NV12/I420)」を選ぶことが多く、キャプチャデバイスは処理が軽いパックド形式で出力することがある一方、ハードウェアアクセラレーションやエンコードは NV12 を期待する場合が多いです。
用途・互換性
- USB カメラ、ビデオキャプチャデバイス、SDI キャプチャカードなどで生のフレームフォーマットとしてよく使われます。
- Linux の V4L2 では V4L2_PIX_FMT_UYVY(FourCC 'UYVY')として定義されています。Windows の DirectShow でも UYVY をサポートするデバイスがあります。
- FFmpeg や GStreamer などのマルチメディアライブラリは pixel format として "uyvy422" / "UYVY" を扱えます。
UYVY のピクセル読み出し(実装例)
1つの 4 バイトブロック(U0, Y0, V0, Y1)から2つの RGB ピクセルを生成する基本的な手順:
for each 4-byte block (u, y0, v, y1):
pixel0 = convert_yuv_to_rgb(y0, u, v)
pixel1 = convert_yuv_to_rgb(y1, u, v)YUV → RGB の変換(ITU-R BT.601、限定レンジ)としてよく使われる整数近似:
C = Y - 16
D = U - 128
E = V - 128
R = clip((298 * C + 409 * E + 128) >> 8)
G = clip((298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip((298 * C + 516 * D + 128) >> 8)clip は 0–255 に制限する関数です。BT.709 を使う場合は係数が異なります。実際の環境では Y のレンジ(フル/限定)や色域を正しく扱うことが重要です。
注意点・実務上のポイント
- クロマサンプリングの位置(chroma siting):4:2:2 の場合、U/V が左の画素にコサイテッド(co-sited)されるのか中央寄せなのかは環境や API に依存します。画像を厳密に合わせる必要がある場合はデバイスのドキュメントを確認してください。
- エッジや細かいパターンで色収差が出やすい:横方向にクロマ情報が間引かれているため、細い鉛筆線や高周波の色情報で色ムラが出ます。
- 変換コスト:UYVY はパックドなのでメモリアクセスが単純でキャプチャに有利ですが、GPU エンコードや一部 API はプラナー(NV12 等)を要求するため変換が必要になることがあります。大量フレームのリアルタイム処理では変換コストが問題になることがあります。
- ビット深度:UYVY は通常 8 ビット成分ですが、より高いビット深度の 4:2:2 フォーマット(10bit など)も存在します(別の FourCC や API 拡張で扱われる)。
コマンドライン例(FFmpeg / GStreamer / V4L2)
- V4L2 から UYVY を直接キャプチャ(FFmpeg):
ffmpeg -f v4l2 -input_format uyvy422 -video_size 640x480 -i /dev/video0 out.mp4
- 生の UYVY ファイルを再生(FFmpeg):
ffplay -f rawvideo -pixel_format uyvy422 -video_size 720x480 file.uyvy
- GStreamer の例:
gst-launch-1.0 v4l2src ! video/x-raw,format=UYVY,width=640,height=480 ! autovideosink
パフォーマンス最適化のヒント
- SIMD(SSE/NEON)ベースの YUV→RGB 変換ライブラリ(libyuv など)を利用すると高速化できます。
- 可能ならばデバイスと同じフォーマットでパイプラインを構築して余分な変換を避ける。例えばエンコード器が NV12 を期待するならキャプチャを NV12 にするか、ハードウェアで効率よく変換する。
- メモリアクセスパターンを意識する(ストライド、アラインメント)— 2ピクセル単位で U の共有があるため、奇数列の処理に注意。
まとめ — どんなときに UYVY を選ぶか
UYVY は「パックド 4:2:2」としてシンプルでキャプチャ用途に向くフォーマットです。デバイスから直接得られることが多く、処理の最初の段階では扱いやすい反面、ハードウェアアクセラレーションやエンコード向けに別フォーマット(例:NV12)に変換が必要になる場面もあります。色再現や合成の精度が重要ならば、カラースペース(BT.601/709)とレンジ(限定/フル)を明示的に扱うこと、そしてクロマサイティングの取り扱いに注意することが重要です。
参考文献
- Wikipedia — YUV
- Wikipedia — YCbCr
- Linux Kernel — V4L2 pixel formats
- FFmpeg — Pixel Formats
- Wikipedia — FourCC
- ITU-R BT.601 — Recommendation (色変換の基礎)
- libyuv(高性能 YUV 処理ライブラリ) — 実装参考


