So-net無料ブログ作成

動画を高画質化して再投稿致しました。 [ソフトウェア]

先日2016年9月11日日曜日に私が観に行った、群馬県邑楽郡大泉町の " 文化むら " の " 大ホール " で開催された、 " 第8回 文化むら キッズ ダンス フェスタ " (Kids Dance Festa)での出演チーム " moda " のダンス パフォーマンスを私が撮影した動画を、インターネット動画投稿サイトの " Dailymotion " に投稿してブログ内に掲載したのですが、今日、動画の画質と音質を向上させて再投稿致しました。

関係者からの許諾は得ておりませんが、どうか御容赦下さい。


Bunkamura Kids Dance Festa (2016_09_11)_2 投稿者 Hard_Solid_Bass
私が撮影した " moda " のダンス パフォーマンスの動画です。
プレイヤーの画質を1080pに設定して全画面表示するとある程度良好な画質で再生出来ます。
DailymotionはCDN (Contents Delivery Network)として " Limelight Orchestrate " というサーヴィスを利用している事が2016年2月17日に発表されておりますが、その割には帯域幅が狭く、低画質でしか再生できない事が多いようです。
特に夜間はアクセス過多でサーヴァーが過負荷になり、再生が止まる事もしばしばあるようです。

ブログ記事: 大泉町 "文化むら キッズ ダンス フェスタ" を今年も観に行って来ました。
http://crater.blog.so-net.ne.jp/2016-09-14

私はこのヴィデオをSONYのコンパクト ディジタル カメラ DSC-RX100で撮影致しました。
このカメラは2012年6月22日発売の古いモデルであり、且つ小型ですので、動画の暗所撮影性能は余り高くありません。
ダンス パフォーマンスを撮影した文化むら大ホールは照明の演出が素晴らしく凝っており、様々な色のスポットライトが激しく明滅し、背景もスクリーンになっていて様々な色に照らし出されます。流石にレーザー ビームはありませんが。
そして私が撮影した場所は2階のバルコニーからで、このカメラの最大ズーム倍率である3.6倍より少し手前位の倍率でしたのでF値が大きくなり、画像が暗くなります。
撮影した動画は非常にノイズが多く、被写体の速い動きは像がブレておりました。
照明が明滅するタイミングでは盛大なディジタル圧縮ノイズが出ており、暗い場面ではザラついたノイズが乗り、被写体の輪郭にはモスキート ノイズが出ておりました。

私はこの動画の画質の改善を試みました。
色々試した中で上手く行った方法は、実に簡単なものでした。
処理は " 端末 " によるコマンド ラインを使用致します。

まずは動画ファイルを " ffmpeg " で連続の静止画像群と音声ファイルに分離します。
ffmpeg -i ./InputVideoFolder/InputVideoFile.MTS -r 60 -f image2 ./FramesFolder/%06d.png
ffmpeg -i ./InputVideoFolder/InputVideoFile.MTS -acodec copy ./AudioFolder/audio.ac3

ファイル パスやファイル名、コーデックなどは適宜変更致します。

" XnConvert " という大量の画像を一括で処理出来る、無料のソフトウェアで以下の処理を行います。
" 動作 " タブを開き、 " 動作を追加 " ボタンを押し、 " フィルタ " の " ノイズ除去 " を選択致します。
このノイズ除去フィルターは非常に優れており、被写体の輪郭の周辺にある、モスキート ノイズなどのノイズを選択的に、効果的に除去出来ます。
このノイズ除去フィルターは複数回適用しても全体の画質はほとんど損なわれません。

ノイズ除去した上でそのままXnConvertで " フィルタ " の " ピント強調 " を適用致します。
すると画像が鮮鋭化されます。

"XnConvert" の公式ウェブサイトのURL:
http://www.xnview.com/en/xnconvert/

次に分離しておいた音声ファイルをオープンソースで無料の音声波形編集ソフトウェアである " Audacity " で編集致しました。手順は以下の様に致しました。

Audacityにaudio.ac3 ファイルを取り込む。(1)
(1)のステレオ トラックを複製する。(2)
(2)のトラックに対してLow-Pass Filter( 200[Hz], -12[dB/Octave] )を適用する。
(1)と(2)を合成。(3)
(3)のトラックに対してHPF( 30[Hz], -36[dB/Octave] )を適用する。
(3)のトラックに対してコンプレッサー( 閾値-6[dB], ノイズ フロア-60[dB], レシオ6:1, アタック タイム0.10[秒], リリース タイム1[秒], ゲイン調整無し, ピークに基く圧縮有り )を適用する。
(3)のトラックに対して増幅( 最大値-0.01[dB] )を適用する。
(3)のトラックに対して導入部分にフェードインを適用する。
最後にこれを320[kbps]の.ac3形式のファイルとして書き出す。

"Audacity" の公式ウェブサイトのURL:
http://web.audacityteam.org/

そしてffmpegにて連番の静止画像群と音声ファイルを結合して再エンコードして完成です。
ffmpeg -f image2 -framerate 60 -i ./NRSharpenedFramesFolder/%06d.png -i ./AudioFolder/audioEdited.ac3 -r 60 -vcodec libx264 -crf 16 ./OutputVideoFolder/videoEnhanced.mp4




ところで、XnConvertのノイズ除去フィルターでは輪郭の周辺のモスキート ノイズなどのノイズ以外のノイズは除去しませんので、他の種類のノイズを除去したい場合には別のソフトウェアで処理する必要がございます。

例えば、ディジタル圧縮のブロック状ノイズならば " waifu2x " のNoise Reductionが効きます。
find ./FramesFolder -name "*.png" |sort > ./data/frame.txt
th waifu2x.lua -model_dir models/my_model -m noise -noise_level 3  -resume 1 -l data/frame.txt -o ./NRFramesFolder/%06d.png


ブログ記事: 最高峰の学習型画像拡大ソフトウェアを使ってみました。
http://crater.blog.so-net.ne.jp/2015-11-26



他には、動画ファイルのまま、 " ffmpeg " のウェーヴレット変換によるノイズ低減処理もございます。
以下にffmpegでアンシャープ マスクによる鮮鋭化とウェーヴレット変換によるノイズ低減処理を行うコマンドを例示致します。
ffmpeg -r 60 -i ./InputVideoFolder/InputVideoFile.MTS -vf "unsharp=luma_msize_x=5:luma_msize_y=5:luma_amount=1.0,vaguedenoiser=threshold=3:method=2:nsteps=6:percent=50:planes=15" -vcodec libx264 -crf 16 ./OutputVideoFolder/OutputVideo.mp4

" vaguedenoiser " がウェーヴレット変換によるノイズ低減フィルターです。
" threshold " の値が大きい程沢山のノイズを除去しますが、同時に細部がぼやけてしまいます。
" percent " の値がノイズ低減処理を反映させる割合で、値が小さい程効果が弱くなります。
詳しくはffmpegの公式ドキュメントを御覧下さい。

"ffmpeg" の公式ドキュメントの "vaguedenoiser" フィルターに関する項目のURL:
https://ffmpeg.org/ffmpeg-filters.html#vaguedenoiser

ついでにffmpegによる強力な手振れ補正処理を行う方法も記載致します。
2016年9月21日現在に於いてはUbuntu 16.04 LTSでffmpegで高性能な手振れ補正を行うには " vid.stab " を使用する必要がございますが、その為にはffmpegを自身でビルドする必要がございます。
注意事項と致しまして、使用したい機能がある場合は自身でそれを追加し、有効化する必要がございます。

まず、 " vid.stab " をインストール致します。
cd ~/
git clone https://github.com/georgmartius/vid.stab.git
cd ~/vid.stab/
cmake .
make
sudo make install


次に、 " libx264 " をインストール致します。
cd ~/
git clone git://git.videolan.org/x264.git
cd ~/x264/
./configure --enable-static --enable-shared
make
sudo make install
sudo ldconfig


続いて、 " libx265 " もインストール致します。
cd ~/
git clone https://github.com/videolan/x265.git
cd ~/x265/
cmake ./source
make
sudo make install
sudo ldconfig


" ffmpeg " に必要なライブラリーを纏めてインストール致します。
sudo apt-get install ffmpeg


ライブラリーだけ残して " ffmpeg " のみを削除致します。
sudo apt-get purge ffmpeg


" ffmpeg " のコンパイルに必要な " YASM " をインストール致します。
sudo apt-get install YASM


" ffmpeg " のコンパイルとインストールを行います。
cd ~/
git clone https://github.com/FFmpeg/FFmpeg.git
cd ~/FFmpeg/
./configure --enable-gpl --enable-libvidstab --enable-libx264 --enable-libx265
make
sudo make install


実行ファイル " ffmpeg " を " /usr/bin/ffmpeg " へ複製致します。
sudo cp ~/FFmpeg/ffmpeg /usr/bin/ffmpeg


" libvidstab.so.1.1 " を " /usr/lib/x86_64-linux-gnu " へ複製致します。
sudo cp ~/vid.stab/libvidstab.so.1.1 /usr/lib/x86_64-linux-gnu


必要なパスが通っている事を確認し、通っていない場合は適宜、環境変数にパスを設定しておきます。

手振れ補正の為に動画の手振れの量を解析致します。
ffmpeg -i ./InputVideoFolder/InputVideoFile.MTS -vf vidstabdetect=shakiness=4:stepsize=4:accuracy=15:mincontrast=0.1 -f null -

解析結果が " transforms.trf " というファイルに記録されます。
" shakiness " は値が大きい程激しくて速い揺れに対応します。
" mincontrast " は揺れ検出で使用する最小のコントラスト値です。画像の中でこの値より大きなコントラストを持った領域を使用して揺れの検出を行います。この値より小さなコントラストの領域は無視されます。

手振れ補正とクロッピングを実行してエンコードするコマンドの例です。
ffmpeg -r 60 -i ./InputVideoFolder/InputVideoFile.MTS -vf "vidstabtransform=smoothing=10:crop='keep',crop=1920:720:0:180,pad=1920:1080:0:180,unsharp" -vcodec libx264 -crf 16 ./OutputVideoFolder/OutputVideo.mp4

" smoothing " は値が大きい程、長周期の揺れを補正します。
具体的には、 (数値 ^ 2 + 1) 枚のフレームを揺れの波形をローパス フィルタリングする際に使用します。
この例では、 " crop " で画像の高さを1080[pixel]から720[pixel]に切り取って、 " pad " で上下に黒帯を付けております。
これにより大抵の手振れは補正可能な筈です。


また、ffmpegで書き出した連続番号画像ファイル群に対して、 " ImageMagick " という無料の画像処理ソフトウェアを使用する事も出来ます。
選択的ノイズ除去の後、鮮鋭化の処理を行うコマンドの例を示します。
find ./FramesFolder/ -type f -printf '%f\n' | while read imputFilename; \
do \
convert ./FramesFolder/$imputFilename -selective-blur 0.5x0.4+4% -unsharp 0x1.5 ./NRUSMFramesFolder/$imputFilename; \
done

引数の " -selective-blur " の構文は " radiusxsigma{+threshold} " です。
" threshold " で設定した閾値以下のコントラストを持つ領域だけを暈します。

処理した後は前述の方法で連番画像から映像に戻して音声ファイルと結合させます。

"ImageMagick" の公式ウェブサイトのコマンドライン オプションのドキュメントの "selective-blur" の項目のURL:
http://www.imagemagick.org/script/command-line-options.php#selective-blur



更にこちらは " Fiji " という画像処理ソフトウェアを使用したノイズ除去の方法です。
" Fiji " は " ImageJ " の便利なプラグイン全部入りのパッケージです。
" ImageJ " は医学、生理学、生物学などの分野の研究者達が使用する事が多いオープンソースで無料でJava VM上で動作する画像処理ソフトウェアです。

Java仮想マシンが動作する環境にしてある事が前提です。
まずは公式ウェブサイトより " Fiji " をダウンロードします。

"Fiji" の公式ウェブサイトのURL:
http://fiji.sc/

" Fiji " を起動してアップデートを済ませて再起動させます。
" Plugins " メニューから " Macros " - " Startup Macros... " を選択します。
ポップアップした " StartupMacros.fiji.ijm " ウィンドウで " File " メニューから " New " を選択します。
以下のマクロをコピー&ペーストします。
inputDirectory = "/home/UserName/Frames";
outputDirectory = "/home/UserName/Frames";
fileList = getFileList( inputDirectory );
for( i = 0; i < fileList.length; i++ )
{
 open( inputDirectory + "/" + fileList[i] );
 run( "Anisotropic Diffusion 2D", "number=10 smoothings=1 keep=10 a1=0.50 a2=0.90 dt=20 edge=5 show_filter show_time" );
 saveAs( "PNG", outputDirectory + "/" + fileList[i] );
 close();
 selectWindow( fileList[i] );
 close();
}

ファイル パスは適宜変更致します。

" Language " メニューから " IJ 1 Macro " を選択します。
" Run " ボタンを押すと、指定したディレクトリーにある連番画像の全部を1枚づつ読み込んでは " Anisotropic Diffusion " (異方性拡散)処理が実行されます。
この処理は優秀で、被写体の輪郭や必要な細部の絵柄を比較的元通りに残したまま、ザラついたノイズだけを暈す事が出来ます。

処理が終わると直ぐに画像はPNG ファイル形式で保存され、開かれていた画像ファイルは閉じられて、次の画像が読み込まれます。

UbuntuなどのLinux ディストリビューションのOS環境ではこれらの様にオープンソースであったり、無料であったりする(勿論、金銭の寄付が可能であればするべきです)ソフトウェアにより動画の画質改善処理が行えます。

以上、文字ばかりで申し訳ございませんでしたが、私の覚え書き的な記事でした。

コメント(0)  トラックバック(0) 

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

Facebook コメント

トラックバック 0