以下提到的這些 Python 工具在編輯影象、操作影象底層資料方面都提供了簡單直接的方法。
當今的世界充滿了資料,而影象資料就是其中很重要的一部分。但只有經過處理和分析,提高影象的品質,從中提取出有效地資訊,才能利用到這些影象資料。
常見的影象處理操作包括顯示影象,基本的影象操作,如裁剪、翻轉、旋轉;影象的分割、分類、特徵提取;影象恢復;以及影象識別等等。Python 作為一種日益風靡的科學程式語言,是這些影象處理操作的最佳選擇。同時,在 Python 生態當中也有很多可以免費使用的優秀的影象處理工具。
下文將介紹 10 個可以用於影象處理任務的 Python 庫,它們在編輯影象、檢視影象底層資料方面都提供了簡單直接的方法。
scikit-image 是一個結合 NumPy 陣列使用的開源 Python 工具,它實現了可用於研究、教育、工業應用的演算法和應用程式。即使是對於剛剛接觸 Python 生態圈的新手來說,它也是一個在使用上足夠簡單的庫。同時它的程式碼品質也很高,因為它是由一個活躍的志願者社群開發的,並且通過了同行評審。
scikit-image 的文件非常完善,其中包含了豐富的用例。
可以通過匯入 skimage
使用,大部分的功能都可以在它的子模組中找到。
影象濾波:
import matplotlib.pyplot as plt%matplotlib inlinefrom skimage import data,filtersimage = data.coins() # ... or any other NumPy array!edges = filters.sobel(image)plt.imshow(edges, cmap='gray')
使用 match_template() 方法實現模板匹配:
在展示頁面可以看到更多相關的例子。
NumPy 提供了對陣列的支援,是 Python 程式設計的一個核心庫。影象的本質其實也是一個包含畫素資料點的標準 NumPy 陣列,因此可以通過一些基本的 NumPy 操作(例如切片、掩膜、花式索引等),就可以從畫素級別對影象進行編輯。通過 NumPy 陣列儲存的影象也可以被 skimage 載入並使用 matplotlib 顯示。
在 NumPy 的官方文件中提供了完整的程式碼文件和資源列表。
使用 NumPy 對影象進行掩膜操作:
import numpy as npfrom skimage import dataimport matplotlib.pyplot as plt%matplotlib inlineimage = data.camera()type(image)numpy.ndarray #Image is a NumPy array:mask = image < 87image[mask]=255plt.imshow(image, cmap='gray')
像 NumPy 一樣,SciPy 是 Python 的一個核心科學計算模組,也可以用於影象的基本操作和處理。尤其是 SciPy v1.1.0 中的 scipy.ndimage 子模組,它提供了在 n 維 NumPy 陣列上的執行的函數。SciPy 目前還提供了線性和非線性濾波、二值形態學、B 樣條插值、物件測量等方面的函數。
在官方文件中可以查閱到 scipy.ndimage
的完整函數列表。
使用 SciPy 的高斯濾波對影象進行模糊處理:
from scipy import misc,ndimageface = misc.face()blurred_face = ndimage.gaussian_filter(face, sigma=3)very_blurred = ndimage.gaussian_filter(face, sigma=5)#Resultsplt.imshow(<image to be displayed>)
PIL (Python Imaging Library) 是一個免費 Python 程式設計庫,它提供了對多種格式影象檔案的開啟、編輯、儲存的支援。但在 2009 年之後 PIL 就停止發布新版本了。幸運的是,還有一個 PIL 的積極開發的分支 Pillow,它的安裝過程比 PIL 更加簡單,支援大部分主流的作業系統,並且還支援 Python 3。Pillow 包含了影象的基礎處理功能,包括畫素點操作、使用內建折積核心進行濾波、顏色空間轉換等等。
Pillow 的官方文件提供了 Pillow 的安裝說明自己程式碼庫中每一個模組的範例。
使用 Pillow 中的 ImageFilter 模組實現影象增強:
from PIL import Image,ImageFilter#Read imageim = Image.open('image.jpg')#Display imageim.show()from PIL import ImageEnhanceenh = ImageEnhance.Contrast(im)enh.enhance(1.8).show("30% more contrast")
OpenCV(Open Source Computer Vision 庫)是計算機視覺領域最廣泛使用的庫之一,OpenCV-Python 則是 OpenCV 的 Python API。OpenCV-Python 的執行速度很快,這歸功於它使用 C/C++ 編寫的後臺程式碼,同時由於它使用了 Python 進行封裝,因此呼叫和部署的難度也不大。這些優點讓 OpenCV-Python 成為了計算密集型計算機視覺應用程式的一個不錯的選擇。
入門之前最好先閱讀 OpenCV2-Python-Guide 這份文件。
使用 OpenCV-Python 中的金字塔融合將蘋果和橘子融合到一起:
SimpleCV 是一個開源的計算機視覺框架。它支援包括 OpenCV 在內的一些高效能運算機視覺庫,同時不需要去了解位深度、檔案格式、色彩空間之類的概念,因此 SimpleCV 的學習曲線要比 OpenCV 平緩得多,正如它的口號所說,“將計算機視覺變得更簡單”。SimpleCV 的優點還有:
官方文件簡單易懂,同時也附有大量的學習用例。
Mahotas 是另一個 Python 影象處理和計算機視覺庫。在影象處理方面,它支援濾波和形態學相關的操作;在計算機視覺方面,它也支援特徵計算、興趣點檢測、區域性描述符等功能。Mahotas 的介面使用了 Python 進行編寫,因此適合快速開發,而演算法使用 C++ 實現,並針對速度進行了優化。Mahotas 盡可能做到程式碼量少和依賴項少,因此它的運算速度非常快。可以參考官方文件了解更多詳細資訊。
文件包含了安裝介紹、範例以及一些 Mahotas 的入門教學。
Mahotas 力求使用少量的程式碼來實現功能。例如這個 Finding Wally 遊戲:
ITK(Insight Segmentation and Registration Toolkit)是一個為開發者提供普適性影象分析功能的開源、跨平台工具套件,SimpleITK 則是基於 ITK 構建出來的一個簡化層,旨在促進 ITK 在快速原型設計、教育、解釋語言中的應用。SimpleITK 作為一個影象分析工具包,它也帶有大量的元件,可以支援常規的濾波、影象分割、影象配準功能。儘管 SimpleITK 使用 C++ 編寫,但它也支援包括 Python 在內的大部分程式語言。
有很多 Jupyter Notebooks 用例可以展示 SimpleITK 在教育和科研領域中的應用,通過這些用例可以看到如何使用 Python 和 R 利用 SimpleITK 來實現互動式影象分析。
使用 Python + SimpleITK 實現的 CT/MR 影象配准過程:
pgmagick 是使用 Python 封裝的 GraphicsMagick 庫。GraphicsMagick 通常被認為是影象處理界的瑞士軍刀,因為它強大而又高效的工具包支援對多達 88 種主流格式影象檔案的讀寫操作,包括 DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM、TIFF 等等。
pgmagick 的 GitHub 倉庫中有相關的安裝說明、依賴列表,以及詳細的使用指引。
影象縮放:
邊緣提取:
Cairo 是一個用於繪製向量圖的二維圖形庫,而 Pycairo 是用於 Cairo 的一組 Python 係結。向量圖的優點在於做大小縮放的過程中不會丟失影象的清晰度。使用 Pycairo 可以在 Python 中呼叫 Cairo 的相關命令。
Pycairo 的 GitHub 倉庫提供了關於安裝和使用的詳細說明,以及一份簡要介紹 Pycairo 的入門指南。
使用 Pycairo 繪製線段、基本圖形、逕向漸變:
以上就是 Python 中的一些有用的影象處理庫,無論你有沒有聽說過、有沒有使用過,都值得試用一下並了解它們。