Recorte el área no simétrica de una imagen con Python / PIL

¿Hay alguna forma de cortar áreas no rectangulares de una imagen con Python PIL?

Por ejemplo, en esta imagen, quiero excluir todas las áreas negras, así como las torres, tejados y postes.
http://img153.imageshack.us/img153/5330/skybig.jpg

Supongo que el módulo ImagePath puede hacer eso, pero además, ¿cómo puedo leer datos de, por ejemplo, un archivo svg y convertirlo en una ruta?

Cualquier ayuda será apreciada.

(Mi pregunta secundaria es probablemente la tarea más fácil: ¿cómo cortar al menos un círculo de una imagen?)

Si entendí correctamente, quieres que algunas áreas sean transparentes dentro de la imagen. Y estas áreas son de forma aleatoria. La forma más fácil (en la que puedo pensar) es crear una máscara y colocarla en el canal alfa de la imagen. A continuación se muestra un código que muestra cómo hacer esto.

Si su pregunta era “Cómo crear una máscara de polígono”, lo redireccionaré a:

SciPy Create 2D Polygon Mask

y mira la respuesta aceptada.

br

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") 

Editar

En realidad, no pude resistirme ... la solución de máscara de polígono era tan elegante (reemplace el círculo anterior con esto):

 # 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

Ahora cuando lo pienso. Si tiene un svg en blanco y negro, puede cargar su svg directamente como máscara (asumiendo que el blanco es su máscara). No tengo imágenes de muestra svg, así que no puedo probar esto. No estoy seguro de si PIL puede abrir imágenes svg.