Обрезать несимметричную область изображения с помощью Python / PIL

Есть ли способ вырезать не прямоугольные области изображения с Python PIL?

например, на этом снимке я хочу исключить все черные области, а также башни, крыши и полюса.
http://img153.imageshack.us/img153/5330/skybig.jpg

Я думаю, что модуль ImagePath может это сделать, но, кроме того, как я могу читать данные, например, svg-файл и преобразовывать его в путь?

Любая помощь будет оценена.

(Мой дополнительный вопрос, по-видимому, более простая задача: как разрезать хотя бы круг изображения?)

  • Сортировка контуров слева направо в Python (OpenCV)
  • Как визуализировать сопоставление дескрипторов с использованием opencv-модуля в python
  • One Solution collect form web for “Обрезать несимметричную область изображения с помощью Python / PIL”

    Если я правильно понял, вы хотите сделать некоторые области прозрачными внутри изображения. И эти области имеют случайную форму. Самый простой способ (я могу придумать) – создать маску и поместить ее в альфа-канал изображения. Ниже приведен код, который показывает, как это сделать.

    Если у вас возник вопрос: «Как создать маску многоугольника», я перенаправляю вас на:

    SciPy Создать 2D многоугольную маску

    и посмотрите принятый ответ.

    ш,

    Юха

    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) 

    Edit2

    Теперь, когда я думаю об этом. Если у вас есть черно-белый svg, вы можете загрузить свой svg напрямую в качестве маски (если белый – ваша маска). У меня нет образцов svg-изображений, поэтому я не могу это проверить. Я не уверен, может ли PIL открывать svg-изображения.

    Python - лучший язык программирования в мире.