350 likes | 740 Views
Python Imaging Library (PIL). http://www.pythonware.com/products/pil/. Возможности PIL:. Групповая обработка изображений
E N D
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), открытым в бинарном режиме
Чтение(Примеры) • Обычный случай • im = Image.open("lena.ppm") • Чтение из открытого файла • fp = open("lena.ppm", "rb") • im = Image.open(fp) #бинарный режим • Чтение из строки • import StringIO • im = Image.open(StringIO.StringIO(buffer)) • Чтение из Tar-архива • import TarIO • fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm") • im = Image.open(fp)
Сохранение • im.save(outfile, format, options) • outfile– строка или файловый объект • format – формат файла, можно указывать в названии • options – дополнительные параметры • Определяет формат по названию или указанному формату
Пример • from PIL import Image • ein = Image.open("IMG_3090.jpg")#создаем объект класса Image • print ein.size, ein.mode, ein.format • # (512, 768) JPEG RGB • ein 1= ein.rotate(270, Image.BICUBIC, 1) • ein0 = ein.rotate(270, Image.BICUBIC) • ein0.save ("einstein0.JPEG") • ein1.save("einstein1.JPG")
Разница в наличии и отсутствии последнего аргумента ein.rotate(270,Image.BICUBIC, 1) ein.rotate(270,Image.BICUBIC)
Пример работы с каналами • import Image • im = Image.open('C:/panda.jpg') • r,g,b = im.split() • images = [Image.merge(im.mode, (r,b,g)),Image.merge(im.mode, (b,g,r)),Image.merge(im.mode, (g,b,r))] • defcreate_new(ls,ind): • w, h = images[0].size • n_ind = ind • bgr = Image.new("RGB",(w*(len(ls)) + n_ind*(len(ls)+1),h + n_ind*2),"white") • for iin images: • assert w, h == i.size • bgr.paste(i,(n_ind,ind)) • n_ind += ind + w • return bgr • new_im = create_new(images,30) • new_im.show()
Конвертация изображенийв формат JPEG • importos,sys • import Image • forinfileinsys.argv[1:]: • f, e = os.path.splitext(infile)#f – имя, e – расширение файла • outfile = f + ".jpg" • ifinfile != outfile:# если формат изображения JPEG, то пропускаем его • try: • Image.open(infile).save(outfile) • except IOError: • print "cannot convert ", infile
Создание превью формата JPEG • importos, sys • import Image • size = 130, 130 • forinfileinsys.argv[1:]: • outfile = os.path.splitext(infile)[0] + ".thumbnail" • if infile != outfile: • try: • im = Image.open(infile) • im.thumbnail(size,Image.ANTIALIAS) • im.save(outfile + ".jpg") • except IOError: • 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)
Обрезка, вставка До После
Работа с пикселями • import Image • im = Image.open("flower.jpg") • out = im.point(lambda i: i * 3) # увеличилась яркость
Обработка изображений (модуль Image) • import Image • im = Image.open('car.jpg') • im.convert("L").show() • # Используется матрица по умолчанию: • # L = R * 299/1000 + G * 587/1000 + B * 114/1000 • можно использовать im.convert(mode, matrix) с собственной матрицей преобразования matrix
Обработка изображений (ImageEnhance) • import ImageEnhance • enhancer = ImageEnhance.Contrast(im) • enhancer.enhance(1.3).show()
Обработка изображений (ImageOps) • import ImageOps • ImageOps.colorize(im, (44,36,12), (242,232,201)).show()
Обработка изображений(ImageChops) • import ImageChops • p = Image.open('paper.jpg‘) • ImageChops.multiply(p, i m).show()
Статистикаизображения (модуль ImageStat) • Позволяет узнать некоторые статистические данные изображения, такие как экстремальные значения пикселей, количество пикселей, среднее значение и т.д.
Min и max изображения • import Image, ImageStat • defminmax(im): • stat = ImageStat.Stat(im) # Объект типа Stat • min, max = [], [] • for band instat.extrema:#[(min1,max1),…,(minN,maxN)] • min.append(band[0]) • max.append(band[1]) • if len(stat.extrema) == 1: • return min[0], max[0] • else: • returntuple(min), tuple(max) • Image = Image.open(" lena.jpg“) • print minmax(image) # (52, 10, 0) (255, 237, 231) • print minmax(image.convert("L")) # 24 241
Создание CAPTCHA с помощью PIL • import Image,ImageDraw,ImageFont • import random • defcreate_captcha(charNum, fontSize): • #задаем список букв, из которых будем далее выбирать: • alphArr = ['A','B','C','D','E','F','G','H', • 'J','K','L','M','N','O','P','R','S','T', • 'W','X','Z','0','1','2','3','4','5','6','8'] • font = ImageFont.truetype('ARIAL.TTF',fontSize)# создаем объект Font • width, height = font.getsize("W")#ширина и высота текста • interval = width • width, height = (width + 5)*charNum, height + 20#размеры фона • image = Image.new("RGB",(width,height), (192,192,192)) #создаем фон • draw = ImageDraw.Draw(image)#создаем из фона объект Draw, чтобы можно было рисовать на нем
Создание CAPTCHA с помощью PIL • foriin range(0,charNum): • #создаем фон для буквы: • charImg = Image.new("RGB",(fontSize+10, fontSize+10),"black") • tmpDraw = ImageDraw.Draw(charImg) • #помещаем на фон случайную букву случайного цвета: • tmpDraw.text((3, 1), random.choice(alphArr),font = font, • fill = (random.randint(20,150), random.randint(20,140),random.randint(160,200)) ) • charImg = charImg.rotate(random.randint(-30,30)) • #создаем маску, чтобы фон буквы стал прозрачным: • mask = Image.new('L',(fontSize+10, fontSize+10),0) • mask.paste(charImg,(0,0)) • hpos = 10 + (i*interval + random.randint(10,interval-10)) • vpos = random.randint(10, 20) • image.paste(charImg,(hpos,vpos),mask) #два раза для лучшей видимости • image.paste(charImg,(hpos,vpos),mask)
Создание CAPTCHA с помощью PIL • for iin range(0,random.randint(3,5)): • draw.line( • (random.randint(6,width-6),random.randint(3,height-3), • random.randint(6,width-6),random.randint(2,height-3)), • fill = (random.randint(70,150), random.randint(20,220), • random.randint(160,220)), • width = random.randint(1,2)) • image.save(“captcha.jpg”) • create_captcha(7, 40)
Список Литературы • http://www.pythonware.com/library/pil/handbook/index.htm • http://blog.objectgraph.com/index.php/2007/01/19/pil-on-captcha-transparency-and-masking-for-captcha/