原文:Introduction paper to H.264/MPEG-4 AVC including the Fidelity Range Extension. (PDF)
※スウェーデン、 Luleå University of Technology、Dr. Peter Parne氏の 講義ガイダンスの模様。)
事前に定義済みのカスタム量子化マトリクスか、JMフォーマットのマトリクスファイルを使う。
flat 事前に定義済みのflat 16 matrixを使う (default)。
jvt 事前に定義済みの JVT matrixを使う。
<filename> JMフォーマットのmatrixファイルを使う
NOTE:
WindowsのCMD.EXEユーザは、全てのCQMリストを使おうとする場合、コマンドラインの構文解析で問題が起こり得る。これはコマンドラインに最大長制限があるため。そうした場合、リストをJMフォーマットCQMファイルに入れて上記の設定でロードする事を推奨。
16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
16 | 16 | 16 | 16 | 16 | 16 | 16 | 16 |
自分の理解では:MPEG系規格の空間軸圧縮は次の手順を踏む(以下輝度のみ)。
1)ブロック分割:映像を圧縮し易いサイズに小分けする。DCT変換の段階で各ピクセルの輝度値をDCT係数というものに変換する。目標は短くて・似たような数字に変換すること。こうするとファイルサイズが減るが、この段階ではまだ逆DCT変換という計算をすれば無劣化。DCTの過程で輝度値は-1とか+2のように0付近に収束するが、それでも収束しきらないピクセルが残る。
MPEG系規格における量子化は、この収束しきらない輝度値を、なんらかの除数で割り算して余りを丸めるものだ。丸めちゃうから、後で逆量子化という計算をしても元通りにはならない(画質劣化)。その代わり0付近に収束する(圧縮できる)。除数が小さいほど、割り算ででる余りが少なくなり、丸めで捨てちゃう部分が減る。 画質が良くなり、ファイルサイズがでかくなる。除数(割る数)はqpを元に決まるが、qpなら任意の値に固定、crfやマルチパスなら変動。
カスタムマトリクスは、さらに映像の周波数成分で除数を変更できるようにするものだ。
・表の左上が低周波数成分用:人間の目では画質劣化が目立ち易い部分用
・右下が高周波数成分用:画質劣化が目立ちにくい部分用
なので恐らく画面内の輝度値の位置とは関係ないように思う。見た目似てっけど。
いずれにせよflatでは表の通り、高周波も低周波もおなじように「画像を省略」する。ぶっちゃけMPEG-1でも周波数成分に応じて除数を変えるシカケは存在していたようなので、いーのかそれでとゆーカンジだ。
またこれはMain以前のH.264/AVCが体感画質でMPEG-2に劣るとされた理由の一つでもある。High プロファイル非対応のデコーダは再生時の「逆量子化」にこの表しか使えない。
6 | 13 | 20 | 28 |
13 | 20 | 28 | 32 |
20 | 28 | 32 | 37 |
28 | 32 | 37 | 42 |
6 | 10 | 13 | 16 | 18 | 23 | 25 | 27 |
10 | 11 | 16 | 18 | 23 | 25 | 27 | 29 |
13 | 16 | 18 | 23 | 25 | 27 | 29 | 31 |
16 | 18 | 23 | 25 | 27 | 29 | 31 | 33 |
18 | 23 | 25 | 27 | 29 | 31 | 33 | 36 |
23 | 25 | 27 | 29 | 31 | 33 | 36 | 38 |
25 | 27 | 29 | 31 | 33 | 36 | 38 | 40 |
27 | 29 | 31 | 33 | 36 | 38 | 40 | 42 |
10 | 14 | 20 | 24 |
14 | 20 | 24 | 27 |
20 | 24 | 27 | 30 |
24 | 27 | 30 | 34 |
9 | 13 | 15 | 17 | 19 | 21 | 22 | 24 |
13 | 13 | 17 | 19 | 21 | 22 | 24 | 25 |
15 | 17 | 19 | 21 | 22 | 24 | 25 | 27 |
17 | 19 | 21 | 22 | 24 | 25 | 27 | 28 |
19 | 21 | 22 | 24 | 25 | 27 | 28 | 30 |
21 | 22 | 24 | 25 | 27 | 28 | 30 | 32 |
22 | 24 | 25 | 27 | 28 | 30 | 32 | 33 |
24 | 25 | 27 | 28 | 30 | 32 | 33 | 35 |
一番左上は、DC成分用なので一番小さい数字になっている。
左上が低周波数成分用:人間の目では画質劣化が目立ち易い → 画質劣化を抑える小さな数字
右下が高周波数成分用:画質劣化が目立ちにくい → うんと画質劣化する大きな数字
インターとイントラは別の表になっている。動き補償で動きの滑らかさを維持するには高周波数成分を維持する必要があるので、インターの方が右下領域の数字が小さい。
High プロファイルでは映像ストリームにカスタム量子化マトリクスを埋め込む事ができる。cqm=jvtはこの表を埋め込んでいるわけだ。
こうしたマトリクスは自作できる。その場合は彩度用に別のマトリクスを用意する事もできる。個人的にはjvtで充分なのだけど、白黒映画用に一個作ってみたい気もします。
ただし、適切な量子化マトリクスは映像の内容によって大きく異なる。ノイズだらけとかまったくノイズが無いとかディテイルだらけとかアニメ塗りとかアニメでも攻殻機動隊とバグスバニーは別だとか…。
とりあえず潰しの効きそうなTips。
極端に小さな matrix を使うことは、qp を下げるのと同じ量子化効果を持つので、圧縮に伴う画質劣化は減少する。しかし、デブロックフィルタはオリジナル qp と同じ画質劣化があることを前提にした強いフィルタをかけるので、デブロックフィルタでの画質劣化が上昇する。また、オリジナル qp と同等の画質劣化が発生することを前提にモード選択がおこなれてしまい、適切な RD 最適化が行われなくなる。さらに、エンコーダの実装によっては m が 16 bit の表現可能範囲をオーバーフローして、正しい演算結果が得られなくなる可能性すらある。
以上 3 点が極端に値の小さな matrix を使うことの弊害だ。個人的にはそんなことをするぐらいなら素直に qp を下げた方が仕合せになれると考えている。
まるも製作所:2007/06/22(金) H.264 での量子化処理とか量子化行列とか
CQMはカスタム量子化マトリクス(Custom Quantisation Matrix)。
量子化マトリクスは格子状にならんだ数字(*数学で言う行列*)で、個々の数字をquantum(*量子/量子化マトリクスの値*)として扱う。この個々
の数字が元の映像データをどのくらい破棄するかを決める。個々の数字が大きなマトリクスは映像がソフトになり、小さなマトリクスは映像のディテイル保持率
があがる。x264のデフォルトは "flat 16"
マトリクスを使う。これは全ての数字が16で埋まっているもので、デコードの際に特別な扱いが不要なものだ(*Main
Profile以下*)。カスタム量子化マトリクスはHigh
Profileの機能で、実際にはデコード負荷は増えも減りもしないのだが、デコーダ側のサポートが必要となる。XviDのカスタム量子化マトリクスを覚
えている人もあるだろう。大半のケースでデフォルトのH.263量子化で充分だったが[*1]、x264でもflat
16で充分な場合が多いと思われる。しかし中には高周波領域に高い係数が入ったマトリクスを使いたい事があるかもしれない。細かいディテイルがややスムー
スになり圧縮しやすくなる(*ノイズなどの細かい部分を潰せる*)。
--cqmはデフォルトのflatマトリクスか、jvtマトリクスの選択。
flatマトリクスは数字が全て16で埋まっているもので、jvtマトリクスはH.264規格の技術的な作業に当ったJoint Video
Teamが作ったものだ。このコマンドは外部ファイルを用意する必要が無いので使い易い。
*手許ではXviDのMPEG量子化マトリクスはブロックノイズが激減した記憶がある。
CQM is the abbreviation for Custom Quantisation Matrix (or Matrices). A quantisation matrix is made up from a grid of numbers and each one is referred to as a quantum. It is these numbers that define how image data is discarded. A grid with large quantums will produce a softer image, and a grid with lower quantums will retain more detail. x264 by default uses a "flat 16" matrix, which is simply a matrix with all quantums set at 16 and does not require any special decoding. In contrast to this, custom quantisation matrices are a high profile feature and require special decoding support, though the actual decoding of them should require no more or no less resources. You might remember custom matrices from XviD, for most cases the default H.263 quantisation type worked fine, and in the case of x264, flat 16 is probably fine most of the time. In some cases you might want to use a matrix with a lot of high quantums in the high frequency co-efficient areas so that fine details become smoothed slightly and easier to compress.
There are numerous ways to define what CQM you want to use, here are the options available:
--cqm <string> (Presets=jvt, flat)This allows you to select the flat matrix (which is default) or the included JVT matrix (the matrix produced by the Joint Video Team, who is a joint partner in H.264). This is fairly simple to use and the matrices are included in the x264 executable so no external files are required.
■まるも製作所
・2007/06/22(金) H.264 での量子化処理とか量子化行列とか:http://www.marumo.ne.jp/db2007_6.htm#22
■覚書(なるPさん)http://www.geocities.jp/encmemo5whf6jvag8/index2.html#06-02
・cqm アナライズさせるのに使うマトリクスの指定。
x264内には、flatとjvtの2つのプリセットが入っている。
default値は、flatで全部16で埋まってるマトリクスを使っている。
全ての--cqm系オプションに優先。
カスタム量子化マトリクスを使うならおそらくこのオプションが最も実用的で、マトリクスを外部ファイルから読み込むものだ。読み込むファイルはJM(リ
ファレンス・エンコーダ)互換形式でなければならない。マトリクスファイルはDoom9で入手できる。
This option is probably the more practical of the rest when wanting to use a custom matrix. This will allow you to load an external matrix file. The file must be JM compatible (JM is the reference encoder). You can find a collection of external matrix files here at doom9.