Python影象處理之PIL庫

2022-06-23 14:00:45
本篇文章給大家帶來了關於的相關知識,其中主要整理了PIL庫的相關問題,PIL庫是一個具有強大影象處理能力的第三方庫,不僅包含了豐富的畫素、色彩操作功能,還可以用於影象歸檔和批次處理,下面一起來看一下,希望對大家有幫助。

推薦學習:

PIL庫的使用

要點:PIL庫是一個具有強大影象處理能力的第三方庫,不僅包含了豐富的畫素、色彩操作功能,還可以用於影象歸檔和批次處理。

1.PIL庫概述

PIL(Python Image Library)庫是Python語言的第三方庫,需要通過pip工具安裝。安裝PIL庫的方法如下,需要注意,安裝庫的名字是pillow。

:\>pip install pillow #或者 pip3 install pillow

PIL庫支援影象儲存、顯示和處理,它能夠處理幾乎所有圖片格式,可以完成對影象的縮放、剪裁、疊加以及向影象新增線條、影象和文字等操作。
PIL庫主要可以實現影象歸檔和影象處理兩方面動能需求
(1)影象歸檔:對影象進行批次處理、生成影象預覽、影象格式轉換等。
(2)影象處理:影象基本處理、畫素處理、顏色處理等。
根據功能不同,PIL庫共包括21個與圖片相關的類,這些類可以被看作是子庫
或PIL庫中的模組,子庫列表如下。
Image、 ImageChops、 ImageColor、 ImageCrackCode、 ImageDraw.ImageEnhance、 ImageFile、 ImageFilelO、 ImageFilter、 ImageFont、ImageGL、 ImageGrab、 Imagemath、 ImageOps、 ImagePalette、 ImagePath.ImageQt、 ImageSequence、 ImageStat ImageTk, ImageWin
重點介紹PIL庫最常用的子庫:Image、ImageFilter、ImageEnhance。

2.PIL庫Image類解析

Image是PIL最重要的類,它代表一張圖片,引入這個類的方法如下:

>>>from PIL import Image

在PIL中,任何一個影象檔案都可以用Image物件表示。Image類的影象讀取和建立方法如下(共5個):

方法描述
Image.open(filename)根據引數載入影象檔案
Image.new(mode, size, color)根據給定引數建立一個新的影象
Image.open(StringlO.StringlO(buffer))從字串中獲取影象
Image.frombytes(mode, size, data)根據畫素點data 建立影象
Image.verify()對影象檔案完整性進行檢查、返回異常

通過Image開啟影象檔案時,影象的柵格資料不會被直接解碼或者載入,程式只是讀取了影象檔案頭部的後設資料資訊,這部分資訊標識了影象的格式、顏色、大小等。因此,開啟一個檔案會十分迅速,與影象的儲存和壓縮方式無關。
要載入一個影象檔案,最簡單的形式如下,之後所有操作對im起作用。

>>>from PIL import Image>>>im = Image.open ("a.jpg")

在使用IDLE互動方式處理圖片檔案時,建議採用檔案的全路徑;如果使用Python檔案形式,建議採用相對路徑,將檔案和程式放到一個目錄中。
Image類有4個處理圖片的常用屬性,如表所示(共4個)

屬性描述
Image.format標識影象格式或來源,如果影象不是從檔案讀取,值為None
Image.mode影象的色彩模式,"L"為灰度影象、"RGB」為真彩色影象、"CMYK」為出版影象
Image.size影象蜜度和高度,單位是畫素(px),返回值是二元元組(tuple)
Image.palette調色盤屬性,返回一個ImagePalette型別

檢視已經讀取的影象檔案的屬性如下:

>>>print (im. format, im.size, im.mode)JPEG (900, 598) RGB

Image還能讀取序列類影象檔案,包括GIF、FLI、FLC、TIFF等格式檔案。open()方法開啟一個影象時自動載入序列中的第一幀,使用seek()和tell()方法可以在不同幀之間移動。
Image類的序列影象操作方法(共2個):

方法描述
Image.seek(frame)跳轉並返回影象中的指定幀
Image.tell()返回當前幀的序號

【範例1】GIF檔案影象提取
對一個GIF格式動態檔案,提取其中各幀影象,並儲存為檔案。

from PIL import Image#讀入一個GIF檔案im = Image.open("pybit.gif")try:
	im.save('picframe{:02d).png'.format(im.tell()))
	while True:
		im.seek(im.tel1 ()+1)
		im.save('picframe{:02d).png'.format(im.tell()))except:print("處理結束")

範例1展示了一種採用try-except編寫程式的方法,通過seek()方法和save()方法配合提取GIF影象格式的每一幀,並儲存為檔案。
Image類的影象轉換和儲存方法 (共3個) 如表所示。

方法描述
Image.save(filename, format)將影象儲存為filename檔名,format是圖片格式
Image.convert(mode)使用不同的引數,轉換影象為新的模式
Image.thumbnail(size)建立影象的縮圖,size是縮圖尺寸的二元元組

其中,save()方法有兩個引數:檔名filename和影象格式format。如果呼叫時不指定儲存格式,如微範例1,PIL將自動根據檔名filename字尾儲存影象;如果指定格式,則按照格式儲存。搭配採用open()和save()方法可以實現影象的格式轉換,例如,將 jpg格式轉換為png格式」程式碼如下。需要注意,Image 類的 save()方法主要用於儲存檔案到硬碟,PIL庫還提供了功能更強大的格式轉換方法。

im = Image.open("a.jpg")im.save("a.png")

Image類可以縮放和旋轉影象,其中,rotate(方法以逆時旋轉的角度值作為引數來旋轉影象。
Image類的影象旋轉和縮放方法(共2個):

方法描述
Image.resize(size)按size大小調整影象,生成副本
Image.rotate(angle)按angle角度旋轉影象,生成副本

Image類能夠對每個畫素點或者一幅RGB影象的每個通道單獨進行操作。split()方法能夠將RGB 影象各顏色通道提取出來;
merge()方法能夠將各獨立通道再合成一幅新的影象。
lmage類的影象畫素和通道處理方法(共4個):

方法描述
Image.point(func)根據函數func的功能對每個元素進行運算,返回影象副本
Image.split()提取RGB影象的每個顏色通道,返回影象副本
Image.merge(mode,bands)合併通道,其中mode表示色彩,bands表示新的色彩通道
Image.blend(im1,im2,alpha)將兩幅圖片iml和im2按照如下公式插值後生成新的影象:im1 (1.0-alpha) + im2 alpha

【範例2】影象的顏色交換
交換影象中的顏色。可以通過分離RGB圖片的3個顏色通道實現顏色交換。

from PIL import Imageim = Image.open('a.jpg')r, g, b = im.split()om = Image.merge("RGB" , (b, g, r))om.save('aBGR.jpg')

執行結果:
在這裡插入圖片描述
原圖:
在這裡插入圖片描述

操作影象的每個畫素點需要通過函數實現,可以採用(lambda)函數和point()方法,例子如下,顯示效果如圖7所示。

>>>im=Image.apen('a.jpg')#開啟檔案>>>>r,g,b=im.splitO#獲得RGB通道資料>>>>newg=g.point(lambda i:i*0.9)#將G通道顏色值變為原來的0.9>>>>newb=b.point(lambda i:i<100)#選擇B通道值(低於100的畫素>>>>om=Image.merge(im.mode,(r,newg,newb)#將3個通道合成為新圖>>>>om.save('new_a.jpg')#輸出圖片

3.影象的過濾和增強

PIL庫的ImageFilter類和ImageEnhance類提供了過濾影象和增強影象的方法。
ImageFilter類共提供10種預定義影象過濾方法(共10個):

方法表示描述
ImageFilter.BLUR影象的模糊效果
ImageFilter.CONTOUR影象的輪廓效果
ImageFilter.DETAIL影象的細節效果
ImageFilter.EDGE_ENHANCE影象的邊界加強效果
ImageFilter.EDGE_ENHANCE_MORE影象的閾值邊界加強效果
ImageFilter.EMBOSS影象的浮雕效果
ImageFilter.SMOOTHL影象的平滑效果
ImageFilter.FIND_EDGES影象的邊界效果
ImageFilter.SMOOTH_MORE影象的閾值平滑效果
ImageFilter.SHARPEN影象的銳化效果

利用Image類的filter()方法可以使用ImageFilter類,使用方式如下:

Image.filter(ImageFilter.fuction)

【範例3】影象的輪廓獲取。
獲取影象的輪廓,程式碼如下,程式執行效果如圖所示,圖片變得更加抽象、更具想象空間!

from PIL import Imagefrom PIL import ImageFilterim = Image.open('a.jpg')om = im.filter(ImageFilter.CONTOUR)om.save('aContour.jpg')

執行結果:
在這裡插入圖片描述
原圖:
在這裡插入圖片描述
ImageEnhance類提供了更高階的影象增強功能,如調整色彩度、亮度、對比度、銳化等。
ImageEnhance類的影象增強和濾鏡方法(共5個):

方法描述
ImageEnhance.enhance(factor)對選擇屬性的數值增強factor倍
ImageEnhance.Color(im)調整影象的顏色平衡
ImageEnhance.Contrast(im)調整影象的對比度
ImageEnhance.Brightness(im)調整影象的亮度
ImageEnhance.Sharpness(im)調整影象的銳度

【範例4】影象的對比度增強。
增強影象的對比度為初始的20倍。程式碼如下,程式執行效果如圖7所示。

from PIL import Imagefrom PIL import ImageEnhanceim = Image.open('a.jpg')om = ImageEnhance.Contrast(im)om.enhance(20).save(aEnContrast.jpg')

執行結果:
在這裡插入圖片描述
原圖:在這裡插入圖片描述

推薦學習:

以上就是Python影象處理之PIL庫的詳細內容,更多請關注TW511.COM其它相關文章!