Image類簡(jiǎn)介
Image模塊是Pillow庫的核心部分确丢。它是用來存儲(chǔ)所有類型的圖像的主類魂那,它還包含大量的函數(shù)方法六敬,用于以各種方式處理圖像诡右。
Image 類的重要功能:
創(chuàng)建圖像安岂。
保存圖像。
圖像生成器帆吻。
圖像帶
圖像屬性和統(tǒng)計(jì)域那。
像素訪問 - 如何有效地讀寫像素。
與其他庫集成 - 如何有效地交換圖像數(shù)據(jù)猜煮。
圖像操作(旋轉(zhuǎn)次员、轉(zhuǎn)置等
圖像合成(混合等)
圖像過濾(過濾功能)
Image模塊還包含添加擴(kuò)展的功能,例如王带,處理某些圖像格式的特殊編碼方案淑蔚。這是一個(gè)非常專業(yè)的領(lǐng)域,擴(kuò)展通常是用C語言編寫辫秧。
創(chuàng)建圖像
Image.new
Image.open
open也接受一個(gè)格式參數(shù)束倍。
boat_image = Image.open("boat-small.jpg", formats=['PNG', 'JPEG'])
open通常會(huì)嘗試打開任何支持格式的圖像文件,但如果你提供了一個(gè)格式列表,它將只嘗試打開這些格式的圖像绪妹。如果你想避免意外地打開一些晦澀難懂的格式甥桂,而這些格式可能有你的應(yīng)用程序不支持的功能,這就很有用邮旷。
open通過檢查文件來確定文件的類型黄选。它不關(guān)注文件的擴(kuò)展名。因此婶肩,舉例來說办陷,如果一個(gè)PNG文件被意外地以.jpg為擴(kuò)展名保存,上面的代碼將毫無錯(cuò)誤地打開PNG文件律歼。
這段代碼只允許JPEG圖像民镜。
boat_image = Image.open("boat-small.jpg", formats=['JPEG'])
如果該文件真的是JPEG文件,這段代碼將打開該文件险毁,但如果該文件是其他格式制圈,則會(huì)引發(fā)錯(cuò)誤。
你也可以提供讀取模式下打開的文件對(duì)象畔况,而不是文件名鲸鹦。
copy
copy方法創(chuàng)建圖像的新副本。
image2 = image.copy()
其他方法
你可以從數(shù)據(jù)中創(chuàng)建圖像跷跪,以內(nèi)存數(shù)組的形式(比如NumPy數(shù)組)馋嗜,你可以使用fromarray, frombuffer, 或frombytes方法從數(shù)據(jù)中創(chuàng)建圖像。
保存圖像
你可以使用save方法來保存圖像吵瞻,像這樣葛菇。
image.save('boat.png')
該函數(shù)將使用文件擴(kuò)展名來決定使用哪種文件格式,所以在上面的例子中它將創(chuàng)建一個(gè)PNG文件听皿。
你可以指定一種格式熟呛。
image.save('boat.png', format=PNG)
這將以PNG格式存儲(chǔ)圖像宽档,而不管文件擴(kuò)展名是什么尉姨。如果你想用非標(biāo)準(zhǔn)的擴(kuò)展名來存儲(chǔ)圖像(例如.dat而不是.png),這很有用吗冤。
除了文件名又厉,你也可以提供以寫模式打開的文件對(duì)象。在這種情況下椎瘟,你應(yīng)該提供格式參數(shù)覆致,因?yàn)镻illow不知道目標(biāo)文件名。
圖像生成器
Pillow自帶了一些隨機(jī)圖像生成器函數(shù)肺蔚。
除了effect_mandelbro煌妈,effect_noise生成噪聲圖像。
noise = Image.effect_noise(size=(256, 256), sigma=32)
圖像大小為256×256像素,圖像被填充高斯噪聲璧诵,根據(jù)高斯分布將每個(gè)像素設(shè)置為0到255之間的隨機(jī)值汰蜘,以128為中心。西格瑪值控制著數(shù)值的分散程度之宿。
linear_gradient創(chuàng)建從0到255(黑到白)的梯度圖像族操。圖像大小固定為256像素的正方形,所以唯一的參數(shù)是模式比被。它必須是一個(gè)灰度模式色难,所以明顯的選擇是'L'。你也可以使用'P'來創(chuàng)建一個(gè)基于調(diào)色板的灰度圖像等缀。
image = Image.linear_gradient('L')
radial_gradient可以用來創(chuàng)建徑向梯度枷莉。
image = Image.radial_gradient('L')
處理圖像帶
在RGB圖像中,每個(gè)像素都包含紅色尺迂、綠色和藍(lán)色分量依沮。在Pillow中,這些分量被稱為帶枪狂。
getbands
getbands方法返回包含圖像中每個(gè)帶的單字母名稱的元組危喉。
bands = image.getbands()
對(duì)于一個(gè)RGB圖像,該函數(shù)返回('R', 'G', 'B')州疾。對(duì)于RGBA圖像辜限,它返回('R', 'G', 'B', 'A'),以此類推严蓖。
分割
split方法將圖像分割成多個(gè)圖像薄嫡,每個(gè)圖像包含原圖像的一個(gè)頻段。
red_image, green_image, blue_image = image.split()
原始圖像被分割成3個(gè)部分颗胡。red_image是一個(gè)灰度圖像毫深,只包含圖像的紅色部分,green_image和blue_image的情況類似毒姨。
在這個(gè)圖像中哑蔫,暗區(qū)是圖像中含有很少紅色的部分,亮區(qū)是圖像中含有大量紅色的部分弧呐。
merge
merge功能的作用與分割相反闸迷。它取幾個(gè)單頻帶圖像,并將其合并形成彩色圖像俘枫。
mixed_image = Image.merge('RGB', [red_image, green_image, blue_image])
上面的代碼合并了我們之前創(chuàng)建的三個(gè)波段腥沽,所以它將產(chǎn)生與原始圖像相同的圖像。
blank = Image.new('L', image.size)
red_sep = Image.merge('RGB', [red_image, blank, blank])
red_sep.save('red_sep.png')
getchannel
如果你只想要波段鸠蚪,getchannel也可以今阳。
red_image = image.getchannel('R')
波段可以通過名稱(如'R'师溅、'G'、'B'盾舌,因?yàn)樗鼈兂霈F(xiàn)在getbands中)或索引號(hào)(0险胰、1、2...)來識(shí)別矿筝。
putalpha
putalpha方法可以用來給圖像添加alpha帶(或者替換當(dāng)前的alpha帶起便,如果已經(jīng)有)。這是一個(gè)為現(xiàn)有圖像添加透明度的好方法窖维。
在這個(gè)例子中榆综,我們將使用一個(gè)漸變色(radial gradient)作為我們的alpha通道。
以下是將這個(gè)圖像作為alpha通道應(yīng)用到船形圖像的代碼铸史。
vignette_image = Image.open('vignette.png').getchannel(0)
image.putalpha(vignette_image)
vignette圖像是一個(gè)RGB圖像鼻疮,但我們需要單波段的圖像作為putalpha。這沒有問題琳轿,我們可以簡(jiǎn)單地使用getchannel(0)來提取第一個(gè)波段判沟。
putalpha將漸變體作為alpha通道添加到圖像中。這就把圖像從RGB轉(zhuǎn)換為RGBA崭篡。這里是結(jié)果的圖像挪哄。
圖像的邊緣漸漸消失了--這是因?yàn)樗絹碓酵该鳎园醉擄@示出來了琉闪。
參考資料
- 本文涉及的python測(cè)試開發(fā)庫 謝謝點(diǎn)贊迹炼!
- 本文相關(guān)海量書籍下載