《Programming Computer Vision with Python》是一本介紹計算機視覺底層基本理論和算法的入門書,經過這本收能夠學到有關對象識別、基於內容的圖像搜索、光學字符識別、光流法、跟蹤、三維重建、立體成像、加強現實、姿態估計、全景建立、圖像分割、降噪、圖像分組等技術的實現原理。
英文版PDF下載:https://it-ebooks.info/book/836/
中文版介紹:http://book.douban.com/subject/25906843/html
先介紹基本的圖像處理,包括圖像的讀取、轉換、縮放、導數計算、畫圖和保存,這些知識將爲後面內容的學習打下基礎。
做者選擇Python編寫例子,並使用一個叫PIL(Python Imaging Library)
的第三方圖像處理庫。這裏特別指出的是:PIL庫開發不活躍,而且好久沒更新了,因此有人基於它fork了另外一個分支叫Pillow,Pillow
保持與PIL類似的使用接口,解決了許多Bug,並同時兼容Python2和Python3,目前開發狀態活躍。接下來的學習筆記本人都將使用Pillow來代替PIL。python
以Ubuntu系統爲例:算法
#安裝python開發工具及包管理工具 sudo apt-get install python-dev python-pip #安裝一些須要支持的圖像格式開發包 sudo apt-get install libjpeg-dev libpng-dev libtiff-dev #安裝Pillow圖像處理庫 sudo pip install pillow
Pillow主要包含了對各類圖像模式、圖像格式、顏色、過濾器的數據結構(對象)表示,實現了對圖像模式轉換、格式轉換、過濾器應用、常規圖像處理操做、圖像數據算術運算、2D畫圖等功能,以模塊、類對外提供。
首先,先了解一下Pillow庫使用的一些基本概念:shell
Bands(圖像通道)
圖像的通道即圖像像素的組成部分,跟Channel應該是同一個概念。好比RGB圖像有3個通道分別爲紅、綠、藍。二值圖像和灰度圖像只有1個通道。PNG圖像有4個通道分別爲R、G、B和alpha。庫中提供的不少圖像操做都是分別做用於某個通道的數據。express
Modes(圖像模式)
圖像模式定義了像素的類型和位深,Pillow支持如下模式:windows
1 (1-bit pixels, black and white, stored with one pixel per byte)網絡
L (8-bit pixels, black and white)數據結構
P (8-bit pixels, mapped to any other mode using a color palette)app
RGB (3x8-bit pixels, true color)ide
RGBA (4x8-bit pixels, true color with transparency mask)
CMYK (4x8-bit pixels, color separation)
YCbCr (3x8-bit pixels, color video format)
LAB (3x8-bit pixels, the Lab color space)
HSV (3x8-bit pixels, Hue, Saturation, Value color space)
I (32-bit signed integer pixels)
F (32-bit floating point pixels)
模塊概覽
Pillow的功能劃分爲許多模塊,咱們簡單過一下這些模塊的功能,以便在看到做者的示例代碼時,能夠快速知道這些代碼功能在Pillow哪些模塊中提供。由於做者使用的PIL庫已通過時,咱們得用新的Pillow庫來重寫和改進代碼。
Image模塊
提供了一個叫Image
的類來表示圖像,如下提到的PIL圖像
指的就是此類的對象。Image對象可使用Image.new、Image.fromarray、Image.frombytes、Image.frombuffer等方法來構造,也能夠open一張圖片來構造。Image類提供了一些對圖像進行簡單處理的方法(如:convert、copy、crop、filter、resize、rotate、save、show、transform等)和圖像的基本屬性/信息。如下代碼示例打開一張圖片,旋轉45度後顯示出來:
from PIL import Image im = Image.open("bride.jpg") im.rotate(45).show()
ImageChops模塊
提供了一些對圖像顏色通道的算術運算,Chops爲Channel Operations
的縮寫,這些運算一般是對兩幅圖像進行的,並返回一幅處理後的圖像,大部分操做目前只支持8-bit通道。
ImageColor模塊
包含一個顏色表和一個從CSS3表示的顏色到RGB顏色的轉換器,主要用於方便構造Image對象,即PIL.Image.new(mode, size, color=0)的color參數支持如下形式:
16進制的顏色表示,如#rgb, #rrggbb
rgb函數,如rgb(255,0,0), rgb(100%, 0%, 100%)
HSL(色相、飽和、亮度)函數,如hsl(0,100%,100%),色相取值爲0到360,飽和度和亮度取值爲0%到100%
常規的HTML顏色名字,如red, Red
ImageCms模塊
提供對LittleCMS2色彩管理引擎的支持。Little CMS
是最流行的開源色彩管理庫之一。
ImageDraw模塊
提供簡單的2D畫圖功能,好比畫點、畫線、畫矩形、多邊形、文本、弧形、橢圓等,支持字體設置。
ImageEnhance模塊
提供一些類用於圖像加強操做,好比邊緣銳化、色彩平衡、對比度和亮度調節等。
ImageFile模塊
提供圖像文件的打開和保存,另外,還提供了一個Parser類,用於支持對圖片邊讀邊解碼(好比圖片邊從網絡上下載邊解碼的情景)。
ImageFilter模塊
預約義了一些過濾器,能夠在Image.filter(filter)中做爲參數使用:
BLUR(模糊效果)
CONTOUR(輪廓)
DETAIL(細節)
EDGE_ENHANCE(邊緣增強)
EDGE_ENHANCE_MORE(邊緣增強)
EMBOSS(浮雕效果)
FIND_EDGES(查找邊緣)
SMOOTH(使光滑)
SMOOTH_MORE(使光滑)
SHARPEN(銳化)
ImageFont模塊
定義了類ImageFont表示位圖字體(點陣字體),字體對象能夠做爲參數傳給ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None)以指定的字體畫文本。
PIL使用自有格式存儲位圖字體,從1.1.4開始,支持TrueType和OpenType字體。
ImageGrab模塊
從屏幕截圖或從剪貼板獲取圖像,獲得Image對象。目前只支持OSX(在3.0增長)和Windows。
ImageMath模塊
只提供了一個函數ImageMath.eval用於對圖像表達式(image expressions)
進行求值,這些表達式能夠是對圖像數據每一個bit的位運算(&、|、^、~),也能夠是內置的一些運算,好比對圖像的每一個像素求絕對值、轉換圖像模式、轉float或int等。
ImageMorph模塊
提供圖像形態操做。
ImageOp模塊
提供一些可直接使用的圖像處理操做,如自動調節對比度、自動裁邊等。
ImagePalette模塊
提供調色板類,其中的方法都被標記爲experimental,文檔不詳。
ImagePath模塊
用於存儲和操做2維向量數據。Path對象可傳入ImageDraw模塊的相關方法。
ImageQt模塊
支持從PIL圖像對象建立PyQt4或PyQt5的QImage對象,方便被Qt使用和顯示。
ImageSequence模塊
支持枚舉出一個image sequence
(圖像系統,如fli動畫文件)的全部幀。
ImageStat模塊
對圖像或指定區域的每一個通道進行統計,包括count、sum、min/max等。
ImageTk模塊
支持從PIL圖像對象建立Tkinter(Python的GUI庫)的BitmapImage和PhotoImage對象。
ImageWin模塊
支持在Windows平臺上建立和顯示圖像,可與PythonWin和其它UI庫一塊兒使用,爲這些工具庫提供Windows設備上下文或windows句柄的訪問。
最後給出一個簡單的示例,把書的彩色封面圖像轉爲灰度圖像並顯示出來:
from PIL import Image pil_im = Image.open('cover.png').convert('L') pil_im.show()
效果以下:
下一個筆記將介紹另外幾個圖像處理相關的庫。