2010-06-25 88 views

回答

14

您可以在单独的RGBA图像上绘制多边形,然后使用Image.paste(图像,框,蒙版)方法吗? :

编辑:This Works。

from PIL import Image 
from PIL import ImageDraw 
back = Image.new('RGBA', (512,512), (255,0,0,0)) 
poly = Image.new('RGBA', (512,512)) 
pdraw = ImageDraw.Draw(poly) 
pdraw.polygon([(128,128),(384,384),(128,384),(384,128)], 
       fill=(255,255,255,127),outline=(255,255,255,255)) 
back.paste(poly,mask=poly) 
back.show() 

http://effbot.org/imagingbook/image.htm#image-paste-method

4

我觉得@Nick T的回答是不错的,但你需要使用作为写有一个非常大的背景图片他的代码的时候,尤其是在你可能会被标注数的情况下要小心在所述图像上的多边形。这是我在处理大量卫星图像时使用一些对象检测代码并使用透明矩形标注检测结果时所做的事情。为了使代码高效,不管背景图像的大小如何,我提出以下建议。

我会修改解决方案,指定您要粘贴的多边形图像的大小只有保留多边形所需的大小,与后面的图像大小不一样。多边形的坐标是相对于局部边界框指定的,而不是全局图像坐标。然后,将多边形图像粘贴到较大背景图像的偏移处。

import Image 
import ImageDraw 
img_size = (512,512) 
poly_size = (256,256) 
poly_offset = (128,128) #location in larger image 
back = Image.new('RGBA', img_size, (255,0,0,0)) 
poly = Image.new('RGBA', poly_size) 
pdraw = ImageDraw.Draw(poly) 
pdraw.polygon([ (0,0), (256,256), (0,256), (256,0)], 
       fill=(255,255,255,127), outline=(255,255,255,255)) 
back.paste(poly, poly_offset, mask=poly) 
back.show() 
1

使用Image.paste(图像,框,掩模)方法获得转换的alpha通道在背景图像的粘贴区域到多边形图像的对应透明度值。

The Image.alpha_composite(im1,im2)方法利用“粘贴”图像的alpha通道,并且不会将背景变为透明。但是,这种方法再次需要两张尺寸相同的图像。