3

私は、スプライトシートを分離する必要があるプログラム、つまり、画像を連続する色の領域に分離する必要があるプログラムに取り組んでいます。

これまで画像処理をしたことがないので、どうしたらいいのか気になります。ピクセルカラーをテストした後はどうすればよいですか?どのピクセルが各スプライトに適合するかを判断するための最良の方法は何ですか?

すべての入力画像の背景は均一であり、背景のアルファチャネルとは異なるアルファチャネルが色としてカウントされます。出力画像の順序は、左右、上下にする必要があります。私のプロジェクトはPySideで書かれているので、このタスクにも使用したいと思っていますが、必要に応じてさらにライブラリをインポートすることもできます。

返信ありがとうございます!

PS:私はPySideを使用しているので、PySideタグが適切かどうかはわかりませんが、質問にはGUIの側面は含まれていません。modが属していないと感じた場合は、遠慮なく削除してください。


たとえば、次のようなスプライトシートがあります。

入力画像

私はそれをこれらに分けたい:

出力1 出力2 出力3 出力4 出力5 出力6 出力7 出力8

4

1 に答える 1

4

これは、スプライトを扱うものすべてに実装する必要があるように思えますが、ここでは独自のスプライト スプリッターを実装します。

ここで最初に必要なことは、個々のオブジェクトを抽出することです。この状況では、ピクセルが背景かどうかを判断するだけです。原点の点が背景ピクセルであると仮定すると、完了です。

from PIL import Image

def sprite_mask(img, bg_point=(0, 0)):
    width, height = img.size
    im = img.load()

    bg = im[bg_point]
    mask_img = Image.new('L', img.size)
    mask = mask_img.load()
    for x in xrange(width):
        for y in xrange(height):
            if im[x, y] != bg:
                mask[x, y] = 255
    return mask_img, bg

上記で作成した画像を保存してmask開くと、次のように表示されます (空のウィンドウ内に四角形を追加しました)。

ここに画像の説明を入力

上の画像で、他のスプライト内にあるスプライトを結合したい場合、次に必要なことはその穴を埋めることです (追加された長方形のように、上の図を参照)。これはもう 1 つの単純な規則です。[0, 0] の点から点に到達できない場合、それは穴であり、埋めなければなりません。あとは、各スプライトを個々の画像に分離するだけです。これは、連結成分のラベル付けによって行われます。コンポーネントごとに、ピースの寸法を定義するために軸に沿った境界ボックスを取得し、元の画像から特定のコンポーネントに属するポイントをコピーします。簡潔にするために、次のコードはscipyこれらのタスクに使用します。

import sys
import numpy
from scipy.ndimage import label, morphology

def split_sprite(img, mask, bg, join_interior=True, basename='sprite_%d.png'):
    im = img.load()

    m = numpy.array(mask, dtype=numpy.uint8)
    if join_interior:
        m = morphology.binary_fill_holes(m)
    lbl, ncc = label(m, numpy.ones((3, 3)))

    for i in xrange(1, ncc + 1):
        px, py = numpy.nonzero(lbl == i)
        xmin, xmax, ymin, ymax = px.min(), px.max(), py.min(), py.max()

        sprite = Image.new(img.mode, (ymax - ymin + 1, xmax - xmin + 1), bg)
        sp = sprite.load()
        for x, y in zip(px, py):
            x, y = int(x), int(y)
            sp[y - int(ymin), x - int(xmin)] = im[y, x]

        name = basename % i
        sprite.save(name)
        print "Wrote %s" % name

sprite = Image.open(sys.argv[1])
mask, bg = sprite_mask(sprite)
split_sprite(sprite, mask, bg)

これで、質問に含めたとおりのすべてのピース (sprite_1.png、sprite_2.png、...、sprite_8.png) が得られました。

于 2013-01-21T04:08:35.503 に答える