Pillow教程(一)

傳統的PIL庫不支持python3,所以使用從PIL派生出來的Pillow庫。

Image類

Pillow中最重要的類就是Image,該類存在於同名的模塊中。可以通過以下幾種方式實例化:從文件中讀取圖片,處理其他圖片得到,或者直接創建一個圖片。

使用Image模塊中的open函數打開一張圖片:

from PIL import Image

im = Image.open('1.gif')
print(im)
print(im.format,im.size,im.mode)

如果打開成功,返回一個Image對象,可以通過對象屬性檢查文件內容

<PIL.GifImagePlugin.GifImageFile image mode=P size=170x288 at 0x567748>
GIF (170, 288) P
  • format屬性定義了圖像的格式,如果圖像不是從文件打開的,那麼該屬性值爲None;
  • size屬性是一個tuple,表示圖像的寬和高(單位爲像素);
  • mode屬性爲表示圖像的模式.
    模式屬性如下:
11位像素,黑和白,存成8位的像素
L 8位像素,黑白
P8位像素,使用調色板映射到任何其他模式
RGB3×8位像素,真彩
RGBA4×8位像素,真彩+透明通道
CMYK4×8位像素,顏色隔離
YCbCr3×8位像素,彩色視頻格式
I32位整型像素
F32位浮點型像素

當有一個Image對象時,可以用Image類的各個方法進行處理和操作圖像,例如顯示圖片。

im.show()

PS:標準版本的show()方法不是很有效率,因爲它先將圖像保存爲一個臨時文件,然後使用查看器進行顯示。

讀寫圖片

Pillow庫支持相當多的圖片格式。直接使用Image模塊中的open()函數讀取圖片,而不必先處理圖片的格式,Pillow庫自動根據文件決定格式。

Image模塊中的save()函數可以保存圖片,除非你指定文件格式,那麼文件名中的擴展名用來指定文件格式。

im = Image.open('1.gif')
im.save('f.BMP')

通常,save用以保存一個臨時的image對象到硬盤。而轉換工作由一個功能更爲強大的convert()方法來完成。

拷貝,粘貼,合併圖片

from PIL import Image

im = Image.open('tu.jpg')
#設置要拷貝的區域  
box = (100, 100, 500, 500)

# 將im表示的圖片對象拷貝到region中,大小爲(400*400)像素。
# 這個region可以用來後續的操作(region其實就是一個Image對象),
# box變量是一個四元組(左,上,右,下)。  
region  = im.crop(box)

# 從字面上就可以看出,先把region中的Image反轉180度,然後再放回到region中。  
region = region.transpose(Image.ROTATE_90)
#粘貼box大小的region到原先的圖片對象中。  
im.paste(region, box)
im.save('1.jpg')

這裏寫圖片描述

區域由4-tuple決定,該tuple中信息爲(left, upper, right, lower),Pillow左邊系統的原點(0,0)爲圖片的左上角。座標中的數字單位爲像素點。
上面示例粘貼後的圖片是臨時性,需要save保存成新圖片。

box = im.copy() #直接複製圖像

分離和合並通道

每一個RGB都是由三個通道的灰度圖疊加的,所以pil提供了將這三個通道分離的方法.
對於單通道圖片,split()返回圖像本身。爲了處理單通道圖片,必須先將圖片轉成RGB。

r,g,b = im.split()#分割成三個通道  
im = Image.merge("RGB", (b, g, r))  #將b,r兩個通道進行翻轉。 
im.save('rgb.jpg')

這裏寫圖片描述

幾何轉變

Image類有resize()、rotate()和transpose()、transform()方法進行幾何變換,用以重定義圖片大小,對圖片進行旋轉等操作。
簡單幾何變換:

out = im.resize( ( 128,128))
out = im.rotate(45)

這裏寫圖片描述
置換圖像:

# 左右翻轉
out = im.transpose(Image.FLIP_LEFT_RIGHT)
# 上下反向
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)

transpose()和象的rotate()沒有性能差別。
這裏寫圖片描述

模式轉換

# 黑白
am = im.convert('L')
am.show()

圖像增強

1.濾鏡
ImageFilter模塊提供了很多預定義的圖片加強濾鏡。
比如一個常用的濾鏡,細節(detail濾鏡)

from PIL import ImageFilter  

im = Image.open('tu.jpg')
out = im.filter(ImageFilter.DETAIL)  

2.直接操作像素點
可以對每個像素點進行操作,而且,每一個通道都可以獨立的進行操作。比如,將每個像素點的亮度(不知道有沒有更專業的詞)增大20%

#注意這裏用到一個匿名函數(那個可以把i的1.2倍返回的函數)  
out = im.point(lambda i : i *  1.2)

3.讀寫圖片的更多方式
通常,我們使用open方法進行圖片的打開操作。但是這不是唯一的方式。完全可以跟python的IO整合起來。

fp = open("tu.jpg", "rb")  
im = Image.open(fp)  

附件:原圖
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章