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

GIMP コンピュータ
GIMP
前回作成したスクリプトで、2値化したレイヤーでファジー選択し、今回のスクリプトを実行すると、元レイヤーが若干大き目に範囲選択されます。
境界線で囲まれた図形をファジー選択すると基本的に境界線の内側が選択されます。それを境界線を含めてファジー選択することが目的になります。
【GIMP・Python-Fu】2値化したレイヤーを追加
「レイヤーの複製」→「色」→「しきい値」の手順をスクリプト化フィルター用プラグイン(.pyスクリプト)の保存場所メニュー→「編集(E)」→「設定(P)」→「フォルダー」→「プラグイン」デフォルトでは以下のディレクトリ%Userprofile...

フィルター用プラグイン(.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変数分、大き目に範囲選択されます。
ただ選択範囲が輪郭線からはみ出す場合は輪郭線が選択範囲になるようにしています。

頑張ってはみましたが、上手く動作するかどうかは対象の画像次第です。

上手く選択できた場合は次に選択範囲を別レイヤーに切り出しに使います。

コメント