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

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

※ 投稿に登場するAdobeStockやイラストACの素材は紹介している自作のツールを使わなくてもほとんどはAI形式などで配布されているため、慣れていればまあまあ簡単にパーツ分割書き出しはできます。自作ツールはAIやPSDファイルではなく大きなPNG1枚絵の素材を使う場合などを想定しています。

大きなイラストから素材を分割したい

事がある。

美味しそうなクッキーのイラスト素材を見つけた。

https://www.ac-illust.com/main/detail.php?id=1351023&word=%E6%96%99%E7%90%86_%E6%B4%8B%E8%8F%93%E5%AD%90_%E3%82%AF%E3%83%83%E3%82%AD%E3%83%BC_%E6%B0%B4%E5%BD%A9

この素材の場合はAIファイルも入手できのであるが、1枚のpng画像素材しか手に入らない場合など、マスクを切ってレイヤー分割をするなどの対応では要素数が多いと大変そうだ。まあそんなPhotoshopプラグインも探せばある気はする。が、自分としてはコマンドライン処理で自動でそれを行いたい。

という事でpythonでプログラムを作った。分割した。処理としては、透明度を見てパーツの範囲を割り出して、個別pngで書き出す。美味しそうだ。いい絵だ。

簡単な使い方

https://github.com/logicalmodelin/LGMLtools/tree/236cac40ddd5ff905e919880f32722a83ce40866/blog2023/blog20230912_splitImages

バッチファイルが用意していあるので、ここに1枚絵(ただしフルカラーアルファ付き画像のみ対応)をドロップすると画像ファイル名でフォルダが横に作られ、中にパーツ分割したpng画像が出力される。バッチファイルが2つあるが、調整なし、と書いてある方は調整パラメータなしで実直に処理を行うもので、そうでないほうがおそらくみんなこういう挙動のほうが使い易いよね、という調整をしたものとなる。バッチファイルは自分の環境のパイソン初期化処理なども入っているので使う人がもしいたら適当に調整してほしい。

>大きな画像をパーツ分解.bat

call  %~dp0\..\..\venv\Scripts\activate.bat
python %~dp0split_image_island.py %1 --create_subdir -ms 4 4 --border 10 -ca 2

ソースコードと処理の詳細

pythonでコマンド実行できるように作ってある。メインのソースは以下である。

https://github.com/logicalmodelin/LGMLtools/blob/236cac40ddd5ff905e919880f32722a83ce40866/blog2023/blog20230912_splitImages/split_image_island.py

輪郭の抽出にopenCVを用いているが、PILも併用している。単純に各パーツの矩形エリアを切り出しているのではなく、輪郭の内部だけを抽出しているので、ぎゅうぎゅうにパーツ要素が詰まった1枚絵でも正しく分割できる。OpenCVやnumpyは普段あまり使わないので、使い方が妙かもしれないが温かい目で見てほしい。

https://stock.adobe.com/jp/images/%E3%82%B9%E3%82%A4%E3%83%BC%E3%83%84%E3%82%BB%E3%83%83%E3%83%88%E3%80%80%E7%84%BC%E3%81%8D%E8%8F%93%E5%AD%90%E3%82%BB%E3%83%83%E3%83%88/346223484?asset_id=346223484

こちらもかわいい洋菓子のイラスト。このpng画像を分割対応してみる。(※ そもそも AI/EPSが配布されています。レイヤー調整すれば個別書き出しが可能です。)

↑ 分割された画像一覧をBridgeで表示した様子。

↑ このこのラベル?とリボンのパーツは普通に矩形で切り出すと他のお菓子も矩形内に含まれてしまうはずだ。ここがうまく対応できている。(でも本当はナイフはいっしょに含めたい。)

https://stock.adobe.com/jp/images/forest-animal-silhouette-vector-clipart-wild-life-mountain-fauna-illustration-collection-set-stamp-animals/419407592

こんな入り組んだのもいけた。配布素材はjpg画像で透明度を含んでいなかったのでそこだけPhotoshopで前処理を行い、RGBA PNG画像として返還した。 (※実際は扱いやすい eps/ai/svgも配布されている。)

繊細なシルエット絵なので失敗するかと思ったが問題なく対応できた。

ここまで調整なしでうまく行く例を紹介した。実際は、パラメータを調整するか事前に画像調整しないとうまく行かないものもある。具体的には1つのパーツ要素が絵としてはエリアが分かれている場合など。

細かいパラメータ制御

いろいろなパラメータを用意したが、細かいことをさせなければ引数は画像ファイルパスだけでもいい。いや、create_subdirパラメータはつけたほうがいいか。おのおの各パラメータについては実例とともに次のブログ投稿で開設予定。

usage: split_image_island.py [-h] [-o OUTPUT_DIR] [--create_subdir] [-ca CUTOUT_ALPHA]
    [-ms MIN_SIZE MIN_SIZE] [-b BORDER] src_image

positional arguments:
  src_image             source image file path

options:
  -h, --help            show this help message and exit
  -o OUTPUT_DIR, --output_dir OUTPUT_DIR
                        output directory
  --create_subdir       create output subdirectory named by source image file name
  -ca CUTOUT_ALPHA, --cutout_alpha CUTOUT_ALPHA
                        cutout alpha threshold(0~255) for final image
  -ms MIN_SIZE MIN_SIZE, --min_size MIN_SIZE MIN_SIZE
                        images smaller than this size are not exported
  -b BORDER, --border BORDER
                        border size for parts alpha channel

続きの投稿

Previous post Substance Designerに取り込む画像素材の前処理
Next post 大きなイラストから各パーツを自動抽出して個別ファイルに保存する#2(Python)