2010-06-25 55 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通道,並且不會將背景變爲透明。但是,這種方法再次需要兩張尺寸相同的圖像。