白と黒のモノクロの紙素材を一度カラーでスキャニングし、後からpythonのOpenCV2値化で白黒にします。
閾値の調整は必要ですが、黒から白、白から黒へ切り替わるエッジ部分が閾値によって変化します。
閾値超調整後、オリジナルが黒色でベタ塗りの部分が、スキャンデータでは白い小傷のようなノイズが残ります。
多分スキャンした紙の小さな凹凸だと考えられます。
ノイズを除去する方法として、思いついたのが、オープニング・クロージングとメディアンフィルターです。
実行してみた結果
×オープニング・クロージング
オープニング・クロージングは白又は黒を膨張収縮することで小さな領域を塗りつぶすような効果があり、ノイズは消えますがノイズ以外のディティールも失われてしましました。オープニング・クロージングの順番を変えると効果は反対に成りますが、線がオリジナルと比べて太くなったり、細くなったりします。図形や文字などを見やすくするには使えそうな感じがします。
〇メディアンフィルター
画像に対しカーネルが3×3であればで9個のピクセルを左上から左へスライドしながら、右下角に向けて、畳み込み演算という処理を行います。処理の内容としてメディアンフィルターは9個のピクセルをソートし、中央値(9個の配列であれば0から数えて5番目のあたい)をスライドするカーネルの中心のピクセルにセットします。(ちなみに、中央値ではなく平均値だと、ぼかし処理になります。)モノクロですので、白(255)か黒(0)のいずれかの値がセットされます。オープニング・クロージングと比べてより細かなノイズが対象になる感じで、対象にもよるのでしょうがノイズ以外の部分のエッジ部分の変化も少ない感じでした。
次に若干画像のサイズを縮小します。
こちらは縮小にによるピクセルの補間?でエッジ部分にアンチエイリアシング処理をを施しギザギザ部分がなめらかに見えるようになります。縮小ですので画像の情報量が減りディティールが失われる可能性があります。中間色をあつかうためモノクロ(白黒)がグレースケールになります。どの程度に縮小するか、補完方法は何にするかは画像次第といった感じでです。
AnimeEffectというソフトで2秒ほどの動画を作成しています。
WebMというファイルで出力していますが、背景を透明にすることが私には出来ませんでした。しかたが無いので背景をグリーンバックにして、動画を利用する側で緑色を透明に置き換えるような使い方をしていました。背景を抜くぐらいであればこれでも良いのですが、AnimeEffectのレイヤーごとに透明度を調整するような処理と相性が悪い。
しかたが無いので、透明度が保持できるAVI形式でコーディック「Ut Video Codec」を使うことにします。こちらであれば可逆圧縮で映像が劣化することも無く、透明度も扱えるので機能的には要求を満たしています。ただ、2秒の動画で約1GBぐらいのファイルサイズとなってしまいます。NTFSの圧縮を使うと意外と圧縮が効いて、半分のサイズになります。
この方法で動画を作成していると早々にストレージがパンクしてしまうと思われます。ストレージを増設すれば良いのですが、面倒ごとが色々あります。動画を素材として参照しているプロジェクトが、絶対パス記録しているらしく、動画ファイルをパスの移動でリンク切れが発生してしまします。ドライブレターを変更せずにストレージの容量だけ増やす必要があり、中々面倒です。
リンク切れを直すツール(出来ればGUIで)を作るか、動画ファイルの移動と一緒に参照しているプロジェクトファイルのパスも変更するプログラム(こちらはCUI)を作ろうかと思います。
コメント