2010-09-14 3 views
4

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

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

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

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


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

+1

В этом примере не будет возможности программно удалить башни, крыши и полюса без сложного подхода к компьютерному видению. Лучше всего сделать это вручную. И что именно вы хотите исключить из черных областей? Цифровые изображения прямоугольные - вы хотите сделать их прозрачными? Что касается ImagePath, Path создается просто из списка координат, и я уверен, что вы могли бы получить эту информацию из SVG-файла с помощью некоторой библиотеки SVG для python. –

+0

Чтобы сделать все, о чем вы просите, PIL недостаточно, поскольку для обработки изображений не существует очень фундаментальных инструментов. Вы могли бы построить их самостоятельно, используя Python, если у вас достаточно времени, но, учитывая, как сформулирован вопрос, я подозреваю, что у вас возникнут проблемы с этим. Единственная помощь, которую я могу дать, - указать, что вам нужно лучше понять вашу проблему и сразу задать один вопрос. – mmgp

ответ

4

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

Если ваш вопрос «Как создать полигон маски» Я перенаправит вас:

SciPy Create 2D Polygon Mask

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

уш,

Юха

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) 

Редактировать2

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

Смежные вопросы