事前に定義済みのカスタム量子化マトリクスか、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 での量子化処理とか量子化行列とか