Image模組的介紹
建立一個新的圖片 Python代碼 Image.new(mode, size) Image.new(mode, size, color)
Image.new(mode, size)Image.new(mode, size, color)
層疊圖片
層疊兩個圖片,img2和img2,alpha是一個介於[0,1]的浮點數,如果為0,效果為img1,如果為1.0,效果為img2。當然img1和img2的尺寸和模式必須相同。這個函數可以做出很漂亮的效果來,而圖形的算術加減後邊會說到。 Python代碼 Image.blend(img1, img2, alpha)
Image.blend(img1, img2, alpha)
composite可以使用另外一個圖片作為蒙板(mask),所有的這三張圖片必須具備相同的尺寸,mask圖片的模式可以為“1”,“L”,“RGBA”(關於模式請參看前一篇) Python代碼 Image.composite(img1, img2, mask)
Image.composite(img1, img2, mask)
轉換圖形模式
下面看一個比較牛的方法convert,這個方法可以將圖片在不同的模式間進行轉換,在將灰階圖轉換成二值圖時,所有的非零值被設定為255(白色)。灰階圖的轉換方式採用的是這個演算法: 寫道 L = R*299/1000 + G*587/1000 + B*114/1000
(此為ITU-R 610-2 亮度轉換方程)
點操作
img.point(function),這個function接受一個參數,且對圖片中的每一個點執行這個函數,這個函數是一個匿名函數,在python之類的函數式程式設計語言中,可以使用
lambda運算式來完成,如 Python代碼 out = img.point(lambda i : i*1.2)#對每個點進行20%的加強
out = img.point(lambda i : i*1.2)#對每個點進行20%的加強
如果圖片是“I”或者“F”模式,那麼這個lambda必須使用這樣的形式
Python代碼 argument * scale + offset e.g out = img.point(lambda i: i*1.2 + 10)
argument * scale + offsete.gout = img.point(lambda i: i*1.2 + 10)
透明通道的使用
putalpha(alpha)
這個方法是一個神奇的方法,你可以將一個圖片(與原圖尺寸相同)寫入到原圖片的透明通道中,而不影響原圖片的正常顯示,可以用於資訊隱藏哦。當然,前提是原
始圖片有透明通道。不過就算不是也沒有多大關係,因為有PIL提供的convert功能,可以把一個圖片先轉換成RGBA模式,然後把要隱藏的資訊檔轉成“L”或者“1”模
式,最後使用這個putalpha將其疊加。而在圖片的使用方,只需要簡單的抽取其中的透明通道就可以看到隱藏資訊了,哈哈。
Python代碼 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
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
測試之 Python代碼 if __name__ == "__main__": img = Image.open("green.png") band = Image.open("antelope_inhalf.jpg") img = hideInfoInImage(img, band) img.show()#可以看到,原圖片沒有顯式變化 img.split()[3].show()#抽取出透明通道中的圖片並顯示
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系統中,預設的圖片瀏覽器會把透明通道附加,可能會影響效果,可以用別的圖片瀏覽器查看。
Python代碼 def randomPalette(length, min, max): return [ randint(min, max) for x in xrange(length)]
def randomPalette(length, min, max): return [ randint(min, max) for x in xrange(length)]
調色盤的使用 Python代碼 putpalette(palette) img = Image.open("green.png").convert("L") #img.show() l = randomPalette(768, 0, 255) img.putpalette(l) img.show()
putpalette(palette) img = Image.open("green.png").convert("L") #img.show() l = randomPalette(768, 0, 255) img.putpalette(l) img.show()
現將green.png轉成灰階圖,然後自訂一個隨機調色盤著色,可以看到這個效果。可能有人在想這個圖形處理的作用,其實作用還是比較大的,做模式識別,人臉檢
測等等操作事,真彩的圖片往往很難處理,一個解決方案就是處理成灰階圖或者二值圖,一來可以去掉部分幹擾,二來可以減少需要處理的資料量(提高效率)。
圖片轉換(扭曲,映射)
transform()方法的使用 Python代碼 transform(size, method, data)
transform(size, method, data)
method參數:
| EXTENT |
剪一個矩形出來(用以剪下,展開,壓縮等操作) |
| AFFINE |
幾何防射轉換 |
| QUAD |
將一個四邊形映射到一個矩形 |
| MESH |
將多個四邊形映射到一個操作 |
在EXTENT參數的情況下,data是一個四元組(x0,y0,x1,y1),表示輸入圖片中需要處理的地區,size為新圖片的尺寸,是一個二元組(width, height)
用途:剪貼,展開,壓縮等操作
在AFFINE參數的情況下,data是一個六元組(a,b,c, d,e,f),其中包含affine轉置矩陣的前兩行。對於輸出圖片的每個像素(x,y),會被新值(ax+by+c, dx+ey+f)替換。
用途:反轉,旋轉,剪下等
在QUAD參數的情況下,data是一個八元組(x0,y0,x1,y1,x2,y2,x3,y3)表示源四邊形的四個定點的座標值.MESH方式跟QUAD的效果相當,不過是對多個四邊形進行映射操作.
transpose Python代碼 im.transpose(method)
im.transpose(method)
method參數:
| FLIP_LEFT_RIGHT |
左右倒置 |
| FLIP_TOP_BOTTOM |
上下倒置 |
| ROTATE_90 |
旋轉90度(逆時針) |
| ROTATE_180 |
旋轉180度(逆時針) |
| ROTATE_270 |
旋轉270度(逆時針) |
(360度?這個就不用轉了吧,呵呵)
關於Image模組就介紹到這裡,還有一部分屬性,函數和方法沒有在此做分析,這部分比較簡單,如果想瞭解更多,可以參看pil的handbook。