python 中PIL的用法
1. Introduction
PIL(Python Image Library)是python的第三方影象處理庫,但是由於其強大的功能與眾多的使用人數,幾乎已經被認為是python官方影象處理庫了。其官方主頁為:PIL。 PIL歷史悠久,原來是隻支援python2.x的版本的,後來出現了移植到python3的庫pillow,pillow號稱是friendly fork for PIL
,其功能和PIL差不多,但是支援python3。本文主要介紹PIL那些最常用的特性與用法,主要參考自:http://www.effbot.org/imagingbook 。
2. What PIL can do?
PIL可以做很多和影象處理相關的事情:
- 影象歸檔(Image Archives)。PIL非常適合於影象歸檔以及影象的批處理任務。你可以使用PIL建立縮圖,轉換影象格式,列印影象等等。
- 影象展示(Image Display)。PIL較新的版本支援包括Tk PhotoImage,BitmapImage還有Windows DIB等介面。PIL支援眾多的GUI框架介面,可以用於影象展示。
- 影象處理(Image Processing)。PIL包括了基礎的影象處理函式,包括對點的處理,使用眾多的卷積核(convolution kernels)做過濾(filter),還有顏色空間的轉換。PIL庫同樣支援影象的大小轉換,影象旋轉,以及任意的仿射變換。PIL還有一些直方圖的方法,允許你展示影象的一些統計特性。這個可以用來實現影象的自動對比度增強,還有全域性的統計分析等。
3. How to use PIL?
from PIL import Image Image.open("dog.jpg","r") <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=296x299 at 0x7F62BDB5B0F0> im = Image.open("dog.jpg","r") print(im.size,im.format,im.mode) (296, 299) JPEG RGB
Image.open
返回一個Image物件,該物件有size,format,mode
等屬性,其中size
表示影象的寬度和高度(畫素表示);format
表示影象的格式,常見的包括JPEG,PNG等格式;mode
表示影象的模式,定義了畫素型別還有影象深度等,常見的有RGB,HSV等。一般來說'L'(luminance)表示灰度影象,'RGB'表示真彩圖像,'CMYK'表示預先壓縮的影象。一旦你得到了開啟的Image物件之後,就可以使用其眾多的方法對影象進行處理了,比如使用im.show()
可以展示上面得到的影象。
- save(filename,format)(儲存指定格式的影象)
-
im.save("dog.png",'png')
上面的程式碼將影象重新儲存成png格式
-
thumbnail(size,resample)(建立縮圖)
-
im.thumbnail((50,50),resample=Image.BICUBIC) im.show()
上面的程式碼可以建立一個指定大小(size)的縮圖,需要注意的是,thumbnail方法是原地操作,返回值是None。第一個引數是指定的縮圖的大小,第二個是取樣的,有
Image.BICUBIC
,PIL.Image.LANCZOS
,PIL.Image.BILINEAR
,PIL.Image.NEAREST
這四種取樣方法。預設是Image.BICUBIC
。- crop(box)(裁剪矩形區域)
-
im = Image.open("dog.jpg","r") box = (100,100,200,200) region = im.crop(box) region.show() im.crop()
上面的程式碼在im影象上裁剪了一個box矩形區域,然後顯示出來。box是一個有四個數字的元組(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分別表示裁剪矩形區域的左上角x,y座標,右下角的x,y座標,規定影象的最左上角的座標為原點(0,0),寬度的方向為x軸,高度的方向為y軸,每一個畫素代表一個座標單位。crop()返回的仍然是一個Image物件。
- transpose(method)(影象翻轉或者旋轉)
-
im_rotate_180 = im.transpose(Image.ROTATE_180) im_rotate_180.show()
上面的程式碼將im逆時針旋轉180°,然後顯示出來,
method
是transpose的引數,表示選擇什麼樣的翻轉或者旋轉方式,可以選擇的值有:
- Image.FLIP_LEFT_RIGHT,表示將影象左右翻轉
- Image.FLIP_TOP_BOTTOM,表示將影象上下翻轉
- Image.ROTATE_90,表示將影象逆時針旋轉90°
- Image.ROTATE_180,表示將影象逆時針旋轉180°
- Image.ROTATE_270,表示將影象逆時針旋轉270°
- Image.TRANSPOSE,表示將影象進行轉置(相當於順時針旋轉90°)
- Image.TRANSVERSE,表示將影象進行轉置,再水平翻轉- paste(region,box,mask)(將一個影象貼上到另一個影象)
-
im.paste(region,(100,100),None) im.show()
上面的程式碼將region影象貼上到左上角為(100,100)的位置。region是要貼上的Image物件,box是要貼上的位置,可以是一個兩個元素的元組,表示貼上區域的左上角座標,也可以是一個四個元素的元組,表示左上角和右下角的座標。如果是四個元素元組的話,box的size必須要和region的size保持一致,否則將會被convert成和region一樣的size。
- split()(顏色通道分離)
-
r,g,b = im.split() r.show() g.show() b.show()
split()方法可以原來影象的各個通道分離,比如對於RGB影象,可以將其R,G,B三個顏色通道分離。
-
merge(mode,channels)(顏色通道合併)
-
im_merge = Image.merge("RGB",[b,r,g]) im_merge.show()