Blender の Glare ノイズを消した話
いや,真似するようなものでもないし,僕自身もう一度やりたいとは思わないけど.念の為,一応したことを記録しておこう.
上の動画を再生してもらうと分かるけど,Blenderでレンダリングした動画にノイズが乗ってしまった.これはCreate Large Scale Oceans in Blender 2.8というチュートリアルに従って僕が作った動画なんだけど,動画の最終調整のコンポジティングで追加したGlareフィルターがノイズを発生させている.
僕は非力なラップトップでこの動画のレンダリングをしたので,これは実にレンダリングに35時間もかかった超大作.それにノイズが乗ってることに35時間後に気づくのは悲劇としか言いようがない.残念すぎるので悪あがきにノイズをごまかす処理をしてみた.
- Kdenliveで動画をフレーム画像に分解
- GIMPで各フレームのノイズを上書き
- レイヤーを連番画像に書き出し
- FFmpegでフレームを繋いで動画に戻す
フレームを画像に分解
Kdenliveでフレームに分解するのは簡単だった.そもそもそういうオプションがあるからね.最終的な成果物を見てから思ったけど,もうすこしフレーム分解にはこだわったほうが良かった.画質が下がるのはまさにこのステップだと思うので.

ノイズを上書きで消す
これをGIMPに取り込んで編集した.ここでの編集だけは自動で一括に… というわけにも行かず,ただただ面倒くさい編集作業になる.することは下に書くような感じ.今回は151枚しか画像がなかったから良かったものの,これが1,000枚とか2,000枚とかだったら手作業でやるのは至難の業だね…
- 第1フレームのノイズを,第2フレームの同じ場所で上書き
- もし第2フレームの同じ場所にもノイズがあれば,第3フレームからコピー
- 第kフレーム以降の画像中のノイズは,第 (k – 1) フレームの同じ場所で上書き

1枚だけ前のフレームからコピーすれば,30fpsで動いてる動画の中ではそれほど気にならないでしょうと思ってね.まぁその読みは半分当たったような,半分外れたような.最初に載せた動画を見て分かると思うけど,やっぱり元々ノイズがあった場所はちょっとだけ不自然だもんね.
レイヤーを連番画像に書き出し
各フレームはレイヤーとしてGIMPにインポートしてるから,レイヤーをそれぞれ画像にエクスポートしなきゃならない.そのためにはContinuous Saveというプラグインが役に立った.

すごい歴史の深いプラグインなのね… 2001年から始まってる.2019年にも更新されてるなんてすごい.ありがたや.

連番画像を動画へ
最後に各画像を繋げて動画に戻す.この作業は簡単で,FFmpegがあればコマンド1発.Qiitaの記事を参考にしたよ.
$ ffmpeg -r 30 -i image_%03d.png -vcodec libx264 -pix_fmt yuv420p -r 60 out.mp4
説明が分かりやすいので引用しましょう.
ffmpegで連番画像から動画生成 / 動画から連番画像を生成 ~コマ落ちを防ぐには~ – Qiita
-rが2回書いてありますが、最初の-rオプションで30fpsの連番画像ということを明示して、それを2回目の-rオプションで60fpsで動画化するように指定しています。つまり、この場合に出力される動画は、1秒間に違う画像が30枚あり、同じ画像を2度表示することで結果的に60枚表示していることなります。
GIMPプラグインのContinuous Saveのデフォルトの出力ファイル名はMyPicture_00000001.pngとかなので,僕の場合はこういうコマンドでしたね.
ffmpeg -r 30 -i MyPicture_%08d.png -vcodec libx264 -pix_fmt yuv420p -r 30 out.mp4
