目前PIL的官方最新版本爲1.1.7,支持的版本爲python 2.5, 2.6, 2.7,並不支持python3,但有高手把它從新編譯生成python3下可安裝的exe了。這一非官方下載地址 http://www.lfd.uci.edu/~gohlke/pythonlibs/#pil python
或者直接點下面:算法
PIL-1.1.7.win32-py3.2.exe [994 KB] [Python 3.2] [32 bit] [Jul 03, 2012]app
PIL-1.1.7.win32-py3.3.exe [988 KB] [Python 3.3b1] [32 bit] [Jul 03, 2012]ide
最近在作一件比較 evil 的事情——驗證碼識別,以此來學習一些新的技能。由於我是初學,對圖像處理方面就不太瞭解了,欲要利吾事,必先利吾器,既然只是作一下實驗,那用 Python 來做原型開發再好不過了。在 Python 中,比較經常使用的圖像處理庫是 PIL(Python Image Library),當前版本是 1.1.7 ,用起來很是方便。你們能夠在 http://www.pythonware.com/products/pil/index.htm 下載和學習。函數
在這裏,我主要是介紹一下作圖像識別時可能會用到的一些 PIL 提供的功能,好比圖像加強、還有濾波之類的。最後給出使用 Python 作圖像處理與識別的優點與劣勢。性能
基本圖像處理學習
使用 PIL 以前須要 import Image 模塊spa
注意:在python3中,請使用from PIL import Image,不要使用import Image.net
import Image #python2orm
from PIL import Image #python3
而後你就可使用Image.open(‘xx.bmp’) 來打開一個位圖文件進行處理了。打開文件你不用擔憂格式,也不用瞭解格式,不管什麼格式,都只要把文件名丟給 Image.open 就能夠了。真所謂 bmp、jpg、png、gif……,一個都不能少。
img = Image.open(‘origin.png’) # 獲得一個圖像的實例對象 img
圖 1原圖
圖像處理中,最基本的就是色彩空間的轉換。通常而言,咱們的圖像都是 RGB 色彩空間的,但在圖像識別當中,咱們可能須要轉換圖像到灰度圖、二值圖等不一樣的色彩空間。 PIL 在這方面也提供了極完備的支持,咱們能夠:
new_img = img.convert(‘L’)
把 img 轉換爲 256 級灰度圖像, convert() 是圖像實例對象的一個方法,接受一個 mode 參數,用以指定一種色彩模式,mode 的取值能夠是以下幾種:
· 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 colour palette)
· RGB (3x8-bit pixels, true colour)
· RGBA (4x8-bit pixels, true colour with transparency mask)
· CMYK (4x8-bit pixels, colour separation)
· YCbCr (3x8-bit pixels, colour video format)
· I (32-bit signed integer pixels)
· F (32-bit floating point pixels)
怎麼樣,夠豐富吧?其實如此之處,PIL 還有限制地支持如下幾種比較少見的色彩模式:LA (L with alpha), RGBX (true colour with padding) and RGBa (true colour with premultiplied alpha)。
下面看一下 mode 爲 ‘1’、’L’、’P’時轉換出來的圖像:
圖 2 mode = '1'
圖 3 mode = 'L'
圖 4 mode = 'P'
convert() 函數也接受另外一個隱含參數 matrix,轉換矩陣 matrix 是一個長度爲4 或者16 tuple。下例是一個轉換 RGB 空間到 CIE XYZ 空間的例子:
rgb2xyz = (
0.412453, 0.357580, 0.180423, 0,
0.212671, 0.715160, 0.072169, 0,
0.019334, 0.119193, 0.950227, 0 )
out = im.convert("RGB", rgb2xyz)
除了完備的色彩空間轉換能力外, PIL 還提供了resize()、rotate()等函數以得到改變大小,旋轉圖片等幾何變換能力,在圖像識別方面,圖像實例提供了一個 histogram() 方法來計算直方圖,很是方便實用。
圖像加強
圖像加強一般用以圖像識別以前的預處理,適當的圖像加強可以使得識別過程達到事半功倍的效果。 PIL 在這方面提供了一個名爲 ImageEnhance 的模塊,提供了幾種常見的圖像加強方案:
import ImageEnhance
enhancer = ImageEnhance.Sharpness(image)
for i in range(8):
factor = i / 4.0
enhancer.enhance(factor).show("Sharpness %f" % factor)
上面的代碼便是一個典型的使用 ImageEnhance 模塊的例子。 Sharpness 是 ImageEnhance 模塊的一個類,用以銳化圖片。這一模塊主要包含以下幾個類:Color、Brightness、Contrast和Sharpness。它們都有一個共同的接口 .enhance(factor) ,接受一個浮點參數 factor,標示加強的比例。下面看看這四個類在不一樣的 factor 下的效果
圖 5 使用Color 進行色彩加強,factor 取值 [0, 4],步進 0.5
圖 6 用 Birghtness 加強亮度,factor取值[0,4],步進0.5
圖 7用 Contrast 加強對比度, factor 取值 [0,4],步進0.5
圖 8用 Sharpness 銳化圖像,factor取值 [0,4],步進0.5
圖像 Filter
PIL 在 Filter 方面的支持是很是完備的,除常見的模糊、浮雕、輪廓、邊緣加強和平滑,還有中值濾波、ModeFilter等,簡直方便到能夠作本身作一個Photoshop。這些 Filter 都放置在 ImageFilter 模塊中,ImageFilter主要包括兩部份內容,一是內置的 Filter,如 BLUR、DETAIL等,另外一部分是 Filter 函數,能夠指定不一樣的參數得到不一樣的效果。示例以下:
import ImageFilter
im1 = im.filter(ImageFilter.BLUR)
im2 = im.filter(ImageFilter.MinFilter(3))
im3 = im.filter(ImageFilter.MinFilter()) # same as MinFilter(3)
能夠看到 ImageFilter 模塊的使用很是簡單,每個 Filter 都只須要一行代碼就可調用,開發效率很是高。
圖 9使用 BLUR
圖 10使用 CONTOUR
圖 11使用 DETAIL
圖 12使用 EMBOSS
圖 13使用 EDGE_ENHANCE
圖 14使用 EDGE_ENHANCE_MORE
圖 15使用 FIND_EDGES
圖 16使用 SHARPEN
圖 17使用 SMOOTH
圖 18使用 SMOOTH_MORE
以上是幾種內置的 Filter 的效果圖,除此以外, ImageFilter 還提供了一些 Filter 函數,下面咱們來看看這些能夠經過參數改變行爲的 Filter 的效果:
圖 19使用 Kernel(),參數:size = (3, 3), kernel = (0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5)
圖 20使用 MaxFilter,默認參數
圖 21使用 MinFilter,默認參數
圖 22使用 MedianFilter,默認參數
圖 23使用 ModeFilter,參數 size = 3
圖 24使用 RankFilter,參數 size = 3, rank = 3
小結
到此,對 PIL 的介紹就告一段落了。總的來講,對於圖像處理和識別,PIL 內建了強大的支持,從各類加強算法到 Filter ,都讓人沒法懷疑使用 Python 的可行性。 Python惟一的劣勢在於執行時間過慢,特別是當實現一些計算量大的算法時候,須要極強的耐心。我曾用 Hough Transform(霍夫變換)來查找圖像中的直線,純 Python 的實現處理一個 340 * 100 的圖片也要花去數秒時間(P4 3.0G + 1G memory)。但使用 PIL 無需關注圖像格式、內建的圖像加強算法和 Filter 算法,這些優勢使 Python 適合用於構造原型和進行實驗,在這兩方面Python 比 matlab 更加方便。商業的圖像識別產品開發,能夠考慮已經被 boost accepted的來自 adobe 的開源 C++ 庫 gil,能夠兼顧執行性能和開發效率。
原文:http://blog.csdn.net/lanphaday/article/details/1852726