映像のフリッカーを除去する

 桜祭りの夜桜とぼんぼりを映像として撮ったところ、フリッカーと思われるチラつきが発生してしまった。恐らくは、ぼんぼりの中身に蛍光灯のような明滅を繰り返す類の光源が使われていたのだろう。関東の電源周波数の50Hzと、撮影時のシャッタースピード及びフレームレートの組合せのミスマッチに起因して発生してしまったのだと思われる。また色も緑被りしたような発色になってしまっている。

 具体的な処理過程は後述するが、どうにか補正できないかと考え、試行してみた結果をまずは掲載する。
f:id:kachine:20160405001520g:plain
※上半分が補正前、下半分が補正後。ソースはFullHD 30pのH264動画(掲載用にGIF化)

 以下に、具体的な過程を紹介する。
 

映像のイメージシーケンス化

 映像ファイルそのままでは加工が困難である。故に、まずは静止画に変換する。映像ファイルの各コマ(フレーム)を全て抜き出し、大量の画像ファイルに変換する作業である。大量と言っても具体的な枚数は、
[映像の長さ]×[フレームレート]=[静止画枚数]
 となる。例えば5秒の30FPSの映像なら150枚になる。
 なお、映像の頭から末尾までに通し番号を付けた静止画ファイル群をイメージシーケンスと呼ぶ。
 この作業にはffmpegを使用したが、後工程での画像処理を前提としているため、今回はPNGフォーマットに変換した。

  • 叩くコマンド例
ffmpeg -i input.mp4 FRM_%04d.png

input.mp4をFRM_0001~FRM_xxxx.pngに変換する。
 

色補正

 まずは緑被りを修正することにする。使い慣れた画像編集ツールを使えばよいのだが、修正対象画像ファイル数が多いため、1枚ずつ補正なんて事実上やってられない。このためバッチ処理出来るツールを使うとを強くお勧めする。ここではPhotoshopを使った。

  • 作業内容例
    • Photoshopでイメージシーケンス中の1枚の画像をCameraRawでホワイトバランスを補正したうえ、カラーバランスを調整。というアクションを作成。
    • Photoshopバッチ処理機能でイメージシーケンス中の各ファイルに上記アクションを適用し、全てのコマを補正。

 

フリッカー補正

 イメージシーケンス中の各画像を個別に見てみると、単に画面全体の明るさに周期的なムラがあるのでは無く、走査線のように暗い領域が上下に移動している事が確認できた(CMOSセンサのライン読出しに起因すると思われる)。目測ではその移動周期は概ね3フレーム程度*1だった。故に連続する3フレームの各画素を平均してやれば明滅は消えるはずと考えた。
 この理屈では、三脚使用で撮影したフィクス映像に含まれる静止物体については特に問題無いはずだが、動きの大きい動体はエッジが失われてしまう事が容易に想像される。が、とりあえず試してみる。
 イメージシーケンス中の連続した3フレームを平均し、新たなイメージシーケンス(結果的に元の枚数-2枚となる)を生成する。ここではImagemagickを使用。

  • 叩くコマンド例
convert FRM_0001.png FRM_0002.png FRM_0003.png -average mFRM_0001.png
convert FRM_0002.png FRM_0003.png FRM_0004.png -average mFRM_0002.png
rem …以下同様…

FRM_0001~FRM_0003.pngの平均を計算し、mFRM_0001.pngに書き出す。
※こんな感じのコマンドをファイル名をインクリメントしたスクリプトを用意して、処理対象枚数分実行する。
 

イメージシーケンスの映像化

 色補正を行った後、フリッカー補正まで完了したイメージシーケンスを動画に戻す。ここでもffmpegを使用した。

  • 叩くコマンド例
ffmpeg -r 30 -i mFRM_%04d.png -pix_fmt yuv420p -preset slow -tune film -crf 18 -g 15 output.mp4

mFRM_0000~mFRM_xxxx.pngを30FPSでoutput.mp4にエンコードする。各オプションはお好みでどうぞ。
 

結果

 冒頭に比較GIFを掲載した通り、ぱっと見ではいい感じに補正できたと思う。補正後映像(をGIF化したもの)も掲載すると、以下の通り。
f:id:kachine:20160405003132g:plain

 静止画の写真として細部を見れば、エッジがぼやけたような感じでシャープ感が無く、褒められたものではない。が、適度に動きのある動画としては悪目立ちせず違和感は少ないと言ってよいのではないだろうか。
 
 ということで、今回の例ではアウトフォーカスな領域が多いことも幸いしているのかもしれないが、被写体がこの程度の動きなら十分実用的な手法として使えるのではないかと思う。
 


(補足)撮影データ等
  • Camera Model Name : DMC-GM1S
  • Exposure Program : Aperture-priority AE
  • ISO : 500
  • F Number : 1.8
  • Exposure Time : 1/60
  • Exposure Compensation : +0.33
  • Focal Length : 45.0 mm (35 mm equivalent: 98.0 mm)
  • Scale Factor To 35 mm Equivalent: 2.2
  • Video Frame Rate : 29.97

 私事であるが、写真と異なり、映像を撮るようになってからは日が浅い。
 私の場合、写真撮影時は絞り優先モードを多用しており、シャッター優先モードはスローシャッターで光跡を残したい場合や、高速飛行する航空機を撮りたい航空祭などでしか使わない。ミラーレスカメラで映像を撮る場合も、写真と同様に絞り優先モードで撮影していることが多く、今回もそうだった。シャッタースピードを1/50秒にすれば、原理的にフリッカーは発生しないため、人工光源がある場合には留意する習慣を身に着けようと反省した。
 そしてフリッカーとは全く関係ないが、新たな発見としてマイクロフォーサーズの35mm換算焦点距離は実焦点距離の2倍であるが、GM1Sの動画の場合は約2.17倍となっていることに気付いた。GM1Sは4592×3448のセンサを積んでいるが、4416×2484(FullHDの2.3倍)にクロップした領域が動画時に使用されているとすると、画角換算の辻褄がだいたい合う。電子式手ぶれ補正が入っている場合、そのアルゴリズムの都合上、周辺部が切り捨てられることもあるが、GM1Sにはそんな事情は無い。FullHDの1920×1080の整数倍に近いところでクロップすると、これが最大の面積だからということだろうか(2倍では切り捨て領域が大きすぎ、2.4倍ではそもそも画素が足りない、故に2.3倍としたのではなかろうか)。写真撮影時より、多少望遠寄りになるということも頭の片隅に入れておこうと思った次第である。
 



以上。

*1:50Hzの明滅光と、映像フレームレート30FPSが同期するのは10Hz毎、すなわち3フレーム。実際には30ではなく29.97FPSのため、厳格に3フレーム毎には同期しない。という理屈と一致する。