« OpenEXR のライブラリ | メイン | アルファチャンネルの圧縮方法 »

2008年05月03日

吉里吉里 ムービー拡張日誌2:: アップサンプリング、ダウンサンプリング

    

輝度に対して、色差は1/4サイズにする形式が一般的だけど、そこはどのようにするかと言う事で、IJG JPEG library のソースを見てみた。
ダウンサンプリング は予想通り単純に4画素平均四捨五入付きだった ( 自分の書いたものでは四捨五入していなかったので、やった方が良さそう。たいして差はでないと思うけど、圧縮は多少遅くてもいいので ) 。
より広範囲の画素を参照してぼやけさせる方法も用意されているようす。

アップサンプリングで補間を有効にすると以下のような加重平均が用いられるようだ。
1 3 | 3 1
1 9 | 9 3
---+---
3 9 | 9 3
1 3 | 3 1
これはトライアングルフィルタで、速度と見た目のクオリティのバランスが良いらしい。
( This is a good compromise between speed and visual quality. )

色差は別にアップサンプリング時に補間しなくてもいいんじゃないかなぁと思うんだけど、かなり違いが出るものなのだろうか?
まあ、試してみる予定なので、それで結果はわかるが。
アルファも1/4サイズにしても大丈夫じゃないかなと思っているので、1/4サイズで試す予定。
ただ、アルファの場合は補間を行わないとガタガタになってしまう可能性が高いので、アルファは補間を使おうと考えている。
で、考えていたデコード方法に問題があることに気付いた。

デコードは、ハフマン or ランレングス復号化 → 逆量子化 → IDCT → 色変換 という順で行われ、JPEG の場合 8x8 ブロック単位で処理される。
色差が 1/4 サイズということを考えると、色変換時は 16x16 ブロック単位で行うことになる。
ハフマン or ランレングス復号化を全データまとめて行い、次に 逆量子化 と IDCT、最後に画像全体を色変換するという方法もあるが、キャッシュの効率を考えると 16x16 ブロック単位でこの一連の復号化処理を行ったほうが効率が良いのではないかと思って、そのような処理にしようと考えていた。
しかし、補間処理をするとなると隣接するブロックの端の色情報が必要になる。
その理由からも色差は補間をしない方向で考えていたんだけど、アルファを補間するとなるとそうは行かない。
さてどうするかと考えてすぐに気付いた。
アルファは独立しているので、別でまとめて処理してしまっても問題ない。
ただ、テンポラリに一度書き出すのはもったいないので、最終的に出力するバッファに書き出すことにする。
で、前のエントリーに書いた「色変換部分は新たに作る必要がある」と言うのは、別にそうじゃなくなった。
ま、色差が補間ないと酷かったり、アルファの1/4がまずそうなら、またいろいろ考え直さないといけないんだけど。



投稿者 Takenori : 2008年05月03日 02:40




comments powered by Disqus
Total : Today : Yesterday : なかのひと