白くなるところが真っ白になってなかったり、黒になるところが真っ黒のになってないところを ffmpeg で補正する。方法はコントラストを上げて白はより白く、黒はより黒くする。今回は白黒ページの色補正だけでリサイズ(解像度を変える)、クロップ(指定範囲で切り取る)、デノイズは行わない。
自炊したときに .jpg で出力したときに使える方法であり、.pdf は ffmpeg では扱えない。一般的に Photoshop や GIMP を使う方法がよく紹介されているが、これらは一度 RGB にデコードして再度 .jpg 出力するときに YUV に変換するので処理が遅くなりがちであるが、以下の方法は RGB 変換を挟まないので処理が早い。
基本コマンド
最近のマンガのコマンド例。真っ白と真っ黒以外に色が多い場合。
ffplay -i input -vf eq=contrast=1.5,lutyuv='st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255':128:128
ffmpeg -i input -vf eq=contrast=1.5,lutyuv='st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255':128:128,format=yuvj420p output.jpg
昔のマンガのコマンド例。白と黒だけ。他の色がある場合は色飛びする。
ffplay -i input -vf eq=contrast=2,lutyuv=val:128:128
ffmpeg -i input -vf eq=contrast=2,lutyuv=val:128:128,format=yuvj420p output.jpg
画質設定
何も指定しなければ最適な品質指定で変換される。個別に指定する場合には -qscale:v [num] で 2 から 31 までの数値を指定する。何も指定しなければ frame= 1 fps=0.0 q=17.2 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.321x
のようにコンソールに表示され、q=17.2 の部分が qscale:v で指定した値になる。
ffmpeg -i input -vf eq=contrast=1.5,lutyuv='st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255':128:128,format=yuvj420p -qscale:v 15 output.jpg
画像をD&Dするバッチファイル(ffmpeg のパス指定を各自書き換える)
フィルタの解説
eq
フィルタでコントラストを上げる、contrast=2 だと白黒だけになるので適宜調整する。lutyuv
フィルタの ‘st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255’:128:128 は Y 輝度信号が 64 以下は 0 にして、65 以上 230 以下はそのままの値にし、231 以上は 255 に変換する。後ろ2つの 128:128 は UV 青色と赤色成分の差分信号を 128 に変換する。- .jpg 出力なので
format=yuvj420p
でフルレンジ .jpg に指定する。
最適な値を調べるには
色が少なければコントラスト上げるだけでよいが、色が多いとコントラストを上げすぎると色が飛ぶのでコントラストを上げすぎない。圧縮率を高くするには黒と白の部分の値がどの値になるか eq フィルタの後に oscilloscope
フィルタで調べてから lutyuv
フィルタの下限と上限を指定して 0 と 255 に変換する。
oscilloscope フィルタで値を調べる
ffplay -i input -vf oscilloscope
ffplay -i input -vf eq=contrast=1.5,format=yuvj420p,oscilloscope
ffplay -i input -vf eq=contrast=1.5,lutyuv='st(0,gt(val,64)+gt(val,230));eq(ld(0),0)*0+eq(ld(0),1)*val+eq(ld(0),2)*255':128:128,format=yuvj420p,oscilloscope
関連記事
使ったフィルタなどの説明
使わなかったフィルタで関係するフィルタの説明
- リサイズ:スケール(リサイズ)
- クロップ:クロップ
- デノイズ:unsharp(先鋭化フィルタ)