使用Python / PIL的多边形裁剪/剪辑

时间:2014-03-23 07:11:24

标签: python python-imaging-library

多边形点以及未切割的原始图像由客户端发送到服务器。

有没有办法可以在Python服务器中沿着这些点剪切(裁剪)原始图像,并保存裁剪后的图像? 我目前正在使用PIL,并且更喜欢PIL或PIL扩展解决方案。

提前致谢

3 个答案:

答案 0 :(得分:15)

我找到了使用numpy和PIL的解决方案 - 所以我想分享一下:

import numpy
from PIL import Image, ImageDraw

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

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

# create mask
polygon = [(444,203),(623,243),(691,177),(581,26),(482,42)]
maskIm = Image.new('L', (imArray.shape[1], imArray.shape[0]), 0)
ImageDraw.Draw(maskIm).polygon(polygon, outline=1, fill=1)
mask = numpy.array(maskIm)

# 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("out.png")

答案 1 :(得分:2)

我做了这段代码来裁剪多边形定义的图像区域。

from PIL import Image, ImageDraw

original = Image.open("original.jpg")
xy = [(100,100),(1000,100),(1000,800),(100,800)]
mask = Image.new("L", original.size, 0)
draw = ImageDraw.Draw(mask)
draw.polygon(xy, fill=255, outline=None)
black =  Image.new("L", original.size, 0)
result = Image.composite(original, black, mask)
result.save("result.jpg")

答案 2 :(得分:0)

基于@ user2667409答案的另一种解决方案,
它使用每个元素1位来表示掩码,并将最终结果导出为JPEG格式。

import numpy
from PIL import Image, ImageDraw

# read image as RGB (without alpha)
img = Image.open("crop.jpg").convert("RGB")

# convert to numpy (for convenience)
img_array = numpy.asarray(img)

# create mask
polygon = [(444,203),(623,243),(691,177),(581,26),(482,42)]

# create new image ("1-bit pixels, black and white", (width, height), "default color")
mask_img = Image.new('1', (img_array.shape[1], img_array.shape[0]), 0)

ImageDraw.Draw(mask_img).polygon(polygon, outline=1, fill=1)
mask = numpy.array(mask_img)

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

# copy color values (RGB)
new_img_array[:,:,:3] = img_array[:,:,:3]

# filtering image by mask
new_img_array[:,:,0] = new_img_array[:,:,0] * mask
new_img_array[:,:,1] = new_img_array[:,:,1] * mask
new_img_array[:,:,2] = new_img_array[:,:,2] * mask

# back to Image from numpy
newIm = Image.fromarray(new_img_array, "RGB")
newIm.save("out.jpg")