圖像處理
本章工作任務
u 任務1:瞭解Pillow庫的基本操作
u 任務2:掌握圖像格式轉換
u 任務3:掌握改變圖像尺寸
u 任務4:掌握剪裁圖像
u 任務5:掌握濾鏡處理
本章技能目標及重難點
編號 | 技能點描述 | 級別 |
1 | 瞭解Pillow庫的基本操作 | ★ |
2 | 掌握圖像格式轉換 | ★★ |
3 | u掌握改變圖像尺寸 | ★★★ |
4 | 掌握剪裁圖像 | ★★★ |
5 | 掌握濾鏡處理 | ★★★ |
注: "★"理解級別 "★★"掌握級別 "★★★"應用級別
本章學習目標
本章開始學習Python圖像處理,需要同學們理解如何使用Pillow來操作圖像,實現格式轉換,改變大小尺寸,裁剪,濾鏡處理。
本章學習建議
本章適合有Python基礎的學員學習。
本章內容(學習活動)
1.1為什麼使用Pillow?
Python的圖像處理通常用Pillow(Python Imaging Library(Fork))來進行。Pillow有PIL(Python Imaging Library)的分支工程開發而來。由於PIL已經停止開發及維護,所以如今Pillow成為了主流。他支持JPEG,PNG,GIF,BMP等多種圖像格式。
1.1.1安裝Pillow
Pillow與多種處理圖像數據的程序庫存在依賴關係,因此安裝時需要多級注意。目前Pillow在PyPI上提供了面向Window和OS X的wheel安裝包。在Window和OS X上安裝(包括用pip命令安裝)時不需要進行編譯。如果使用的是其他平臺,那麼由於需要從sdist進行c拓展的編譯,所以必須準備編譯器和各類圖像處理庫。
使用命令pip,進行安裝。
1.1.2Ubuntu安裝Pillow
如果使用源碼構建,我們需要準備進行Pillow編譯時所需的庫。
首先,因為需要編譯C擴展,所以需要一些基本的開發工具。我們先來確認一下C擴展的安裝。
pkg-config python2.7 --libs --cflags
安裝Pillow需要的程序包
sudo apt-get install libjpeg-dev libopenjpeg-dev zliblgpdev libtiff5-dev
現在所需的工具和庫已經齊全了,可以使用pip進行安裝了。
pip install pillow
1.2如何進行圖像格式轉換
圖像文件的格式轉換通過在Image類的save方法的傳值參數中指定格式並保存來完成。下面,我們打開當前目錄下名為python.gif的圖像文件。
將其轉換為JPEG格式,並保存在python_convert,jpg文件中。
可以看到,程序在讀取完文件之後將圖像模式轉為了RGB。
在GIF以及不足256色的PNG、BMP等格式中,顏色信息都保存在調色板數據塊裡。這類文件用Pillow打開是分為P模式(調色板模式)和I模式(單色模式)。另外,JPEG文件有時還會是CMYK模式。當模式不支持save方式指定的格式時,程序會報錯,所以要先用convert方法進行模式轉換。
1.3如何改變圖像尺寸
如果想改變圖像尺寸,可以使用Image類的thumbnail方法或resize方法。下面,我們打開當前目錄下的python.jpg圖像文件。
將其長款縮小一半後保存為python_thumbnail.jpg。
Image類的對象能夠通過size屬性以元祖的形式獲取圖像的長和寬。
thumbanil方法的第一個傳值參數制定了圖像長和寬的元祖,第二個傳值參數制定了濾鏡Image.ANTIALIAS。濾鏡有NEAREST,BILINER、BICUBIC(雙三次方)、ANTIALIAS(抗鋸齒)這四種可供選擇,其中使用ANTIALIAS
(抗鋸齒)修改尺寸後的圖像品質最高(損失最小)。
在執行thumbnail方法之後,會直接修改對象自身的圖像大小。但是,這個方法只能用於長寬比例不變的修改。變更長寬比例時需要使用resize方法。下面,我們打開當前目錄下名為python.jpg的圖像文件,將其長度放大為2倍後保存為python_resize.jpg。
與thumbnail方法不同,resize方法的返回值是修改尺寸之後的Image類的對象。它同thumbnail一樣,可以制定濾鏡。
與thumbnail方法不同,resize方法的返回值是修改尺寸之後的Image類的對象。它同thumbnail一樣,可以制定濾鏡。
1.4如何進行裁剪
Image類的crop方法能夠以長方形裁剪圖像。下面,我們打開當前目錄下名為python.jpg的圖像文件,按照圖形的寬度從正中間裁剪一個長方形並保存為python_crop.jpg
crop方法的傳值參數是包含了4個值的元祖(Tuple),這4個值代表長方形裁剪區域的左上角座標和右下角座標。crop的返回值為存有剪裁後圖像的Image類對象。
1.5對圖像進行濾鏡處理
1.5.1全反色
進行濾鏡處理必須獲取像素值。像素值可以用Image類的getdata方法和getpixel方法來獲取。獲取的像素值為包含了R(紅)、G(綠)、B(藍)3個值的範圍均為0,255。下面,我們打開當前目錄下的名為python.jpg的圖像文件,將所有像素反色並保存為python_filter.jpg。
getdata()方法能夠返回一個迭代器,用於逐一訪問圖像的每一組像素值。在上面例子中,我們注意去除了每個像素的像素值並進行反色(255減去色值)。等所有像素值處理完畢之後,用putdata方法替換了Image類的對象的像素。
1.5.2單像素反色
如果要獲取指定座標的像素值,可以使用Image類的getpixel方法。下面,我們打開當前目錄下的名為python.jpg的圖像文件,講右上角的香色反色並保存為python_pixel.jpg。
1.5.3總結
getpixel方法的傳值參數為含有橫縱座標(起點為0)兩個值的元祖。改寫指定位置像素值時使用putpixel方法。這些方法的方便之處在於能夠制定座標,但是速度太慢,因此一旦需要大量處理,他們的效率並不見得比getdata,putdata等方法更高。類似如下代碼,沒有getdata效率高。
視頻學習更快捷瞭解Pillow的模塊的應用。