傳統的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屬性爲表示圖像的模式.
模式屬性如下:
1 | 1位像素,黑和白,存成8位的像素 |
L | 8位像素,黑白 |
P | 8位像素,使用調色板映射到任何其他模式 |
RGB | 3×8位像素,真彩 |
RGBA | 4×8位像素,真彩+透明通道 |
CMYK | 4×8位像素,顏色隔離 |
YCbCr | 3×8位像素,彩色視頻格式 |
I | 32位整型像素 |
F | 32位浮點型像素 |
當有一個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)
附件:原圖