Image模塊的介紹
創(chuàng)建一個新的圖片
- Image.new(mode, size)
- Image.new(mode, size, color)
層疊圖片
層疊兩個圖片,img2和img2,alpha是一個介于[0,1]的浮點數(shù),如果為0,效果為img1,如果為1.0,效果為img2。當(dāng)然img1和img2的尺寸和模式必須相同。這個函數(shù)可以做出很漂亮的效果來,而圖形的算術(shù)加減后邊會說到。
- Image.blend(img1, img2, alpha)
composite可以使用另外一個圖片作為蒙板(mask),所有的這三張圖片必須具備相同的尺寸,mask圖片的模式可以為“1”,“L”,“RGBA”(關(guān)于模式請參看前一篇)
- Image.composite(img1, img2, mask)
轉(zhuǎn)換圖形模式
下面看一個比較牛的方法convert,這個方法可以將圖片在不同的模式間進(jìn)行轉(zhuǎn)換,在將灰度圖轉(zhuǎn)換成二值圖時,所有的非零值被設(shè)置為255(白色)?;叶葓D的轉(zhuǎn)換方式采用的是這個算法:
(此為ITU-R 610-2 亮度轉(zhuǎn)換方程)
點操作
img.point(function),這個function接受一個參數(shù),且對圖片中的每一個點執(zhí)行這個函數(shù),這個函數(shù)是一個匿名函數(shù),在python之類的函數(shù)式編程語言中,可以使用
lambda表達(dá)式來完成,如
- out = img.point(lambda i : i*1.2)#對每個點進(jìn)行20%的加強
如果圖片是“I”或者“F”模式,那么這個lambda必須使用這樣的形式
- argument * scale + offset
- e.g
- out = img.point(lambda i: i*1.2 + 10)
透明通道的使用
putalpha(alpha)
這個方法是一個神奇的方法,你可以將一個圖片(與原圖尺寸相同)寫入到原圖片的透明通道中,而不影響原圖片的正常顯示,可以用于信息隱藏哦。當(dāng)然,前提是原
始圖片有透明通道。不過就算不是也沒有多大關(guān)系,因為有PIL提供的convert功能,可以把一個圖片先轉(zhuǎn)換成RGBA模式,然后把要隱藏的信息文件轉(zhuǎn)成“L”或者“1”模
式,最后使用這個putalpha將其疊加。而在圖片的使用方,只需要簡單的抽取其中的透明通道就可以看到隱藏信息了,哈哈。
- def hideInfoInImage(img, info):
- if img.mode != "RGBA":
- img = img.convert("RGBA")
- if info.mode != "L" and info.mode != "1":
- info = info.convert("L")
- img.putalpha(info)
- return img
測試之
- if __name__ == "__main__":
- img = Image.open("green.png")
- band = Image.open("antelope_inhalf.jpg")
- img = hideInfoInImage(img, band)
- img.show()#可以看到,原圖片沒有顯式變化
- img.split()[3].show()#抽取出透明通道中的圖片并顯示
在windows系統(tǒng)中,默認(rèn)的圖片瀏覽器會把透明通道附加,可能會影響效果,可以用別的圖片瀏覽器查看。
- def randomPalette(length, min, max):
- return [ randint(min, max) for x in xrange(length)]
調(diào)色板的使用
- putpalette(palette)
- img = Image.open("green.png").convert("L")
- #img.show()
- l = randomPalette(768, 0, 255)
- img.putpalette(l)
- img.show()
現(xiàn)將green.png轉(zhuǎn)成灰度圖,然后自定義一個隨機調(diào)色板著色,可以看到這個效果??赡苡腥嗽谙脒@個圖形處理的作用,其實作用還是比較大的,做模式識別,人臉檢
測等等操作事,真彩的圖片往往很難處理,一個解決方案就是處理成灰度圖或者二值圖,一來可以去掉部分干擾,二來可以減少需要處理的數(shù)據(jù)量(提高效率)。
圖片轉(zhuǎn)換(扭曲,映射)
transform()方法的使用
- transform(size, method, data)
method參數(shù):
EXTENT | 剪一個矩形出來(用以剪切,拉伸,壓縮等操作) |
AFFINE | 幾何防射轉(zhuǎn)換 |
QUAD | 將一個四邊形映射到一個矩形 |
MESH | 將多個四邊形映射到一個操作 |
在EXTENT參數(shù)的情況下,data是一個四元組(x0,y0,x1,y1),表示輸入圖片中需要處理的區(qū)域,size為新圖片的尺寸,是一個二元組(width, height)
用途:剪貼,拉伸,壓縮等操作
在AFFINE參數(shù)的情況下,data是一個六元組(a,b,c, d,e,f),其中包含affine轉(zhuǎn)置矩陣的前兩行。對于輸出圖片的每個像素(x,y),會被新值(ax+by+c, dx+ey+f)替換。
用途:反轉(zhuǎn),旋轉(zhuǎn),剪切等
在QUAD參數(shù)的情況下,data是一個八元組(x0,y0,x1,y1,x2,y2,x3,y3)表示源四邊形的四個定點的坐標(biāo)值.MESH方式跟QUAD的效果相當(dāng),不過是對多個四邊形進(jìn)行映射操作.
transpose
method參數(shù):
FLIP_LEFT_RIGHT | 左右倒置 |
FLIP_TOP_BOTTOM | 上下倒置 |
ROTATE_90 | 旋轉(zhuǎn)90度(逆時針) |
ROTATE_180 | 旋轉(zhuǎn)180度(逆時針) |
ROTATE_270 | 旋轉(zhuǎn)270度(逆時針) |
(360度?這個就不用轉(zhuǎn)了吧,呵呵)
關(guān)于Image模塊就介紹到這里,還有一部分屬性,函數(shù)和方法沒有在此做分析,這部分比較簡單,如果想了解更多,可以參看pil的handbook。