MPEGのブロックノイズを消す

July 26, 2011
H.264(EOSムービーやAVCHDなど含めて)は一見綺麗に見えるのですが、ちょっと極端なカラーグレーディングを行なうと途端にブロックノイズと色のムラが目立ってきます。このブロックノイズをPhotoshopを用いて消す方法を紹介します。ブロックノイズだけでなくグラデーションのバンディングなどにも有効ですが、どちらもあまり酷い状態だと消せません。

PhotoshopのバージョンはCS5.5を想定しています。CS4でも同様の機能があるので大丈夫だと思うのですが、全く同じ結果が得られるかは保証できません。

まずブロックノイズが生じる理由。よく知られているようにMPEGではブロック状にデータが区切られて変換され圧縮されます。H.264では4x4または8x8のブロックになっていて、(画面内の情報量にもよりますが)このブロックの境界に差異が生じるためにブロックノイズになります。

赤かぶりしている元素材に対して、極端なカラーグレーディングを施してみます。

(クリックすると原寸大に拡大されます)

00015-o.jpg
00015-b.jpg
拡大して見てみると、暗い部分に青いノイズ、明るい部分に赤と緑のブロックノイズが目立ちます。

0015-nenl.jpg
単にブロック状になるだけであれば色の濃淡だけの話なのですが、H.264などのMPEGではYPbPrに4:2:0の圧縮がかかっています。大雑把に言うとYPbPrはYが輝度、PbがB(青)と輝度の差の情報、PrがR(赤) との差の情報を記録していて、これでRGBの各チャンネルを再現するわけです。

変換式はいくつか有名なものがありトランスコーダーによって変換に特徴があるのですが、要は変換されたR/G/Bの各チャンネルごとに品質に差がでるということです。 すごく平易な言い方をすればY/Pb/Prのすべての情報から作成されるG(緑)の情報量が一番多くなります。これは非圧縮の4:4:4以外では常に生じる問題です。

これにセンサーのノイズやらマクロブロッキングの要因が加わってMPEGらしい(?)ブロックノイズの出来上がりというわけです。

グレーディング前のデータのRGBの各チャンネルを見てみると以下のようになります。

Deblock_RGB_channel.jpg
チャンネルごとにブロックノイズの出方に違いがあり、これらの干渉によって色のムラが生じてしまいます。

ムービーはあらかじめ各チャンネル10bit以上のDPXやTIFFに変換しておいてください。変換ソフトによっては変換中にグレインをかけてしまったり、ブロックノイズ低減を行なってしまうものもあるので注意してください。カラコレでホワイトバランスの調整くらいはしておいてもいいかもしれませんが、ただでさえ極貧のMPEGのレンジを狭くしてしまう可能性が高いので、カラコレやカラーグレーディングをかける前の撮影直後の状態で行なうことが望ましいです。

QuickTimeならPhotoshopでも読み込めますがあまりお勧めはしません。できればOpenEXRを使いたいところですが、Photoshopでは32bit-floatでは機能に制限がありすぎて使えません。

Photoshopでの作業は16bitモードで行ないます。読み込んだファイルのR/G/Bの各チャンネルの状態に合わせてフィルタ「Add Noise(ノイズを加える)」を使用します。R/G/Bのチャンネルをひとつずつ選択して個別に調整したノイズをかけていきます。

addnoisescreen.jpg ブロックノイズが目立たなくなる程度で、完全にわからなくなるまでかける必要はありません。ガウス分布で大体1〜2%くらいだと思います。

addnoiseexam.jpg
この状態ではまだ色ムラが目立ちます。粒状感も増えていますので、RGBのチャンネルをすべて選択しフィルタ「Reduce Noise(ノイズを軽減)」を使用して調整します。当たり前ですがかけすぎるとヌルヌルの画になってしまうので注意。完全に消そうとしないで目立たなくなるギリギリのところにしておきます。

rednoisescreen.jpg
一番下に「Remove JPEG Artifact」という、いかにもな感じのオプションがありますが、今回は使用しません。素材によっては一度試してみる価値はあるかもしれませんが、ディテールがぼやけてしまったりして動画ではあまり効果的ではないように思いますので、私は使用することはありません。

この作業をアクションに登録してバッチ処理すれば出来上がりです。保存には16bitのTIFFや10bit Cineonを使用します。8bitで保存してしまうと結果が極端に悪くなるので注意してください。出力したファイルをAfterEffectsなどで読み込む際には必ず16bit Int以上(FlameやLustreを使用する場合は12bit Int以上)で読み込んでかラーグレーディングの作業を行なってください。可能ならfloatでの作業を推奨します。

(クリックすると原寸大に拡大されます)

00015-d.jpg
冒頭のグレーディング済み画像と比較してみると、ブロックノイズが目立たなくなり明るい部分の赤と緑のブロックノイズや暗い部分で目立つ青いブロックノイズが低減されています。ホワイトバランス調整などの極端なカラコレ/グレーディングでなければほとんど見えなくなります。

これがベストな方法ではないかもしれませんが、Photoshopだけでできるので私は割とよく使います。そもそも「MPEGでデータ入れてくれるな」って思うのですが、その辺は置いといて...

ブロックノイズに悩まされているようでしたらダメモトと思って一度お試しください。


[関連記事]
もっとひどいブロックノイズを消す
5DtoRGB
GH2で176Mbit GOP1で撮影したムービー