4.13. ピクセルフォーマット¶
ISP パイプラインの最終段では、各ピクセルをメモリ内の特定のバイトレイアウトにパックします。選択するフォーマットは、画質、メモリサイズ、そして下流のコードがバイトをどのように読み返すかのトレードオフになります。ごく少数のフォーマットが主流を占めています。
4.13.1. RAW(ベイヤー)¶
デフォルトの出力は生のベイヤーデータで、センサーが生成するのと同じ 1 ピクセルあたり 1 チャンネルのモザイクです。1 ピクセルあたり 1 バイトで、ベイヤーパターンに従って配置されます。偶数行では赤と緑が交互に、奇数行では緑と青が交互に並びます。デベイヤー処理はまだ適用されていないため、各セルにはそのカラーフィルタが通した値だけが保持されています。
生のベイヤーは、完成した 3 チャンネル RGB 画像の 3 分の 1 のメモリで済みます(1 ピクセルあたり 1 バイト対 3 バイト)。しかも、デベイヤーや変換に ISP のサイクルを費やしていません。その代償として、カラーを意識した処理を実行する前に、ユーザーコードが自前でデベイヤーを行わなければなりません。
4.13.2. RGB888¶
RGB888 はカラー画像にとって自然な完成フォーマットです。1 ピクセルあたり 3 バイトで、赤・緑・青の各チャンネルにそれぞれ 1 バイト、1 チャンネルあたり 8 ビットです。1 ピクセルあたり 24 ビットで、1700 万弱の異なる色を表せます。
RGB888 は完成したカラー画像の概念的な基準であり、ほとんどのオフボードソフトウェアがこれを扱えます。組み込みハードウェアでの主な欠点は 24 ビットのピクセルサイズです。プロセッサのワードサイズの倍数ではないためメモリアライメントに不向きで、1 つ下のフォーマットより 50% 大きくなります。
4.13.3. RGB565¶
RGB565 は各ピクセルを 2 バイトにパックします。赤 5 ビット、緑 6 ビット、青 5 ビットです。緑が 1 ビット多いのは、人間の目が緑に対してより高い感度を持つことを反映しており、ベイヤーパターンにおける緑チャンネルの 2 倍の重みとも一致します。
RGB565 は OpenMV Cam のデフォルトのカラーフォーマットです。1 ピクセルあたり 2 バイトは 16 ビット境界に揃っており、MCU の自然なデータ幅に適合します。ピクセルのロード、ストア、演算がすべてフルスピードで実行でき、多くの操作で 2 ピクセルを一度に処理できます。RGB888 の 24 ビットピクセルはこのように揃わず、アクセスのたびにコストを支払います。RGB888 に対する 33% のメモリ節約も積み重なります。QVGA(320 x 240)は RGB565 で 150 KB ですが、RGB888 では 225 KB であり、解像度が上がるほど差は広がります。
トレードオフは、1700 万色ではなく 6 万 5000 色の異なる色になることです。ほとんどのマシンビジョンのタスクではこの違いは目に見えません。アルゴリズムはフレームをしきい値処理やエッジ検出された表現に落とし込み、いずれにせよカラーの詳細の大部分を捨ててしまうからです。人間の鑑賞では、失われたビットは滑らかなカラーグラデーションにわずかなバンディングとして現れますが、目がすぐに気づくようなものではありません。
4.13.4. YUV422¶
YUV422 は各ピクセルの色を輝度値(Y)と 2 つの色差値(U と V)に分け、人間の視覚は明るさの変化に比べて色の変化にはるかに鈍感であるため色差をサブサンプリングします。各ピクセルは自身の Y を持ちますが、隣り合うピクセルのペアは 1 つの U と 1 つの V を共有します。各ペアのバイトレイアウトは 4 バイト(Y0、U、Y1、V)で、平均すると 1 ピクセルあたり 2 バイトになり、RGB565 と同じです。
ただし、その 2 バイトは RGB565 とは異なる意味を持ちます。Y チャンネルだけでそのまま使える 8 ビットのグレースケール画像になり、これはほとんどの古典的なマシンビジョンアルゴリズム(エッジ検出、テンプレートマッチング、ブロブ解析)が実際に消費するものです。U と V のチャンネルは、それを必要とする少数のアルゴリズムのために色情報を運びます。
YUV422 は、パイプラインが両方を必要とする場合に適した選択です。Y のみを読む初期段のアルゴリズムの後に、より細かい色判定のために色差を使う後段が続く場合などです。Y 値はそこにそのままあり、色空間変換なしですぐに使えるからです。
4.13.5. グレースケール¶
グレースケールは 1 ピクセルあたり 1 バイトで、輝度値のみ、色は一切ありません。最も小さい完成フォーマットで、RGB565 や YUV422 の半分、RGB888 の 3 分の 1 のサイズです。
ほとんどの古典的なマシンビジョンアルゴリズムはどのみちグレースケールで動作するため、センサーからカラーチャンネルを直接落とすことは多くの場合最もシンプルでメモリ効率の良い選択です。エッジ検出、ライン検出、ブロブ解析、QR コードのデコード、テンプレートマッチング、AprilTag 検出はすべてグレースケールで動作し、より小さいバッファの恩恵を受けます。
4.13.6. その他のフォーマット¶
OpenMV Cam が生成できるフォーマットのうちいくつかは、通常のフローの一部として ISP パイプラインから出てくるものではありません。
BINARY は 1 ピクセルあたり 1 ビットで、可能な限り最小の表現です。しきい値処理された画像、マスクバッファ、そして各ピクセルでマッチか非マッチかだけを区別する任意の操作の出力に使われます。
JPEG は圧縮されたカラーフォーマットです。一部のセンサーはオンチップの JPEG エンコーダを内蔵しており、JPEG 圧縮されたフレームを直接出力できます。エンコーダを持たないセンサーでは、ISP の後に MCU が完成した RGB またはグレースケールのフレームに対して JPEG エンコーダを実行します。いずれにせよ出力は JPEG ビットストリームで、フレームをストレージに保存したり、帯域幅が制限されたリンク経由で送ったりするのに役立ちます。
PNG は可逆圧縮フォーマットです。センサーは PNG を直接生成しません。MCU が要求に応じて完成した RGB またはグレースケールのフレームを圧縮します。帯域幅やストレージが重要でありながら、JPEG が適用する非可逆圧縮ではアプリケーションが後で必要とする情報を捨ててしまう場合に役立ちます。