大きなイラストから各パーツを自動抽出して個別ファイルに保存する#2(Python)

大きなイラストから各パーツを自動抽出して個別ファイルに保存する#2(Python)

概要

先の投稿の続き。今回は細かい調整をする場合の対応について。

※ツールが更新されたので差分を追加投稿しておいた。

うまく行かない場合の対応

細かいパーツが分離して書き出されてしまう

コマンド引数に border というものを用意した。これは少し画像の不透明部分に仮の縁取りをして近くのパーツをまとめてひと塊にするものである。ドット数で指定する。

https://stock.adobe.com/jp/images/creative-hand-drawn-latin-font-or-hipster-english-alphabet-decorated-with-dots-and-scribbles/197009612

たとえばこの素敵文字素材の場合、ドット上の模様が border 値指定なしでは分離してしまうが、40ドット程度の値を指定するとうまく文字パーツを分割する事ができる。

↑ 左が失敗して細かいパーツが増えてしまった例。右が border 値指定によりうまくまとまた例。このように全体統一した調整をすればいいのであればborder値を指定する。

いくつかのパーツを1つにまとめたい

大きなパーツ同士を一つにまとめたいような場合は、先に画像編集をしておく。薄いアルファ(255段階で1程度)のペイントをパーツをつなげるように(下のレイヤーを用意するなどして)施して画像を書き出し直しておく。パーツがぼけ幅を持つような場合、このペイントの色味が混ざってしまう事があるのでパーツの色に近い色を使ったほうが書き出しが綺麗になる。

最終的な個別パーツ画像に、この薄いペイントの色が残ってしまうが、それが嫌な場合は、 cutout_alpha というパラメータを用意したのでこれを使う。これは指定した値以下のアルファ値を持つ元絵のドットは個別パーツには書き出さない設定をするものである。

パーツに穴が開いているような画像で上手くパーツ処理がいかない場合も、border 値指定でうまく行かないのなら、あらかじめペイントを施す対応をとる。

https://www.ac-illust.com/main/detail.php?id=1123649
こちらのかわいいクマと夏のイラストでは、

(※そもそも素材がAIフォーマットで素材を入手できるので、本来はそこからレイヤー別の出力などを行えばいいのだが、ここでは透過png画像しか手に入らなかったとして話を進める。)一つのパーツが小さな複数パーツで構成されていたり、白い塗りがありそうな部分は線画のみで実は透明だったりするため、きれいに書き出すには事前処理が必要だった。

ツール処理にかける前に加工した例、本当はイラストのふちの色(黄色や青や黒)をアルファ10程度で塗ったのだが、ここではわかりやすくパーツが離れないように追記した部分を薄いピンク色で表示してみた。また、各パーツの内側はバケツツールで白色のペイントを施している。

うまくパーツ個別に分解できた様子。cutout_alpha 値を指定しているので、薄い色で塗ってつなげた部分は完全に透明に変換されている。

※ 繰り返し言うが、このイラスト素材の場合は綺麗に整理されたAIフォーマットでも入手できるため、イラレに慣れた人であればそちらで個別書き出ししたほうがおそらく早い。

なお個別パーツ画像すべての余白サイズは下記で公開した自作ツールを用いて、統一画像サイズになるよう調整してある。

小さいごみがたくさん書きだされるのを避ける

min_size というパラメータを用意した。横幅、縦幅のドット数でこれ以上小さい場合はパーツ画像を書き出さない指定ができる。元画像が汚れていたり、デザイン的に小さいパーツが散布されている場合このパラメータを活用する。

画像フォーマットが対応していない

透明度のあるフルカラー画像を期待しているので、モノクロ画像やjpg画像はエラーになる。ここはあらかじめPhotoshop等画像編集ソフトで修正しておく。24bitRGBA PNG推奨。

例によって、なんなら全部Photoshopでパーツ個別に書き出したほうが早いかもしれない。

バッチファイルはパラメータ調整済み

コマンド引数を調整するやり方を説明してきたが、サンプルとして用意したバッチファイルでは、border、カットオフアルファ値、最低サイズはいい感じに指定されている。数値の参考とされたい。

python %~dp0split_image_island.py %1 --create_subdir --min_size 4 4 --border 10 --cutout_alpha 2
Previous post 大きなイラストから各パーツを自動抽出して個別ファイルに保存する#1(Python)
Next post 大きなイラストから各パーツを自動抽出して個別ファイルに保存する#3 ツール更新(Python)