Programming Computer Vision with Python (學習筆記一)

介紹

《Programming Computer Vision with Python》是一本介紹計算機視覺底層基本理論和算法的入門書,經過這本收能夠學到有關對象識別、基於內容的圖像搜索、光學字符識別、光流法、跟蹤、三維重建、立體成像、加強現實、姿態估計、全景建立、圖像分割、降噪、圖像分組等技術的實現原理。
英文版PDF下載:https://it-ebooks.info/book/836/
中文版介紹:http://book.douban.com/subject/25906843/html

Python圖像處理

先介紹基本的圖像處理,包括圖像的讀取、轉換、縮放、導數計算、畫圖和保存,這些知識將爲後面內容的學習打下基礎。
做者選擇Python編寫例子,並使用一個叫PIL(Python Imaging Library)的第三方圖像處理庫。這裏特別指出的是:PIL庫開發不活躍,而且好久沒更新了,因此有人基於它fork了另外一個分支叫PillowPillow保持與PIL類似的使用接口,解決了許多Bug,並同時兼容Python2和Python3,目前開發狀態活躍。接下來的學習筆記本人都將使用Pillow來代替PIL。python

安裝Pillow

以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一瞥

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()

效果以下:

圖片描述

小結

下一個筆記將介紹另外幾個圖像處理相關的庫。

相關文章
相關標籤/搜索