本文地址:http://www.reibang.com/p/3740dec1f436
1. 簡介
Python傳統(tǒng)的圖像處理庫PIL
(Python Imaging Library ),可以說基本上是Python處理圖像的標(biāo)準(zhǔn)庫鉴腻,功能強(qiáng)大迷扇,使用簡單。
但是由于PIL
不支持Python3爽哎,而且更新緩慢蜓席。所以有志愿者在PIL
的基礎(chǔ)上創(chuàng)建了一個(gè)分支版本,命名為Pillow
课锌,Pillow
目前最新支持到python3.6厨内,更新活躍,并且增添了許多新的特性渺贤。所以我們安裝Pillow即可雏胃。
2. 安裝
Pillow
的安裝比較的簡單,直接pip安裝即可:
pip install Pillow
但是要注意的一點(diǎn)是志鞍,Pillow
和PIL
不能共存在同一個(gè)環(huán)境中瞭亮,所以如果安裝的有PIL
的話,那么安裝Pillow
之前應(yīng)該刪除PIL
固棚。
由于是繼承自PIL
的分支统翩,所以Pillow
的導(dǎo)入是這樣的:
import PIL
# 或者
from PIL import Image
3. Image
Image
是Pillow中最為重要的類,實(shí)現(xiàn)了Pillow中大部分的功能此洲,這個(gè)類的主要用來表示圖片對(duì)象厂汗。要?jiǎng)?chuàng)建這個(gè)類的實(shí)例主要有三個(gè)方式:
- 從文件加載圖像
- 處理其他圖像獲得
- 創(chuàng)建一個(gè)新的圖像
3.1. 讀取圖像
一般來說,我們都是都過從文件加載圖像來實(shí)例化這個(gè)類呜师,如下所示:
from PIL import Image
picture = Image.open('happy.png')
如果沒有指定圖片格式的話娶桦,那么Pillow
會(huì)自動(dòng)識(shí)別文件內(nèi)容為文件格式。
3.2. 新建圖像
Pillow
新建空白圖像使用new()
方法汁汗, 第一個(gè)參數(shù)是mode即顏色空間模式趟紊,第二個(gè)參數(shù)指定了圖像的分辨率(寬x高),第三個(gè)參數(shù)是顏色碰酝。
- 可以直接填入常用顏色的名稱。如'red'戴差。
- 也可以填入十六進(jìn)制表示的顏色送爸,如
#FF0000
表示紅色。 - 還能傳入元組,比如(255, 0, 0, 255)或者(255袭厂, 0墨吓, 0)表示紅色。
picture = Image.new('RGB', (200, 100), 'red')
3.3. 保存圖像
保存圖片的話需要使用save()
方法:
picture.save('happy.png')
保存的時(shí)候纹磺,如果沒有指定圖片格式的話帖烘,那么Pillow
會(huì)根據(jù)輸入的后綴名決定保存的文件格式。
3.4. 圖像的坐標(biāo)表示
在Pillow中橄杨,用的是圖像的左上角為坐標(biāo)的原點(diǎn)(0秘症,0),所以這意味著式矫,x軸的數(shù)值是從左到右增長的乡摹,y軸的數(shù)值是從上到下增長的。
我們處理圖像時(shí)采转,常常需要去表示一個(gè)矩形的圖像區(qū)域聪廉。Pillow
中很多方法都需要傳入一個(gè)表示矩形區(qū)域的元祖參數(shù)。
這個(gè)元組參數(shù)包含四個(gè)值故慈,分別代表矩形四條邊的距離X軸或者Y軸的距離板熊。順序是(左,頂察绷,右干签,底)
。其實(shí)就相當(dāng)于克婶,矩形的左上頂點(diǎn)坐標(biāo)為(左筒严,頂)
,矩形的右下頂點(diǎn)坐標(biāo)為(右情萤,底)
鸭蛙,兩個(gè)頂點(diǎn)就可以確定一個(gè)矩形的位置。
右和底坐標(biāo)稍微特殊筋岛,跟python列表索引規(guī)則一樣娶视,是左閉又開的≌鲈祝可以理解為[左, 右)
和[頂肪获, 底)
這樣左閉右開的區(qū)間。比如(3, 2, 8, 9)就表示了橫坐標(biāo)范圍[3, 7]柒傻;縱坐標(biāo)范圍[2, 8]的矩形區(qū)域孝赫。
3.5. 常用屬性
-
PIL.Image.filename
圖像源文件的文件名或者路徑,只有使用
open()
方法創(chuàng)建的對(duì)象有這個(gè)屬性红符。類型:字符串
-
PIL.Image.format
圖像源文件的文件格式青柄。
-
PIL.Image.mode
圖像的模式伐债,一般來說是“1”, “L”, “RGB”, 或者“CMYK” 。
-
PIL.Image.size
圖像的大小
-
PIL.Image.width
圖像的寬度
-
PIL.Image.height
圖像的高度
-
PIL.Image.info
圖像的一些信息致开,為字典格式
3.6. 常用方法
3.6.1. 裁剪圖片
Image
使用crop()
方法來裁剪圖像峰锁,此方法需要傳入一個(gè)矩形元祖參數(shù),返回一個(gè)新的Image
對(duì)象双戳,對(duì)原圖沒有影響虹蒋。
croped_im = im.crop((100, 100, 200, 200))
3.6.2. 復(fù)制與粘貼圖像
復(fù)制圖像使用copy()
方法:
copyed_im = im.copy()
粘貼圖像使用paste()
方法:
croped_im = im.crop((100, 100, 200, 200))
im.paste(croped_im, (0, 0))
im對(duì)象調(diào)用了paste()
方法,第一個(gè)參數(shù)是被裁剪下來用來粘貼的圖像飒货,第二個(gè)參數(shù)是一個(gè)位置參數(shù)元祖魄衅,這個(gè)位置參數(shù)是粘貼的圖像的左頂點(diǎn)。
3.6.3 調(diào)整圖像的大小
調(diào)整圖像大小使用resize()
方法:
resized_im = im.resize((width, height))
resize()
方法會(huì)返回一個(gè)重設(shè)了大小的Image
對(duì)象膏斤。
3.6.4. 旋轉(zhuǎn)圖像和翻轉(zhuǎn)圖像
旋轉(zhuǎn)圖像使用rotate()
方法徐绑,此方法按逆時(shí)針旋轉(zhuǎn),并返回一個(gè)新的Image
對(duì)象:
# 逆時(shí)針旋轉(zhuǎn)90度
im.rotate(90)
im.rotate(180)
im.rotate(20, expand=True)
旋轉(zhuǎn)的時(shí)候莫辨,會(huì)將圖片超出邊界的邊角裁剪掉傲茄。如果加入expand=True
參數(shù),就可以將圖片邊角保存住沮榜。
翻轉(zhuǎn)圖像使用transpose()
:
# 水平翻轉(zhuǎn)
im.transpose(Image.FLIP_LEFT_RIGHT)
# 垂直翻轉(zhuǎn)
im.transpose(Image.FLIP_TOP_BOTTOM)
3.6.5. 獲取單個(gè)像素的值
使用getpixel
(xy)方法可以獲取單個(gè)像素位置的值:
im.getpixel((100, 100))
傳入的xy需要是一個(gè)元祖形式的坐標(biāo)盘榨。
如果圖片是多通道的,那么返回的是一個(gè)元祖蟆融。
3.6.6. 通過通道分割圖片
split()
split()
可以將多通道圖片按通道分割為單通道圖片:
R, G, B = im.split()
split()
方法返回的是一個(gè)元祖草巡,元祖中的元素則是分割后的單個(gè)通道的值。
getchannel(channel)
getchannel()
可以獲取單個(gè)通道的數(shù)據(jù):
R = im.getchannel("R")
3.6.7. 加載圖片全部數(shù)據(jù)
我們可以使用load()
方法加載圖片所有的數(shù)據(jù)型酥,并比較方便的修改像素的值:
pixdata = im.load()
pixdata[100,200] = 255
此方法返回的是一個(gè)PIL.PyAccess
山憨,可以通過這個(gè)類的索引來對(duì)指定坐標(biāo)的像素點(diǎn)進(jìn)行修改。
3.6.8. 關(guān)閉圖片并釋放內(nèi)存
此方法會(huì)刪除圖片對(duì)象并釋放內(nèi)存
im.close()