向母校圖書館借的 "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() 方法來顯示 :
呼叫 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.
以上為書中所舉範例的測試, 更多用法參考官網說明文件 :
沒有留言:
張貼留言