白地に黒線が描かれている線画画像に対し、ゆる~く細線化を施すフィルタを書きました。細線化といっても1ピクセルの線を抽出するような解析方面のものでなく、どちらかというとレタッチソフト方面の実務的な用途で使うためのものです。細線化とともに、いくつかの異なる太さの線をなるべく均質な太さにするという狙いも含んでます。
ソース
Pythonで動作します。
使用にあたってPillow
が必要です。
(標準のPythonより、このライブラリが同梱されてるAnacondaを使うのがオススメ)
追記:最初のバージョンでは外部ライブラリにNumpyとPillowが必要だったところを、@pashango2 氏による改善でPillowに一本化&高速化が行われました。多謝!
使い方
$ python petit_thinning.py 6 0.95 5 input.png output.png
コマンドライン引数は
petit_thinning.py <emptyrange> <emptythres> <dilation_max_depth> <path_in> [<path_out>] [-p]
のようになっています。
emptyrange
, emptythres
, dilation_max_depth
がフィルタの効果の出方を変化させるパラメータとなります。
-
emptyrange
: 1以上の整数。細線化の各レベルをどの程度スムースに混ぜ合わせるかの目安 -
emptythres
: 0.0~1.0の範囲の実数。1.0に近づけるほど細線化の効果が強くなりますが、線は途切れがちになります -
dilation_max_depth
: 1以上の整数。大きい数値を指定することでより太い線の細線化に対応できますが、太すぎる線の場合ノイズが発生しがちになります -
path_in
:入力ファイルパス -
path_out
:出力ファイルパス。省略すると入力パス名末尾に_out
がついたものが使われます -
-p
フラグ : 各種パラメータや計算時間をプリント
基本的にemptyrange
はdilation_max_depth
より大きい値にするとノイズが低減しますが、細線化の度合いも低下します。dilation_max_depth
は5
程度にしておいた方が無難です。
基本的な原理
モルフォロジーフィルタのDilation(膨張)を何段階か行って、それらを合成しているだけです。
- 入力画像に対しDilationを何段階か行い、それぞれの結果をストックしておく
- Dilationの深度が最も高い画像を選び、その中で線が無い箇所である空白部分を深度が一つ浅い画像で上書きし、次の画像とする
- 同様の処理を深度を一つずつ上げつつ行ってゆく