【GIMP・Python-Fu】若干大き目にファジー選択

GIMPコンピュータ
GIMP
スポンサーリンク

フィルター用プラグイン(.pyスクリプト)の保存場所

メニュー→「編集(E)」→「設定(P)」→「フォルダー」→「プラグイン」
デフォルトでは以下のディレクトリ

%Userprofile%\AppData\Roaming\GIMP\2.10\plug-ins

スクリプトソース

ファイル名:SelectLarger.py

#!/usr/bin/env python
# coding: utf8

from gimpfu import *
from array import array

# 2値化したレイヤーを大き目に選択

def plugin_main(image, layer):
    
    # 選択範囲拡大するサイズpx
    n_px = 9
    # 選択範囲が無い場合終了
    (non_empty,x1,y1,x2,y2) = pdb.gimp_selection_bounds(image)
    if (non_empty == 0):
        return 0
    # 穴の削除
    pdb.gimp_selection_flood(image)
    # 選択範囲を拡大
    pdb.gimp_selection_grow(image, n_px)
    # 選択範囲の反転
    pdb.gimp_selection_invert(image)
    # 前景色に白をセット
    pdb.gimp_context_set_foreground((255,255,255,1.0))
    # 前景色で塗りつぶし
    pdb.gimp_drawable_edit_fill(layer, 0)
    # 中心でファジー選択
    pdb.gimp_fuzzy_select(layer, x1 + float((x2-x1)/2), y1 + float((y2-y1)/2), 127, 2, 1, 0, 0.0, 0)
    # 選択範囲を1px拡大
    pdb.gimp_selection_grow(image, 1)
    # 前景色に黒をセット
    pdb.gimp_context_set_foreground((0,0,0,1.0))
    # 前景色で塗りつぶし
    pdb.gimp_drawable_edit_fill(layer, 0)
    # 中心でファジー選択
    pdb.gimp_fuzzy_select(layer, x1 + float((x2-x1)/2), y1 + float((y2-y1)/2), 127, 2, 1, 0, 0.0, 0)
    # レイヤーの削除
    pdb.gimp_image_remove_layer(image, layer)

register("SelectLarger", "", "", "", "", "",
    "大き目に選択", 
    "RGB*",
    [
    (PF_IMAGE, "image", "Input image", None),
    (PF_DRAWABLE, "drawable", "Drawable", None)
    ],
    [],
    plugin_main,
    menu = "<Image>/Filters")

main()
境界線を含んだ領域を自動選択をさせるために作成しました。
サンプル画像

前回の記事の2値化したレイヤーを追加

円の中心をファジー選択すると白色の部分のみ選択される。

今回のフィルターを実行すると元レイヤーの円の縁部分(境界)まで含めて選択される。

選択されたことを確認するために選択範囲をコピーして貼り付けてみた図。


このスクリプトは輪郭線に合わせて図形を選択することを目的で作成しました。
基本的にスクリプト内のn_px変数分、大き目に範囲選択されます。ただ選択範囲が輪郭線からはみ出す場合は輪郭線が選択範囲になるようにしています。
頑張ってはみましたが、上手く動作するかどうかは対象の画像次第です。

上手く選択できた場合は次に選択範囲を別レイヤーに切り出しに使います。
Python-Fuで選択範囲を別レイヤーに切り出し
一枚の絵をパーツごとに切り出してレイヤー化する作業用に作成しました。手動で実行する手順の自動化で、以前にも同じ目的のスクリプトを作りましたが別手順になります。#!/usr/bin/env python# coding: utf8...

コメント