5

Python PIL を使用して画像の非長方形領域を切り取る方法はありますか?

たとえば、この図では、塔、屋根、電柱だけでなく、すべての黒い領域を除外したいと考えています。
http://img153.imageshack.us/img153/5330/skybig.jpg

ImagePath Module でそれができると思いますが、さらに、たとえば svg ファイルのデータを読み取ってパスに変換するにはどうすればよいですか?

どんな助けでも大歓迎です。


(私のサブ質問はおそらく簡単な作業です:画像の少なくとも円を切り取る方法は?)

4

1 に答える 1

8

私が正しく理解していれば、画像内の一部の領域を透明にしたいでしょう。そして、これらの領域はランダムな形をしています。(私が考えることができる)最も簡単な方法は、マスクを作成し、それを画像のアルファチャネルに配置することです。以下は、これを行う方法を示すコードです。

あなたの質問が「ポリゴンマスクを作成する方法」であった場合、私はあなたを次の場所にリダイレクトします:

SciPy Create 2D Polygon Mask

受け入れられた答えを見てください。

br、

ジュハ

import numpy
import Image

# read image as RGB and add alpha (transparency)
im = Image.open("lena.png").convert("RGBA")

# convert to numpy (for convenience)
imArray = numpy.asarray(im)

# create mask (zeros + circle with ones)
center = (200,200)
radius = 100
mask = numpy.zeros((imArray.shape[0],imArray.shape[1]))
for i in range(imArray.shape[0]):
    for j in range(imArray.shape[1]):
        if (i-center[0])**2 + (j-center[0])**2 < radius**2:
            mask[i,j] = 1

# assemble new image (uint8: 0-255)
newImArray = numpy.empty(imArray.shape,dtype='uint8')

# colors (three first columns, RGB)
newImArray[:,:,:3] = imArray[:,:,:3]

# transparency (4th column)
newImArray[:,:,3] = mask*255          

# back to Image from numpy
newIm = Image.fromarray(newImArray, "RGBA")
newIm.save("lena3.png")

編集

実際、私は抵抗できませんでした...ポリゴンマスクソリューションはとてもエレガントでした(上記の円をこれに置き換えてください):

# create mask
polygon = [(100,100), (200,100), (150,150)]
maskIm = Image.new('L', (imArray.shape[0], imArray.shape[1]), 0)
ImageDraw.Draw(maskIm).polygon(polygon, outline=1, fill=1)
mask = numpy.array(maskIm)

Edit2

今考えてみると。黒と白のsvgがある場合は、svgをマスクとして直接ロードできます(白がマスクであると想定)。サンプルのsvg画像がないため、これをテストできません。PILがsvg画像を開くことができるかどうかはわかりません。

于 2011-03-25T22:05:35.880 に答える