本文基于
PIL(Python Image Library)是Python進(jìn)行圖像處理最常用也是最基礎(chǔ)的庫(kù)之一。基本上已經(jīng)算是半標(biāo)準(zhǔn)庫(kù)了。但是原版PIL的開發(fā)者已經(jīng)基本上放棄更新這個(gè)庫(kù)了。致使這個(gè)庫(kù)有很多issues亟待解決,同時(shí)也無(wú)法支持日益流行的python3。所以,現(xiàn)在這個(gè)庫(kù)已經(jīng)基本被它的一個(gè)分支pillow取代。
安裝
對(duì)于Linux和Windows來(lái)說(shuō),最方便的安裝方法就是pip了。
pip install pillow
要注意的是,pillow和PIL不可以同時(shí)存在。如果要使用Pillow庫(kù)必須要先卸載原來(lái)的PIL庫(kù)。
安裝好之后,打開 Python 解釋器,輸入 from PIL import Image 來(lái)測(cè)試是否安裝成功。
Image類
Image類的讀取、顯示與保存
像openCV中的Mat一樣。研究pillow就必須先研究其圖像類Image。
from PIL import Image
im = Image.open("source.png")
im.show()
經(jīng)典三部曲。引庫(kù),讀取,顯示。經(jīng)測(cè)試,直接im-show("source.png")也可以直接顯示。還可以用im.save('somewhere.png')保存。注意可以利用改變保存文件的后綴來(lái)實(shí)現(xiàn)格式轉(zhuǎn)換。比如
Image.open('in.jpg').save('out.png')
另外也可以從零創(chuàng)造一個(gè)新的空白圖像。
im = Image.new(mode, size, color=0)
mode是RGB還是CMYK之類的選擇。size`是一個(gè)二元元組。color``是背景色顏色,默認(rèn)是黑色,也是用一個(gè)元組給出。
Image類的常用屬性
#尺寸
w, h = im.size
#格式
print(im.format)
#或者
print(type(im))
#色彩模式
print(im.mode)
Image 類的 thumbnail() 方法
Image 類的 thumbnail() 方法可以制作縮略圖。用法是在參數(shù)中輸入一個(gè)二元列表或者元組,如im.thumbnail([200, 400])或im.thumbnail((200, 400))都可以。這里要注意,這一個(gè)過(guò)程型的方法,作用的對(duì)象是im本身。這個(gè)函數(shù)沒(méi)有返回值。
small_im = im.thumbnail([200, 400])是錯(cuò)誤的。
Image類的crop(box)方法
crop()方法用于裁剪圖像的一部分。它的參數(shù)是一個(gè)box元組,即(x, y, x+w, y+h), (x,y)是裁剪框左上角的坐標(biāo), (x+w, y+h)是右下角的坐標(biāo)。如下圖所示

x = 100
y = 100
w = 200
h = 200
region = im.crop((x, y, x+w, y+h))
region.show()
region.save('region.jpg')
調(diào)用方法的對(duì)象是輸入圖像,方法的返回值即輸出圖像。
Image類的paste()方法
paste()是粘貼類。輸入?yún)?shù)有兩個(gè)。一個(gè)是待貼入的圖像,另一個(gè)也是一個(gè)box元組標(biāo)記位置。box元組同上一部分。而帶貼入的圖像是一個(gè)Image類對(duì)象。調(diào)用這個(gè)paste()的對(duì)象就是被貼圖的基底圖像。這個(gè)方法也是一個(gè)沒(méi)有返回值的過(guò)程方法。
im.paste(region, (x+50, y+50, x+50+w, y+50+h))
Image類的transpose()方法
顧名思義,transpose()方法是用來(lái)實(shí)現(xiàn)圖形變換的??梢栽贗mage對(duì)象的后面以.transpose().transpose().transpose()的形式進(jìn)行連續(xù)變換。輸入?yún)?shù)是變換方法和參數(shù),選取如下之一:
Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM,
Image.ROTATE_90,
Image.ROTATE_180,
Image.ROTATE_270
Image.TRANSPOSE.