vol.113 「視覚的に品質劣化のない」圧縮アルゴリズムで実際には失われている画像データを解析する方法

「視覚的に品質劣化のない」圧縮アルゴリズムで実際には失われている画像データを解析する方法

DP 1.4/1.3、EDP 1.4、HDMI 2.1、DSI 2.0/1.3上でのVESA DSC 1.2/1.2aの評価

米国シノプシス 

ベリフィケーション・グループ ディスプレイR&Dチーム


RRMファイルの読み出し/ダンプ機能をDisplayPort VIPに追加

まず、PPMフォーマットのイメージの読み出し/ダンプ機能を追加しました[3]。シノプシスDisplayPort VIPは、入力PPMファイルとしてsnps_dp_dsc_input_file.ppmを読み込みます。このファイルはソフト・リンクで、任意のPPMファイルを参照先にできるため、VIPのコードは変更する必要がありません。このPPMファイルを解析して読み込んだデータは、ドライバ(シノプシスVIPまたはカスタマーDUT)に渡されます。ドライバは、VESA DSCアルゴリズムを使用してソース・イメージを圧縮し、DisplayPortリンクに送信します。シンク側のVIPは圧縮されたストリームをサンプルし、VESA DSCアルゴリズムを使用して圧縮展開し、そのデータをsvt_dp_main_link_<frame_number>.ppmという名前のPPMファイルにダンプします。

 

VIPの柔軟性を高めるには、処理対象の画像のフォーマットを識別して任意のPPMファイルを読み出せるようにする必要があります。シノプシスのDisplayPort VIPには、PPMファイルのヘッダを解析し、画像のフォーマット、高さ、幅、色深度などの情報を取得してVIPコンフィギュレーションに値を割り当てる機能があります。また、画像フォーマットがDisplayPort DSCでサポートされているフォーマットに準拠しているかどうかを確認する機能もあります。シンク側ではイメージをフレーム単位でダンプし、シミュレーションの最終段階で圧縮展開後のイメージとソース・イメージを比較して、その差分をSNPS_DP_DSC_PIC_DIFF.ppmファイルに格納します。ここでも、画像フォーマットが維持されているかどうかがチェックされます。フォーマットが一致しない場合は、ソース・イメージのフォーマットが使用されます。

概要

ディスプレイ装置の品質はここ数年でめざましい向上を遂げ、今や4Kディスプレイが主流になったばかりでなく、8Kおよび10K時代の到来も迫っています。これに伴い、ディスプレイ・リンクのデータ転送量も飛躍的に増大しているため、現在ほとんどのディスプレイ・インターフェイスが何らかの圧縮技術を利用しています。中でも特に広く利用されているのがVESA DSC(Display Stream Compression)1.2/1.2aです[1]VESA DSCは視覚的に品質劣化のない圧縮アルゴリズムを使用しており、VESA HDMI 2.1、VESA DisplayPort(DP)1.3/1.4[2]、VESA Embedded Display Port(eDP)v1.4、MIPI Display Serial Interface(DSI)2.0/1.3に採用されています。本稿では、まず圧縮アルゴリズムの品質を解析する方法をいくつか説明した後、実際にVESA DSCを評価した結果をご紹介します。 

はじめに

VESA Display Stream Compression仕様(DSC V1.2)のセクション1.2には以下の記載があります。

 

「DSCアルゴリズムは、ディスプレイ・リンク上で視覚的に品質劣化のないビデオ圧縮を低コストでハードウェア実装することを目的として設計されています。」

 

ほとんどの圧縮アルゴリズムでは、多かれ少なかれ何らかのデータが失われます。したがって、「視覚的に品質劣化のない」圧縮とは、その違いが人間の目ではほとんど識別できないことを意味しています。ソース・イメージと圧縮展開後のイメージの間にどれだけの違い(品質の劣化)があるかを正確に評価するため、筆者らは差分をPPM(Portable Pixmap)形式のファイルにダンプして視覚的に解析できるようにするとともに、数学的証明によって定量的解析も可能にするアルゴリズムを開発しました。このアルゴリズムは任意の2つのPPM形式画像を比較し、その差分をPPM画像として保存し、ピクセル単位でデータを比較して不一致率を求めます。シノプシスDisplayPort VIPには、このアルゴリズムがモジュールとして追加されています。

図1:全体的なトポロジ

差分ダンプのアルゴリズム

ソース・イメージと圧縮展開後のイメージの差分を視覚的に評価するのは純粋に主観的な問題であるため、差分を表現する方法はいくつもあります。ここでは2つの方法について説明します。

グレースケール法

この方法では、差分にオフセット値128を加え、負の値を0~255の正のスケールにシフトします。たとえば差分が(-128,-128,-128)の場合、このスケールでは(0,0,0)となります。同様に、(0,0,0)は(128,128,128)となり、(127,127,127)は(255,255,255)となります。こうすると、すべての差分がグレーを基準に測定されます。グレースケール法という名前はここから由来しています。

 

ソース・イメージと圧縮展開後のイメージの座標位置(x, y)におけるピクセル値の差分が(+1,+1,+1)の場合、グレースケール法では(129,129,129)にマップされます。

 

▶ (+1,+1,+1) => (129,129,129) => グレー

▶ (-1,+1,+1) => (127,129,129) => グレー

▶ (-1,-1,+1) => (127,127,129) => グレー

▶ (+10,0,0) => (138,128,128) => グレー

 

ほとんどの場合、差分はそれほど大きくないため画像全体がグレーになります。このことは、視覚的に品質劣化のない圧縮アルゴリズムであることを証明しています。

 

差分にオフセット値128を加えるのではなく、差分の値の絶対値をとると差分画像は黒になります。

 

▶ (+1,+1,+1) => (1,1,1) => 黒

▶ (-1,+1,+1) => (1,1,1) => 黒

▶ (-1,-1,+1) => (1,1,1) => 黒

▶ (+10,0,0) => (10,0,0) => 黒

 

これら2つの方法は基本的に同じものです。グレースケール法ではカバーできる値の範囲が半分になりますが、-128~+127の範囲でカバーできないような差分値となることは考えにくいため、大きな問題ではありません。

 

例として、DSCアルゴリズムによる圧縮前の画像と、圧縮展開した後の画像を示します。差分画像を見ると明らかなように、視覚的にはデータの違いが認められず、定性的には非常に良好な圧縮/展開アルゴリズムであると言えます。

図2:圧縮前のソース・イメージ

図3:シノプシスDisplayPort VIPから出力された圧縮展開後のイメージ

図4:圧縮前と展開後のイメージの差分(グレースケール)

図2をソース・イメージとして圧縮を実行した場合、snps_dp_dsc_pic_diff.svモジュールからは以下の内容が出力されます。

 

Diff pixel data written into file SNPS_DP_DSC_PIC_DIFF.ppm. Total error counter = 0. Total number of components that differ = 82835, out of total components 921601. percentage difference 8.988163

 

不一致率は10.33%ですが、どのコンポーネントも差は小さいため、グレーからかけ離れた色にはならず、図4で大きな差異は認められません。

絶対スケール法

絶対スケール法では、ソース・イメージと圧縮展開後のイメージの全コンポーネントを比較し、符号ビットなしの絶対差分をとります。色深度8ビットの場合、差分は-256~+255の範囲をとり、これを表現するには9ビットが必要です。これでは実質的に2倍の色深度となるため、符号ビットを取り除きます。この方法では2つの値が同じ色になるという重複が発生しますが、ここではどの位置にどれだけの差があるかを知ることが最大の目的であるため、このことは問題になりません。

 

▶ (-1,+1,+1) => (255,1,1) => 赤

▶ (+1,+1,+1) => (1,1,1) => 黒

▶ (+1,-1,+1) => (1,255,1) => 黄緑

▶ (-1,-1,+1) => (255,255,1) => 黄

▶ (+1,+1,-1) => (1,1, 255) => 青

表1:カラー・コード[4]

差分量が同じでも、符号付きの値がどのコンポーネントで変わるかによってまったく異なる色になります。差分量は非常に小さいことがほとんどですが、この性質を活用することによって、ソース・イメージと圧縮展開後のイメージの違いを明確に視覚化できます。

 

図5に、ソース・イメージと圧縮展開後のイメージの差分(不一致率1.84%)を絶対スケールで表示した例を示します。入力には、図2と同じ画像を使用しています。この場合のスライス数は垂直4、水平4で、ピクセルあたりビット数(bpp)は12.125です。

図5:絶対スケールで表示したソース・イメージと圧縮展開後のイメージの差分(不一致率1.84%)

snps_dp_dsc_pic_diff.svモジュールからは以下の内容が出力されます。

 

Diff pixel data written into file SNPS_DP_DSC_PIC_DIFF.ppm. Total error counter = 0. Total number of components that differ = 16976, out of total components 921601. percentage difference 1.842012

 

不一致率が高くなると、下図に示すようにより多くのピクセルが目立ってきます。不一致はエッジおよびテクスチャ部分に集中していることが分かります。

図6:絶対スケールで表示したソース・イメージと圧縮展開後のイメージの差分(不一致率8.85%)

同じ画像をグレースケールに変換すると、圧縮による劣化は小さくなります。

VESA DSCの評価結果

今回の検証では多くのデータが得られました。ここでは、これらのデータから明らかになった全体的傾向について見ていきます。

 

スライス数とコンポーネントあたりビット数(bpc)を固定した場合の不一致率を調べてみると、ターゲットのピクセルあたりビット数(bpp)が大きいほど不一致率が低下することが分かりました。これは予想に一致しています。bppの値が大きいと、同じ量のデータをより多くのビットで符号化でき、圧縮が弱くなるためです。

 

図7は、解像度640x480、bpc=8、スライス数16*1の画像の場合のグラフです。

図7:ピクセルあたりビット数(bpp)と不一致率の関係

スライス数を横軸、不一致率を縦軸にとると、スライス数が増えるにつれ不一致率が大きくなっています。つまり、スライス幅が小さいほど劣化は大きくなります。このグラフを見ると分かるように、スライス数12、24のようにスライス幅が整数でない場合には不一致率が低下します。各スライスは別々に処理されるため、スライス数はスループットに大きく影響します。

 

図8は、解像度640x480、bpc=8、ターゲットbpp=15の画像の場合のグラフです。

図8:スライス数と不一致率の関係(640x480フレームの場合)

次のグラフに示すように、bpp=15、bpc=8に設定し、画像サイズを大きくすると不一致率が上昇します。

図9:スライス数と不一致率の関係(3840x2160フレームの場合)

まとめ

PPMファイルの読み出しおよびダンプ機能をVIPに追加することにより、圧縮アルゴリズムが正しく実装されているかどうかを独自の観点から評価できるようになります。VIPを設計する際には、トランザクションをスコアボードに記録してサンプルしたデータと駆動したデータが一致するかどうかを見るのが一般的な手法ですが、圧縮の場合はソース・データと圧縮展開後のデータが全く同じであることはほとんどないため、このようなアプローチはあまり意味がありません。データ・セットが異なると不一致率も異なります。本稿で紹介した方法を使用して差分をPPMファイルにダンプして画像を比較すると、圧縮による品質劣化を現実的な方法で評価できます。また、この方法はあらゆる種類の圧縮アルゴリズムに適用できるという利点もあります。

 

参考文献

[1] VESA Display Stream Compression Specification version 1.2

[2] VESA Display Port Specification version 1.4

[3] PPMイメージの表示にはGIMP(GNU Image Manipulation Program)を使用。

[4] http://www.ascii-code.com/html-color-names.php