A Python programozási nyelv

PIL

A Python Imaging Library egy képfeldolgozási célokra írt könyvtár. Kizárólag raszteres képek kezelésére alkalmas, ezek közül a ma használatos formátumok szinte mindegyikét támogatja – az ilyen képek az egyes képpontok jellemzőit tárolják, mint például szín vagy intenzitás, szemben a geometrikus képekkel, melyek a képen található képelemek leírásának, egyenletének valamilyen felsorolását tartalmazzák –. Hatékony belső reprezántációval rendelkezik, és képfeldolgozási eljárások széleskörű választékát nyújtja. Legalábbis a referencia szerint.

A jelenlegi – 2.4.2 – python szabvány szabványos könyvtárának nem része, viszont a PIL magában foglalja a szabványos könyvtár Tkinter moduljának bizonyos részeit – például a Tk PhotoImage és BitmapImage interfészeket.

A képek méretének megadására és lekérdezésére egységesen egy kételemű tuple-t használ, melynek elemei a kép vízszintes és függőleges mérete pixelekben. A méret paramétert a továbbiakban „size” jelöli. Ahol a kép egy részét az azt befoglaló téglalappal jelölhetjük ki, ott 4-es tuple-t kell használnunk.

A PIL a szokványos derékszögű koordinátarendszert használja, az origóval a bal felső sarokban. Itt érdemes még megjegyezni, hogy a koordináták a pixelek sarkaira vonatkoznak, így a (0,0)-val címzett pixel középpontja ténylegesen (0.5,0.5). A mérethez hasonlóan a koordináták is általában kételemű tuple-ek formájában adódnak át.

Néhány művelethez módot is megadhatunk, ezt minden esetben egy „mode” nevű paraméter fogja jelezni a továbbiakban. Ez definiálja a kép pixeleinek típusát és színmélységét. A jelenlegi verzió a következőeket támogatja:

A PIL többrétegű képeket is támogat, az egyes rétegek méretének és mélységének meg kell egyezniük.

Az image modul

Az Image Modul voltaképpen mindennek az alapja, a szokásos konstansokon és néhány segédfüggvényen kívül az Image osztályt tartalmazza, mely a PIL képek reprezentálására szolgál. Az egyes műveletek eredménye legtöbbször egy képobjektum, megkönnyítve ezzel több művelet egymás után való alkalmazását. Az ettől való eltérést külön jelezni fogjuk.

Pl:

# nyissunk meg egy képet, forgassuk el, jelenítsük meg, # írjunk ki róla pár dolgot import Image im = Image.open("MyPic.jpg") im.rotate(45).show() print im.format, im.size, im.mode

Egy könyvtárban található összes JPEG-ről thumbnail készítése is csak néhány sor:

import glob for infile in glob.glob("*.jpg"): file, ext = os.path.splitext(infile) im = Image.open(infile) im.thumbnail((128, 128), Image.ANTIALIAS) im.save(file + ".thumbnail", "JPEG")

Az Image osztály attribútumai:

A leggyakrabban használt metódusok képek létrehozására, megnyitására szolgálnak, valamint már az Image osztály maga is rendelkezik néhány képfeldolgozó művelettel:

Létrehozás, megnyitás

Néhány művelet a tárolt képen

Ezeken kívül még számos eljárással rendelkezik, mint például pixelek lekérdezése, beállítása, képek téglalap alakú részképeinek lekérdezése és beállítása, pozícionálás, különböző sávműveletek, valamint más, a képeken szokványos transzformációs műveletek.

ImageChops

Ez a modul aritmetikus képműveleteket tartalmaz – elnevezésük channel operations („chops”) –. Ezek a kép, vagy képek egyes pixelein végeznek el egy megadott aritmetikai műveletet. Az implementáció minden esetben gondoskodik arról, hogy az eredmények ne lépjenek ki a színtartományból, azaz 0..MAX-ból, ahol MAX a jelenleg támogatott formátumokra 255 – ez abból adódik, hogy a legfrissebb verzióban a modul műveletei csak 8-bites képekre vannak implementálva. A műveletek egy Image objektumot adnak vissza, amely megkönnyíti azok egymás után való alkalmazását. Az itteni függvények egy része az Image osztályban is megtalálható.

Néhány példa az itteni lehetőségeinkre:

ImageColors

Színtáblákat és konverziós műveleteket tartalmaz CSS3 stílusú színleírókról RGB tuple-ekre. Többek között ezt a modult használja az Image osztály new művelete és az ImageDraw modul.

Az alábbi stringformátumokat támogatja:

A konverziót a getrgb(color) függvény végzi, amely a paraméterként kapott, fent felsorolt típusú stringből egy RGB tuple-t állít elő. Hasonlóképp működik a getcolor(color, mode) függvény, amely azonban „L” vagy „P” mód esetén RGB helyett egy szürkeárnyalat értéket ad vissza. Mindkét művelet hibás string esetén ValueError kivételt dob.

ImageDraw

Ez a modul tartalmazza a szokványos rajzoló eljárásokat, mint például vonal-, körcikk-, sokszögrajzolás, szöveg írása, kitöltés stb. Ezeket a műveleteket új képek létrehozására, és már meglévő képeken is használhatjuk. Mindkét esetben egy Draw objektumot kell létrehoznunk, a megfelelő Image objektummal inicializálva. A különböző rajzoló műveleteket a Draw típusú objektumon alkalmazva ezután a változások a hivatkozott képen történnek, helyben végrehajtva. A Draw objektum rendelkezik a szokásos beállításokkal, úgy mint aktuális kitöltőszín, festőszín, betűtípus.

Mostmár minden adott ahhoz, hogy írjunk egy gyors Hello World-öt.

import Image, ImageDraw im = Image.new("RGB", (150,150)) draw = ImageDraw.Draw(im) draw.text((40,60), "Hello World") del draw im.show()

ImageEnhace

Itt javíthatunk még egy keveset képünk minőségén. A modul erre a célra négy osztályt tartalmaz, melyek objektumai egy-egy képre hivatkoznak. Mindegyik egy metódust tartalmaz, amely bemenetként egy lebegőpontos faktort kap, melynek értékére nincs megkötés, kimenetként az így előállított képet adja. Ha a faktor 1.0, a visszaadott érték mindig az eredeti képpel megegyező képet leíró objektum.

ImageFile

Képfájlok megnyitásához és mentéséhez nyújt támogatást. Tartalmazza többek között a Parser osztályt, mely főként képek részenkénti dekódolására használható – például ha a képet hálózaton keresztül kapjuk –. Két metódusa van, a feed és a close. Előbbi az elemenkénti feldolgozást végzi, esetlegesen IOError kivételt dobva. Utóbbi befejezi a dekódolást, és amennyiben a dekódolás sikeres volt, visszaadja az előállított képet – ellenkező esetben ez is IOError kivételt dob.

Pl:

import ImageFile fp = open("lena.pgm", "rb") p = ImageFile.Parser() while 1: s = fp.read(1024) if not s: break p.feed(s) im = p.close() im.save("copy.jpg")

ImageFileIO

Az előzővel azonos célokat szolgál, ez a régebbi verzió, így fájlműveletekre inkább az előző modul Parser osztálya ajánlott.

ImageFilter

Itt találhatók a predefinit szűrők. A szokásos szűrők nagy része implementálva van, néhányat azonban esetleg hiányolhatunk – ilyen például a Gauss-szűrő –, mint ahogy a meglévők paraméterezésére – a méretet leszámítva – sincs túl sok lehetőségünk. Némi vigaszt nyújthatna, hogy a Kernel osztály használatával elméletileg tetszőleges téglalap alakú szűrőmátrixot megadhatunk, viszont a könyvtár jelenlegi verziója még csak a 3x3-as és 5x5-ös mátrixokat támogatja.

A szűrőket egy adott képre az Image osztály filter metódusával tudjuk alkalmazni, amely az így eredményül kapott képpel tér vissza. A különböző gyorsítási lehetőségekről – pl. általunk megadott szűrők esetén a szeparábilisség kezelése, szűrők konvolúciója stb. – a referencia nem tesz említést, így valószínűleg ezeket sem támogatja.

A modul által jelenleg nyújtott szűrők:

BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN;

RankFilter(size, rank), MinFilter(size=3), MedianFilter(size=3), MaxFilter(size=3).

Valamint a már említett Kernel(size, kernel, scale=None, offset=0) konstruktor segítségével hozhatunk létre jelenleg még csak 3x3-as, vagy 5x5-ös szűrőket, melyeket egyelőre csak „L” és „RGB” képeken alkalmazhatunk. A size paraméter értéke így (3,3) vagy (5,5), a kernel a mátrix lebegőpontos súlyainak sorfolytonos felsorolása, a scale azt az értéket adja meg, amivel az egyes pixelek értékei leosztásra kerülnek – alapértelmezésben az eredmény minden pixelje a kernel súlyainak összegével kerül lenormálásra –, míg az offset paraméter segítségével tolhatjuk el a számított pixel értékeket, tehát ez adódik az eredmény kép minden pixeléhez.

ImageFont

A modul nevével megegyező osztályt tartalmazza. Ez végzi a különböző betűtípusváltásokat, objektumait az ImageDraw osztály használja. A betűtípusok leírására saját fájlformátumot használ, cserébe viszont a PIL ad egy utilityt – pilfont –, amely a szokványos fontleírókat átkonvertálja.

Pl:

import ImageFont, ImageDraw font = ImageFont.load("arial.pil") draw = ImageDraw.Draw(image) draw.text((10, 10), "hello", font=font)

A betöltő metódusokon kívül tartalmaz még két hasznos műveletet is:

ImageGrab

Az azonos nevű osztályt tartalmazza. Ennek grab metódusa egy sima print screen eredményét, tehát a képernyő tartalmát, vagy a vágólapot adja vissza Image objektummá konvertálva. Adhatunk neki egy doboz argumentumot is, ekkor csak a képernyő dobozon belüli részét kapjuk. Egyelőre csak Windows alá van implementálva.

ImageOps

Ez a modul félig-meddig még kísérleti jellegű, a műveletek nagy része csak „L” és „RGB” képekre működik. További hasznos képfeldolgozó eljárásokat tartalmaz. Ilyenek például az invertálás, invertálás egy megadott küszöbre, autocontrast – a hisztogram alapján a paraméterként kapott százaléknyi legsötétebb és legvilágosabb intenzitást levágja, majd a maradék hisztogramot a teljes színtartományra normalizálja –, egy szürkeárnyalatos kép kiszínezése, kép határának eltávolítása és kitöltése, hisztogram-kiegyenlítés, tükrözés stb.

ImagePath

Számunkra nem túl érdekes, Path objektumokat gyárt, melyeket az ImageDraw osztály metódusai használnak.

ImagePalette

Az azonos nevű osztályt tartalmazza, melyet az Image osztály használ.

Pl:

import ImagePalette im.putpalette(ImagePalette.ImagePalette("RGB"))

A konstruktorban azt a módot kell megadni, amelyre a palettával le szeretnénk képezni.

ImageSequence

Egy wrapper osztályt tartalmaz, amely lehetőséget ad egy képsorozat elemein való iterálásra. Az Iterator osztály konstruktora ennek megfelelően a paraméterként kapott képre mutató iterátort ad vissza, metódusként pedig a [] operátort tartalmazza, amely a 0-tól kezdődő indexelést teszi lehetővé.

ImageStat

Ezzel a modullal különféle statisztikákat számolhatunk a képünkről, vagy annak egy részéről. Ehhez először létre kell hoznunk egy Stat objektumot az adott Image objektumra. Ez kaphat még egy maszk vagy egy lista – így tárolja a PIL a hisztogramokat, ld. fentebb – paramétert, amellyel a kép vizsgálni kívánt darabját jelölhetjük ki. Többrétegű képek esetén az eredmény a rétegekre számított értékek sorozata lesz. Fontos megjegyezni, hogy minden statisztika a stat objektum attribútuma lesz, és csak használatkor értékelődik ki.

ImageTk

A Tkinter modullal való kompatibilitás érdekében különböző konstruktorokat tartalmaz BitmapImage és PhotoImage objektumok létrehozására.

ImageWin

A Windows-kompatibilitást hivatott szolgálni. Ehhez Dib objektumokat – Windows bitmap – enged létrehozni, kirajzolni, valamint meglévő PIL képeinket konvertálhatjuk át.

PSDraw

Postscript nyomtatáshoz ad néhány egyszerű támogatást.

ImageCrackCode

Csak a PIL Plus tartalmazza. Ez a modul főbb képjellemzők detektálására ad lehetőséget. Hogy csak a legjelentősebbeket említsük: élek, sarkok, centroid stb.

Ahogy már megszoktuk, itt is először egy CrackCode objektumot kell létrehoznunk az adott PIL képre, paraméterként megadhatjuk még, hogy a kép mely pozíciójától kezdje a vizsgálatot. Alapértelmezésben ez a bal felső sarok.

Támogatott fájlformátumok

BMP

".bmp", ".dib"

CUR

".cur"

DCX

".dcx"

EPS

".eps", ".ps"

FLI

".fli", ".flc"

FPX

".fpx"

GBR

".gbr"

GD

".gd"

GIF

".gif"

ICO

".ico"

IM

".im"

JPEG

".jpg", ".jpe", ".jpeg"

MIC

".mic"

MSP

".msp"

PCD

".pcd"

PCX

".pcx"

PDF

".pdf"

PNG

".png"

PPM

".pbm", ".pgm", ".ppm"

PSD

".psd"

SGI

".bw", ".rgb", ".cmyk"

SUN

".ras"

TGA

".tga"

TIFF

".tif", ".tiff"

XBM

".xbm"

XPM

".xpm"