2021年1月29日 星期五

Python 學習筆記 : 圖像處理套件 Pillow

向母校圖書館借的 "Python 程式超入門 (旗標, 鎌田正浩, 2016)" 這本書借來已久, 今天想還回去以便取新書, 所以隨便翻翻看值得學習測試的項目, 其中第 6-2 節介紹圖像處理套件 Pillow, 這是以前 Python 知名影像處理函式庫 PIL (Python Imaging Library) 的後繼者, 因為 PIL 已在 2009 年因為無法支援 Python 3 而停止開發 (PIL 只支援到 Python 2.7), 原始碼改由 Pillow 接手繼續開發, 參考 :



1. 安裝 Pillow : 

用 pip install 指令即可安裝 Pillow (macOS 需用 pip3) :

pip3 install Pillow 

D:\test\python>pip3 install Pillow    
Collecting Pillow
  Downloading Pillow-8.1.0-cp37-cp37m-win_amd64.whl (2.2 MB)
Installing collected packages: Pillow
Successfully installed Pillow-8.1.0

在樹莓派安裝 :

pi@raspberrypi:~ $ pip3 install Pillow
Collecting Pillow
  Downloading https://www.piwheels.org/simple/pillow/Pillow-7.2.0-cp35-cp35m-linux_armv7l.whl (1.2MB)
Installing collected packages: Pillow
Successfully installed Pillow-7.2.0

安裝完畢進入 Python 互動執行環境, 從 PIL 套件匯入 Image 模組 :

from PIL import Image  

D:\test\python>python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from PIL import Image   
>>> 

沒有錯誤訊息即可開始用 Image 模組處理影像. 注意, 大部分的 Python 套件都是匯入套件名稱, 由於 Pillow 是繼承自 PIL 套件, 基於能與使用舊版 PIL 的程式相容, Pillow 仍舊是從 PIL 匯入, 而不是從 Pillow 匯入. 


2. 顯示圖像 : 

顯示圖像需先呼叫 Image.open() 開啟指定圖檔, 它會傳回一個 xxxImageFile 圖檔物件 (xxx 為圖檔類型, 例如 Jpeg 或 Png 等), 然後呼叫此圖檔物件的 show() 方法即可顯示圖像. 

下面範例以 Photoshop 書上常用的 Lenna.jpg 圖檔為例進行測試, 關於 Lenna 圖參考 :


Lenna 圖可在 Wiki 百科下載 :


下載後可將其改名為 Lenna.jpg 比較方便 :

>>> from PIL import Image 
>>> img=Image.open("Lenna.jpg")     #開啟圖檔傳回圖檔物件
>>> img    
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=300x300 at 0x17EAC996A58>

可見此為一個 300x300 的 JPEG 格式圖檔. 呼叫圖檔物件的 show() 方法會開啟作業系統預設看圖軟體來顯示此圖片, 在我的 Win10 筆電為 "相片" 軟體 :  

>>> img.show()       # 顯示圖檔





3. RGB 分色與重組 : 

呼叫圖檔物件的 split() 方法可將圖像中的 RGB 三原色分離出來, 此方法會傳回 R, G, B 三原色的 Image 圖檔物件, 所以要用三個變數儲存傳回值 : 

>>> r, g, b=img.split()      # 拆成 R, G, B 三原色物件
>>> print(r)   
<PIL.Image.Image image mode=L size=300x300 at 0x17EAE6E7BA8>  # 傳回 Image 物件
>>> print(g)  
<PIL.Image.Image image mode=L size=300x300 at 0x17EAE6E7BE0>
>>> print(b)   
<PIL.Image.Image image mode=L size=300x300 at 0x17EAE6E7C18>

這三原色的 Image 圖檔物件也是可以呼叫 show() 方法來顯示 : 

>>> r.show()    # 顯示紅色成分




>>> g.show()    # 顯示綠色成分




>>> b.show()     # 顯示藍色成分




呼叫 Image 模組的 merge() 函數並於第二參數位置以 (r, g, b) tuple 形式傳入三原色的 Image 物件可以組合成新的圖像, 如果 RGB 順序一樣會重組成原來的圖片, 若調換順序即可更換顏色, 例如下面範例是將 r (紅色) 與 b (藍色) 位置對調, 組合出的圖片變成藍色系 : 

>>> img_rb_change=Image.merge('RGB', (b, g, r))    # 紅色與藍色互換
>>> img_rb_change.show()       




此處將原本 (r, g, b) 的順序改成 (b, g, r), 重組後的圖片變成藍色系. 


4. 轉成黑白圖片 : 

呼叫圖片物件的 convert() 方法並傳入字串 '1' (用 1 個 bit 可表示 pixel 是黑或白) 可將彩色圖片轉換成黑白圖片 :

>>> img_black_white=img.convert('1')     
>>> img_black_white.show()    




將圖片放大可清晰看出顆粒狀的黑或白圖點 (pixel). 原本彩色圖片中的每一個圖點係以 R, G, B 三原色 (以值 0~255 表示該色彩的強度) 套疊成色, Pillow 的 convert('1') 採用下列公式將其轉換成黑白亮度 : 

L=0.299*R + 0.587*G + 0.114*B


5. 圖像旋轉 :

呼叫圖片物件的 transpose() 方法可以將圖片以特定的角度旋轉, 旋轉的角度由傳入參數決定, 共有五種角度 :


 角度參數 說明
 Image.ROTATE_90 將圖片向左旋轉 90 度
 Image.ROTATE_180 將圖片向左旋轉 180 度
 Image.ROTATE_270 將圖片向左旋轉 270 度
 Image.ROTATE_FLIP_LEFT_RIGHT 將圖片左右翻轉
 Image.ROTATE_FLIP_TOP_BOTTOM 將圖片上下翻轉


各項參數的測試結果如下 :

>>> img_trans_90=img.transpose(Image.ROTATE_90)     # 將向左旋轉 90 度
>>> img_trans_90.show()     





>>> img_trans_180=img.transpose(Image.ROTATE_180)     # 將向左旋轉 180 度
>>> img_trans_180.show()     




>>> img_trans_270=img.transpose(Image.ROTATE_270)     # 將向左旋轉 270 度
>>> img_trans_270.show()     




>>> img_flip_left_right=img.transpose(Image.FLIP_LEFT_RIGHT)     # 將圖片左右翻轉
>>> img_flip_left_right.show()     




>>> img_flip_top_bottom=img.transpose(Image.FLIP_TOP_BOTTOM)     # 將圖片上下翻轉
>>> img_flip_top_bottom.show()  





6. 圖像物件存檔 : 

呼叫圖像物件的 save() 方法可將物件儲存為圖片檔案, 例如 : 

>>> img.save("Lenna_new.jpg")    

檢查工作目錄會看到產生了一個新圖檔 Lenna_new.jpg.

以上為書中所舉範例的測試, 更多用法參考官網說明文件 :

 

沒有留言 :