LoginSignup
7
5

More than 5 years have passed since last update.

(画像処理) Petit Thinning - ゆるい細線化処理を行うフィルタ

Last updated at Posted at 2017-01-31

白地に黒線が描かれている線画画像に対し、ゆる~く細線化を施すフィルタを書きました。細線化といっても1ピクセルの線を抽出するような解析方面のものでなく、どちらかというとレタッチソフト方面の実務的な用途で使うためのものです。細線化とともに、いくつかの異なる太さの線をなるべく均質な太さにするという狙いも含んでます。

image

ソース

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フラグ : 各種パラメータや計算時間をプリント

基本的にemptyrangedilation_max_depthより大きい値にするとノイズが低減しますが、細線化の度合いも低下します。dilation_max_depth5程度にしておいた方が無難です。

基本的な原理

モルフォロジーフィルタのDilation(膨張)を何段階か行って、それらを合成しているだけです。

  • 入力画像に対しDilationを何段階か行い、それぞれの結果をストックしておく
  • Dilationの深度が最も高い画像を選び、その中で線が無い箇所である空白部分を深度が一つ浅い画像で上書きし、次の画像とする
  • 同様の処理を深度を一つずつ上げつつ行ってゆく
7
5
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5