用Python/PIL裁剪不对称区域的图像

5 投票
1 回答
6154 浏览
提问于 2025-04-16 04:07

有没有办法用Python的PIL库剪切掉图片中矩形的区域呢?

比如在这张图片中,我想去掉所有黑色的区域,还有塔、屋顶和杆子。
http://img153.imageshack.us/img153/5330/skybig.jpg

我想模块可能可以做到这一点,但我还想知道,怎么读取比如svg文件的数据,并把它转换成路径呢?

任何帮助都非常感谢。


(我还有一个小问题,可能更简单:怎么剪切出至少一个圆形的区域呢?)

1 个回答

8

如果我理解得没错,你想在图片中让某些区域变得透明,而且这些区域的形状是随机的。最简单的方法(我能想到的)就是创建一个遮罩,然后把它放到图片的透明通道里。下面的代码展示了怎么做到这一点。

如果你问的是“怎么创建一个多边形遮罩”,我可以推荐你去看看这个链接:

SciPy 创建 2D 多边形遮罩

然后看看被接受的答案。

祝好,

Juha

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)

编辑2

现在想想,如果你有一个黑白的svg文件,你可以直接把这个svg作为遮罩加载(假设白色是你的遮罩)。我没有样本的svg图片,所以无法测试这个。我不确定PIL是否能打开svg图片。

撰写回答