python imaging library (pil)

34
Python Imaging Library (PIL) http://www.pythonware.com/products/pil/

Upload: angelo

Post on 23-Feb-2016

145 views

Category:

Documents


0 download

DESCRIPTION

Python Imaging Library (PIL). http://www.pythonware.com/products/pil/. Возможности PIL:. Групповая обработка изображений - PowerPoint PPT Presentation

TRANSCRIPT

Python Imaging Library (PIL)

http://www.pythonware.com/products/pil/

Возможности PIL: Групповая обработка изображений

PIL идеально подходит для работы с группами изображений. С помощью PIL можно создавать превью, преобразовать изображения из одного формата в другой, распечатывать изображения и т.д.

Отображение изображенийДля отладки удобнее всего использовать метод im.show(). Открывает изображение в стандартном браузере.PIL также может создавать объекты, с которыми работают различные модули для создания GUI, такие как PythonWin, Tkinter, PyQT4

Возможности обработки изображенийОперации на пикселями, фильтры,

преобразование цветового пространстваИзменение размера изображения,

поворот, аффинные преобразованияМетод histogram, который может служить

для автоматического улучшения контраста и извлечения статистических данных из изображения

Основные понятия Размер (атрибут size)

Это кортеж, состоящий соответственноиз высоты и ширины в пикселях

Система координатВ Питоне используется Картезианская система координат с началом отсчета в левом верхнем углу. Например, координаты прямоугольника 800х600 передаются как (0,0,800,600)

Основные понятия Расширение файла (атрибут format)

Функция open узнает расширение из содержания файла, функция save использует название, чтобы определить формат (если он не указан конкретно)

Каналы (метод getbands)Каждое изображение может состоять из

одного или более каналов. Цветовая модель (атрибут mode)

Определяет глубину и цвет пикселя

Основные понятияОсновные цветовые модели:1 (1-bit, ч/б)L (8-bit pixels, ч/б)P (8-bit pixels, пользовательская палитра)RGB (3x8-bit pixels, естественный цвет – true color)RGBA (4x8-bit pixels, естественный цвет с маской прозрачности)CMYK (4x8-bit pixels, цветоделение)YCbCr (3x8-bit pixels, цветной видеоформат)

Основные понятия Палитра

Цветовая модель палитра (“P”) использует цветовую палитру для определения фактического цвета каждого пикселя

Информация (атрибут info)Изображению можно прикрепить дополнительную информацию. info - атрибут типа dictionary

Фильтры (NEAREST,BILINEAR,BICUBIC,ANTIALIAS)

Используются для операций, которые могут сопоставлять нескольким пикселям один.

Фильтры NEAREST – выбирает ближайший пиксель из

входного изображения и игнорирует все остальные (обычно идет по умолчанию во всех методах)

BILINEAR – использует линейную интерполяцию на области 2x2

BICUBIC – использует линейную интерполяцию на обл. 4x4

ANTIALIAS – вычисляет значение выходного пикселя с помощью высококачественного фильтра субдескретизации на всех пикселях, которые могут влиять на выходное значение. В текущей версии можно использовать только с методами resize и thumbnail

Чтение Image.open(infile, mode) im = Image.open(…) создает объект типа

Image Это ленивая операция, изначально

считывается только информация, необходимая для декодирования изображения (цветовая модель, размер и т.д.)

mode – необязательный аргумент, если используется, должен быть “r”

infile может быть строкой с путем файла или объектом типа файл(поддерживающим методы read, seek, tell), открытым в бинарном режиме

Чтение(Примеры) Обычный случай

1. im = Image.open("lena.ppm")

Чтение из открытого файла1. fp = open("lena.ppm", "rb")2. im = Image.open(fp) #бинарный режим

Чтение из строки1. import StringIO 2. im = Image.open(StringIO.StringIO(buffer))

Чтение из Tar-архива1. import TarIO 2. fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")3. im = Image.open(fp)

Сохранение im.save(outfile, format, options)

outfile – строка или файловый объект format – формат файла, можно указывать в

названии options – дополнительные параметры

Определяет формат по названию или указанному формату

Пример

Пример1. from PIL import Image2. ein = Image.open("IMG_3090.jpg") #создаем

объект класса Image

3. print ein.size, ein.mode, ein.format4. # (512, 768) JPEG RGB5. ein 1= ein.rotate(270, Image.BICUBIC, 1)6. ein0 = ein.rotate(270, Image.BICUBIC)7. ein0.save ("einstein0.JPEG")8. ein1.save("einstein1.JPG")

Разница в наличии и отсутствии последнего аргументаein.rotate(270,Image.BICUBIC

, 1) ein.rotate(270,Image.BICUBIC)

Пример работы с каналами

Пример работы с каналами1. import Image2. im = Image.open('C:/panda.jpg')3. r,g,b = im.split()4. images = [Image.merge(im.mode, (r,b,g)),Image.merge(im.mode,

(b,g,r)),Image.merge(im.mode, (g,b,r))]5. def create_new(ls, ind):6. w, h = images[0].size7. n_ind = ind8. bgr = Image.new("RGB",(w*(len(ls)) + n_ind*(len(ls)+1),h +

n_ind*2),"white")9. for i in images:10. assert w, h == i.size11. bgr.paste(i,(n_ind,ind))12. n_ind += ind + w13. return bgr14. new_im = create_new(images,30)15. new_im.show()

Пример работы с каналами

Конвертация изображений в формат JPEG1. import os,sys2. import Image

3. for infile in sys.argv[1:]:4. f, e = os.path.splitext(infile) # f – имя, e –

расширение файла5. outfile = f + ".jpg"6. if infile != outfile: # если формат изображения

JPEG, то пропускаем его7. try:8. Image.open(infile).save(outfile)9. except IOError:10. print "cannot convert ", infile

Создание превью формата JPEG1. import os, sys2. import Image

3. size = 130, 130

4. for infile in sys.argv[1:]:5. outfile = os.path.splitext(infile)[0] + ".thumbnail"6. if infile != outfile:7. try:8. im = Image.open(infile)9. im.thumbnail(size,Image.ANTIALIAS)10. im.save(outfile + ".jpg")11. except IOError:12. print "cannot create thumbnail for", infile

Обрезка, вставка import Image im = Image.open("C:/munch.jpg") w, h = im.size box = (300, 400, 700, h) region = im.crop(box) region =

region.transpose(Image.ROTATE_180) im.paste(region, box)

Обрезка, вставка

До После

Работа с пикселями1. import Image2. im = Image.open("flower.jpg")3. out = im.point(lambda i: i * 3) #

увеличилась яркость

Обработка изображений

Обработка изображений (модуль Image)1. import Image2. im = Image.open('car.jpg')3. im.convert("L").show()4. # Используется матрица по умолчанию: 5. # L = R * 299/1000 + G * 587/1000 + B * 114/1000

можно использовать im.convert(mode, matrix) с собственной матрицей преобразования matrix

Обработка изображений (ImageEnhance)4. import ImageEnhance5. enhancer = ImageEnhance.Contrast(im)6. enhancer.enhance(1.3).show()

Обработка изображений (ImageOps)7. import ImageOps8. ImageOps.colorize(im, (44,36,12),

(242,232,201)).show()

Обработка изображений (ImageChops)10. import ImageChops11. p = Image.open('paper.jpg‘)12. ImageChops.multiply(p, i m).show()

Обработка изображений

Статистика изображения (модуль ImageStat) Позволяет узнать некоторые

статистические данные изображения, такие как экстремальные значения пикселей, количество пикселей, среднее значение и т.д.

Min и max изображения1. import Image, ImageStat2. 3. def minmax(im):4. stat = ImageStat.Stat(im) # Объект типа Stat5. min, max = [], []6. for band in stat.extrema: #[(min1,max1),…,(minN,maxN)]7. min.append(band[0])8. max.append(band[1])9. if len(stat.extrema) == 1:10. return min[0], max[0]11. else:12. return tuple(min), tuple(max)13. 14. Image = Image.open(" lena.jpg“)15. print minmax(image) # (52, 10, 0) (255, 237, 231)16. print minmax(image.convert("L")) # 24 241

Создание CAPTCHA с помощью PIL1. import Image,ImageDraw,ImageFont2. import random3. 4. def create_captcha(charNum, fontSize):5. #задаем список букв, из которых будем далее выбирать:6. alphArr = ['A','B','C','D','E','F','G','H',7. 'J','K','L','M','N','O','P','R','S','T',8. 'W','X','Z','0','1','2','3','4','5','6','8']9. font = ImageFont.truetype('ARIAL.TTF',fontSize) # создаем объект Font10. width, height = font.getsize("W") #ширина и высота текста11. interval = width12. width, height = (width + 5)*charNum, height + 20 #размеры фона13. image = Image.new("RGB",(width,height), (192,192,192)) #создаем фон14. draw = ImageDraw.Draw(image) #создаем из фона объект Draw,

чтобы можно было рисовать на нем

Создание CAPTCHA с помощью PIL16. for i in range(0, charNum):17. #создаем фон для буквы:18. charImg = Image.new("RGB",(fontSize + 10, fontSize + 10),"black")19. tmpDraw = ImageDraw.Draw(charImg)20. #помещаем на фон случайную букву случайного цвета:21. tmpDraw.text( (3, 1), random.choice(alphArr), font = font,22. fill = (random.randint(20,150), random.randint(20, 140),

random.randint(160, 200)) )23. charImg = charImg.rotate(random.randint(-30, 30)) 24. #создаем маску, чтобы фон буквы стал прозрачным:25. mask = Image.new('L',(fontSize + 10, fontSize + 10),0)26. mask.paste(charImg,(0,0))27. hpos = 10 + (i*interval + random.randint(10, interval - 10))28. vpos = random.randint(10, 20) 29. image.paste(charImg,(hpos,vpos),mask) #два раза для лучшей

видимости30. image.paste(charImg,(hpos,vpos),mask)

Создание CAPTCHA с помощью PIL1. for i in range(0,random.randint(3,5)):2. draw.line(3. (random.randint(6,width - 6),

random.randint(3,height-3),4. random.randint(6, width - 6), random.randint(2,

height - 3)),5. fill = (random.randint(70,150),

random.randint(20,220),6.

random.randint(160,220)),7. width = random.randint(1,2)) 8. image.save(“captcha.jpg”)9. create_captcha(7, 40)