Python 圖像處理這樣學 小白也易懂,還能順便學習 Photoshop
Pillow 是知名 Python 圖像處理庫 PIL 的一個知名分支,支持 Python 3,有很強大的圖像處理能力,但其 API 卻並不複雜,本文不是一篇詳盡 Pillow 完整教程,只是提供一種直觀淺顯的學習方法,對比 PhotoShop 圖像操作,學習圖像基礎知識與 Pillow 圖像處理操作,讓編程初學者對圖像處理不再感到神祕!
Adobe Photoshop,也就是大家熟知的 "PS",是一個由 Adobe 開發和發行的世界上最知名圖像處理軟件。對比 PS 操作可以更好理解圖像及圖像處理知識,本文以 Photoshop CC 2018 版本為例,由於涉及的均是基礎操作,不同版本 PS 操作差異並不大。
通常所說的圖像處理,包括圖像歸檔、顯示、處理幾個方面,在學習處理之前,必須掌握一些位圖的基礎知識。
位圖
位圖(Bitmap),是使用像素 Pixel 陣列來表示的圖像,簡單來講,我們看到的圖片是由一個個矩形的像素點排列構成的,由於像素點較小,且顯示屏幕的顯示分辨率精度夠高,所以肉眼不容易感覺到像素點的存在,但如果我們將一張位圖放大顯示,我們會發現明顯呈鋸齒狀顯示。
位圖的像素都分配有特定的位置和顏色值。每個像素的顏色信息由RGB組合或者灰度值表示。根據位深度,可將位圖分為1、4、8、16、24及32位圖像等。每個像素使用的信息位數越多,可用的顏色就越多,顏色表現就越逼真,相應的數據量越大。例如,位深度為 1 的像素位圖只有兩個(2的1次方)可能的值(黑色和白色),所以又稱為二值位圖。位深度為 8 的圖像有 2的8次方(即 256)個可能的值。位深度為 8 的灰度模式圖像有 256 個可能的灰色值。
位圖的編碼方式
即 Photoshop 中的 模式(mode),有常見的 RGB、CMYK等。
RGB:用紅、綠、藍三個顏色通道組成,即三原色的光學強度來表示一種顏色。這是最常見的位圖編碼方法,可以直接用於屏幕顯示。8 位/通道的 RGB 圖像中的每個通道有 256 個可能的值,這意味著該圖像有 1600 萬個以上可能的顏色值。有時將帶有 8 位/通道 (bpc) 的 RGB 圖像稱作 24 位圖像(8 位 x 3 通道 = 24 位數據/像素)。
CMYK:用青、品紅、黃、黑四種顏料含量來表示一種顏色。常用的位圖編碼方法之一,可以直接用於彩色印刷。
常用圖像格式
- .bmp : windows 位圖,常被 windows 程序使用,比如“畫圖”程序默認保存格式;
- .tiff :大量的用於傳統影像印刷,可進行有損或無損壓縮;
- .png :無損壓縮位圖格式。起初被設計用於代替在互聯網上的GIF格式文件;
- .gif :在網絡上被廣泛使用,但有時也會因為專利權的原因而不使用該圖形格式。支持動畫圖像,支持256色,對真彩圖片進行有損壓縮;
- .jpeg / .jpg :網絡上廣泛用於存儲照片。使用有損壓縮,圖片質量可根據壓縮的設置而有所不同。
準備工作
Adobe Photoshop ,是為了配合解釋 Python Pillow 操作過程,非必須;
項目目錄,包含圖片若干;
開發工具,Visual Studio Code;
Python 環境,本例配置為 Python 3.7.3 解釋器,且安裝 Pillow 庫,命令行工具 IPython (非必須)。
顯示圖片
操作系統觀察圖像信息,以 Windows 10 為例,可以在資源管理器中查看文件名稱或縮略圖。鼠標移到圖像上可以顯示信息,如:類型、分辨率,文件大小等。
圖像文件上右鍵上下文菜單項“屬性”對話框“詳細信息”標籤可以查看更詳細信息。雙擊圖像文件,會使用 Windows 默認關聯的工具打開該圖片。
Python Pillow 打印圖像信息並顯示圖片
Pillow 安裝後,相關組件需要從 PIL 包導入,核心 Image 類定義了“圖像”對象抽象,主要操作均圍繞 Image 類型實例操作
上例代碼中可以看到
`Image.open()` 用於打開特定圖像文件並獲取實例引用;
img.format 用於獲取圖片格式;
img.size 獲取圖片尺寸屬性,長寬像素,類型為 tuple;
img.mode 圖片模式,本圖 ‘girl.jpg' 為RGB 模式。
如果想使用默認的圖像瀏覽工具打開圖像實例,則可以調用 `img.show()` 方法:
創建縮略圖
在 Web 網站程序中往往需要給一張尺寸較大的圖像製作一縮略圖,單張圖片可以在 Photoshop 中打開原圖,通過 “圖像 (Images)”菜單下的“圖像尺寸(Image Size)”調整寬(Width)、高(Height)後,再導出或另存為實現:
Pillow Image 對象可以很方便的通過代碼實現縮略圖的製作:
Image.thumbnail(size) 即可生成指定尺寸縮略圖,保存即可,配置循環文件讀取保存可以批量縮略圖生成。
Image.resize(size) 可以重新調整當前圖片尺寸,注意如果新值大於原圖片大小,可能會造成失真現象。
旋轉圖片
Photoshop “圖像”菜單項“圖像旋轉(Image Rotation)”可以設置當前圖像的水平、垂直、90度順時針或逆時針旋轉:
Python Pillow 中可以使用 Image.rotate(角度數值) 方法或 Image.transpose(常量枚舉) 實現旋轉,二者的區別在於接收參數:
Image.rotate() 逆時針旋轉指定數值的角度,注意該方法返回旋轉後的副本,如果分步驟執行 rotate() 再 show() 顯示,此時看到的原來的實例,而非返回的旋轉副本。
Image.transpose() 參數非特定的角度數值,而預置的幾個90度倍數的常量值,如:
- Image.FLIP_LEFT_RIGHT 左右翻轉
- Image.FLIP_TOP_BOTTOM 上下翻轉
- Image.ROTATE_90 逆時針90度
- Image.ROTATE_180 逆時針180度
- Image.ROTATE_270 逆時針270度
該方法同樣返回旋轉後的副本,本例中將其賦予 out 變量再顯示。
照片去色
如果要將彩色圖像去色可以將其顏色模式轉換為灰度“L”模式,該模式下只有一個8位通道,可以包含0(黑)到255(白色)之間的不同灰度亮度值。
Photoshop 下選擇“模式”下的“灰度(Grayscale)”即可:
Pillow 中只需使用 Image.convert("L") 即可實現等同效果:
截止目前,我們對比介紹了 Python Pillow 庫下的幾個常用基礎操作,Pillow 自身的功能十分強大,在圖像處理領域的讀寫、裁剪、剪切、合併、顏色處理、濾鏡特效,也均可以通過簡單的 API 實現。本文拋磚引玉,消除初學者對圖像處理的神祕感,有興趣的同學,可以深入學習。
如果您想系統學習 Python 語言基礎知識,歡迎試聽報名我們的專欄課程:
往期文章:
當 Python 遇上 Excel,理解面向對象讓你的開發事半功倍