PIL庫是一個具有強大圖像處理能力的第三方庫,不僅包含了豐富的像素、色彩操作功能,還可以用於圖像歸檔和批量處理。
PIL庫的安裝
:\>pip install pillow #或者 pip3 install pilow
根據功能不同,PIL庫共包括了21個模塊:
Image, ImageChops, ImageColor, ImageCrackCode, ImageDraw.
ImageEnhance, ImageFile, ImageFilelO, ImageFilter, ImageFont.
ImageGL、 ImageGrab, Imagemath, ImageOps, ImagePalette, ImagePath.
ImageOt, ImageSequence, ImageStat, ImageTk, ImageWin
在下面重點介紹PIL庫幾個最常用的子庫:
Image庫
Image是PIL最重要的類,它代表一張圖片,引入這個類的方法如下:
from PIL import Image
Image 類的圖像讀取和創建方法如下表:
方法 |
描述 |
Image.open(filename) |
根據參數加載圖像文件 |
Image.new(mode,size,color) |
根據給定參數創建一個新的圖像 |
Image.open(StringIO.StringIO(buffer)) |
從字符串中獲得圖像 |
Image.frombytes(mode.size,data) | 根據像素點data創建圖像 |
Image.verify() |
對圖像文件完整性進行檢查,返回異常 |
要加載一個圖像文件,最簡單的方式如下:
from PIL import Image im=Image.open("C:\\Users\\Administrator\\Desktop\\cyhz.jpg")
Image 類有四個處理圖片的常用屬性,如下表:
屬性 |
描述 |
Image.format |
標識圖像格式或來源,如果圖像不是從文件中讀取,值為None |
Image.mode |
圖像的色彩模式,”L“為灰度圖像、”RGB“為真彩色圖像、”CMYK“為出版圖像 |
Image.size |
圖像的寬度和高度,單位是像素,返回值是二元元組 |
Image.palette |
調色板屬性,返回一個ImagePalette類型 |
查看上面所打開圖像文件的屬性如下:
print(im.format,im.size,im.mode)
Image 還能讀取序列類圖像文件,包括GIF、FLI、FLC、TIFF等格式文件。
Image 類的序列圖像操作方法如下表:、
方法 |
描述 |
Image.seek(frame) |
跳轉並返回圖像中的指定幀 |
Image.tell() |
放回當前幀的序號 |
Image類的圖像轉換和保存方法如下表:
方法 | 描述 |
Image.save(filename,format) | 將圖像保存為filename文件名,format是圖片格式 |
Image.convert(mode) | 使用不同的參數,轉換圖像為新的模式 |
Image.thumbnail(size) | 創建圖像的縮略圖,size是縮略圖尺寸的二元元組 |
Image類的圖像旋轉和縮放方法如下表:
方法 |
描述 |
Image.resize(size) |
按size大小調整圖像,生成副本 |
Image.rotate(angle) |
按angle角度旋轉圖像,生成副本 |
Image類的圖像像素和通道處理方法如下表:
方法 |
描述 |
Image.point(func) |
根據函數func的功能對每個元素進行運算,返回圖像副本 |
Image.split() |
提取RGB圖像的每個顏色通道,返回圖像副本 |
Image.merge(mode,bands) |
合並通道,其中mode表示色彩,bands表示新的色彩通道 |
Image.blend(im1,im2,alpha) | 將兩幅圖片im1和im2按照如下公式插值后生成新的圖像: im1 *(1.0-alpha) + im2 *alpha |
ImageFilter 庫和ImageEnhance 庫
PIL庫的ImageFilter類和ImageEnhance類提供了過濾圖像和增強圖像的方法。
ImageFilter類的預定義圖像過濾方法如下表:
方法表示 |
描述 |
ImageFilter.BLUR |
圖像的模糊效果 |
ImageFilter.CONTOUR |
圖像的輪廓效果 |
ImageFilter.DETAIL |
圖像的細節效果 |
ImageFilter.EDGE_ENHANCE |
圖像的邊界加強效果 |
ImageFilter.EDGE_ENHANCE_MORE |
圖像的閾值邊界加強效果 |
ImageFilter.EMBOSS |
圖像的浮雕效果 |
ImageFilter.FIND_EDGES |
圖像的邊界效果 |
ImageFilter.SMOOTH |
圖像的平滑效果 |
ImageFilter.SMOOTH_MORE |
圖像的閾值平滑效果 |
ImageFilter.SHARPEN |
圖像的銳化效果 |
ImageEnhance類提供了更高級的圖像增強功能,如下表所示:
方法 | 描述 |
ImageEnhance.enhance(factor) |
對選擇屬性的數值增強factor倍 |
ImageEnhance.Color(im) |
調整圖像的顏色平衡 |
ImageEnhance.Contrast(im) |
調整圖像的對比度 |
ImageEnhance.Brightness(im) |
調整圖像的亮度 |
ImageEnhance.Sharpness(im) |
調整圖像的銳度 |
以上就是PIL庫比較重要的幾個子庫的介紹,接下來將用其應用到實際例子上。
1、對圖片進行縮略,生成縮略圖,代碼如下:
from PIL import Image im=Image.open("C:\\Users\\Administrator\\Desktop\\cyhz.jpg") im.thumbnail((128,128)) im.save("cyhzslt","JPEG")
2、改變圖像的顏色,代碼如下:
from PIL import Image im=Image.open("C:\\Users\\Administrator\\Desktop\\lyslt.jpg") r,g,b=im.split() om= Image.merge("RGB",(b,g,r)) om.save("C:\\Users\\Administrator\\Desktop\\ly1.jpg")
與原圖對比(左邊為原圖,右邊為改變顏色后的圖):
3、對圖片進行輪廓處理,代碼如下:
from PIL import Image from PIL import ImageFilter im=Image.open("C:\\Users\\Administrator\\Desktop\\cyhzslt.jpg") om=im.filter(ImageFilter.CONTOUR) om.save("C:\\Users\\Administrator\\Desktop\\ly3.jpg")
對比如下(左圖為原圖,右圖為輪廓圖):
4、對圖片進行浮雕操作處理,代碼如下:
from PIL import Image from PIL import ImageFilter im=Image.open("C:\\Users\\Administrator\\Desktop\\lyslt.jpg") om=im.filter(ImageFilter.EMBOSS) om.save("C:\\Users\\Administrator\\Desktop\\ly5.jpg")
對比如下(左圖為原圖,右圖為輪廓圖):
5、對一個GIF格式動態文件,提取其中各幀圖像,並保存為文件,代碼如下:
from PIL import Image im = Image.open('C:\\Users\\Administrator\\Desktop\\timg.gif') # 讀入一個GIF文件 try: im.save('aa{:02d}.png'.format(im.tell())) while True: im.seek(im.tell()+1) im.save('aa{:02d}.png'.format(im.tell())) except: print("處理結束")
動圖如圖:
提取各幀圖像的結果為:
6、增強圖像的銳度,代碼為:
from PIL import Image from PIL import ImageEnhance im = Image.open('C:\\Users\\Administrator\\Desktop\\lyslt.jpg') om=ImageEnhance.Sharpness(im) om.enhance(20).save('C:\\Users\\Administrator\\Desktop\\sad.jpg')
效果為(左圖為原圖,右圖為增強20倍銳度):
7、生成一個好玩的GIF圖,代碼如下:
import PIL.Image as Image def get_gif(pics_dir,n,t=0.1): imgs = [] for i in range(n): pic_name = '{}\\{}.jpg'.format(pics_dir,i+1) temp = Image.open(pic_name) imgs.append(temp) save_name = '{}.gif'.format(pics_dir) imgs[0].save(save_name, save_all=True, append_images=imgs, duration=t) return save_name if __name__ == '__main__': pics_dir = 'C:\\Users\\Administrator\\Desktop\\我' save_name = get_gif(pics_dir,6,900) print('制作完成。所屬文件:{}'.format(save_name))
生成GIF用了18張圖片如圖:
生成的GIF的效果如下圖:
以上就是一些關於PIL庫的應用。