轉載 :http://www.php.cn/python-tutorials-372980.htmlphp
計算機一般將圖像表示爲RGB值,或者再加上alpha值(通透度,透明度),稱爲RGBA值。在Pillow中,RGBA的值表示爲由4個整數組成的元組,分別是R、G、B、A。整數的範圍0~255。RGB全0就能夠表示黑色,全255表明黑色。能夠猜想(255, 0, 0, 255)表明紅色,由於R份量最大,G、B份量爲0,因此呈現出來是紅色。可是當alpha值爲0時,不管是什麼顏色,該顏色都不可見,能夠理解爲透明。html
from PIL import ImageColorprint(ImageColor.getcolor('red', 'RGBA'))# 也能夠只以RBG的方式查看print(ImageColor.getcolor('black', 'RGB'))
(255, 0, 0, 255) (0, 0, 0)
圖像中左上角是座標原點(0, 0),這和日常數學裏的座標系不太同樣。這樣定義的座標系意味着,X軸是從左到右增加的,而Y軸是從上到下增加。python
在Pillow中如何使用上述定義的座標系表示一塊矩形區域?許多函數或方法要求提供一個矩形元組參數。元組參數包含四個值,分別表明矩形四條邊的距離X軸或者Y軸的距離。順序是(左,頂,右,底)
。右和底座標稍微特殊,表示直到但不包括。能夠理解爲[左, 右)
和[頂, 底)
這樣左閉右開的區間。好比(3, 2, 8, 9)就表示了橫座標範圍[3, 7];縱座標範圍[2, 8]的矩形區域。數組
瞭解了一些基礎知識,能夠上手了。首先從讀取圖片開始,不少圖像處理庫(如opencv)都以imread()
讀取圖片。Pillow中使用open
方法。函數
from PIL import Image im_path = r'F:\Jupyter Notebook\csv_time_datetime_PIL\rabbit.jpg'im = Image.open(im_path) width, height = im.size# 寬高print(im.size, width, height)# 格式,以及格式的詳細描述print(im.format, im.format_description) im.save(r'C:\Users\Administrator\Desktop\rabbit_copy.jpg') im.show()
(1920, 1080) 1920 1080 JPEG JPEG (ISO 10918)
im.size
返回一個元組,分別是寬和高。show()
方法會調用系統默認圖像查看軟件,打開並顯示。im.format
可查看圖像的格式。save()
可保存處理後的圖片,若是未經處理,保存後的圖像佔用的空間(字節數)通常也與原圖像不同,可能通過了壓縮。code
Pillow也能夠新建空白圖像, 第一個參數是mode即顏色空間模式,第二個參數指定了圖像的分辨率(寬x高),第三個參數是顏色。orm
能夠直接填入經常使用顏色的名稱。如'red'htm
也能夠填入十六進制表示的顏色,如#FF0000
表示紅色。對象
還能傳入元組,好比(255, 0, 0, 255)或者(255, 0, 0)表示紅色。圖片
# 一般使用RGB模式就能夠了newIm= Image.new('RGB', (100, 100), 'red') newIm.save(r'C:\Users\Administrator\Desktop\1.png')# 也能夠用RGBA模式,還有其餘模式查文檔吧blcakIm = Image.new('RGB',(200, 100), 'red') blcakIm.save(r'C:\Users\Administrator\Desktop\2.png')# 十六進制顏色blcakIm = Image.new('RGBA',(200, 100), '#FF0000') blcakIm.save(r'C:\Users\Administrator\Desktop\3.png')# 傳入元組形式的RGBA值或者RGB值# 在RGB模式下,第四個參數失效,默認255,在RGBA模式下,也可只傳入前三個值,A值默認255blcakIm = Image.new('RGB',(200, 100), (255, 255, 0, 120)) blcakIm.save(r'C:\Users\Administrator\Desktop\4.png')
Image
有個crop()
方法接收一個矩形區域元組(上面有提到)。返回一個新的Image對象,是裁剪後的圖像,對原圖沒有影響。
im = Image.open(im_path) cropedIm = im.crop((700, 100, 1200, 1000)) cropedIm.save(r'C:\Users\Administrator\Desktop\cropped.png')
看下原圖和裁剪後的圖像。
Image
的copy
函數如其名會產生一個原圖像的副本,在這個副本上的任何操做不會影響到原圖像。paste()
方法用於將一個圖像粘貼(覆蓋)在另外一個圖像上面。誰調用它,他就在該Image對象上直接做修改。
im = Image.open(im_path) cropedIm = im.crop((700, 100, 1200, 1000)) im.paste(cropedIm, (0, 0)) im.show() im.save(r'C:\Users\Administrator\Desktop\paste.png')
im.show()
顯示圖像發現這時im(即原圖)已經被改變。
這若是以後還會用到原圖的信息,因爲信息被改變就很麻煩。因此paste前最好使用copy()
複製一個副本,在此副本操做,不會影響到原圖信息。雖然在程序裏原圖信息已改變,但因爲保存文件時用的其餘文件名,至關於改變沒有生效,因此查看的時候原圖仍是沒有改變的。
im = Image.open(im_path) cropedIm = im.crop((700, 100, 1200, 1000)) copyIm = im.copy() copyIm.paste(cropedIm, (0, 0)) im.show() copyIm.save(r'C:\Users\Administrator\Desktop\paste.png')
這回再看原圖,沒有改變了。這就保證了以後再次使用im時,裏面的信息仍是原汁原味。來看個有趣的例子。
im = Image.open(im_path) cropedIm = im.crop((700, 100, 1200, 1000)) crop_width, crop_height = cropedIm.size width, height = im.size copyIm = im.copy()for left in range(0, width, crop_width):for top in range(0, height, crop_height): copyIm.paste(cropedIm, (left, top)) copyIm.save(r'C:\Users\Administrator\Desktop\dupli-rabbit.png')
以裁剪後的圖像寬度和高度爲間隔,在循環內不斷粘貼在副本中,這有點像是在拍證件照。
resize
方法返回指定寬高度的新Image對象,接受一個含有寬高的元組做爲參數。寬高的值得是整數。
im = Image.open(im_path) width, height = im.size resizedIm = im.resize((width, height+(1920-1080))) resizedIm.save(r'C:\Users\Administrator\Desktop\resize.png')
兔子瘦了,能夠看到resize不是等比例縮放的。
rotate()
返回旋轉後的新Image對象, 保持原圖像不變。逆時針旋轉。
im = Image.open(im_path) im.rotate(90).save(r'C:\Users\Administrator\Desktop\rotate90.png') im.rotate(270).save(r'C:\Users\Administrator\Desktop\rotate270.png') im.rotate(180).save(r'C:\Users\Administrator\Desktop\rotate180.png') im.rotate(20).save(r'C:\Users\Administrator\Desktop\rotate20.png') im.rotate(20, expand=True).save(r'C:\Users\Administrator\Desktop\rotate20_expand.png')
由上到下,分別是旋轉了90°,180°, 270°、普通的20°,加了參數expand=True
旋轉的20°。expand放大了圖像尺寸(變成了2174x1672),使得邊角的圖像不被裁剪(四個角恰好貼着圖像邊緣)。再看旋轉90°、270°時候圖像被裁剪了,可是以下查看圖像的寬高,確是和原圖同樣,搞不懂。
im90 = Image.open(r'C:\Users\Administrator\Desktop\rotate90.png') im270 = Image.open(r'C:\Users\Administrator\Desktop\rotate270.png')# 寬高信息並無改變print(im90.size, im270.size)
(1920, 1080) (1920, 1080)
圖像的鏡面翻轉。transpose()
函數能夠實現,必須傳入Image.FLIP_LEFT_RIGHT
或者Image.FLIP_TOP_BOTTOM
,第一個是水平翻轉,第二個是垂直翻轉。
im = Image.open(im_path) im.transpose(Image.FLIP_LEFT_RIGHT).save(r'C:\Users\Administrator\Desktop\transepose_lr.png') im.transpose(Image.FLIP_TOP_BOTTOM).save(r'C:\Users\Administrator\Desktop\transepose_tb.png')
水平翻轉看不出來,原圖就是水平對稱的...
垂直翻轉就明顯了...
Pillow使用ImageFilter能夠簡單作到圖像的模糊、邊緣加強、銳利、平滑等常見操做。
from PIL import Image, ImageFilter im = Image.open(im_path)# 高斯模糊im.filter(ImageFilter.GaussianBlur).save(r'C:\Users\Administrator\Desktop\GaussianBlur.jpg')# 普通模糊im.filter(ImageFilter.BLUR).save(r'C:\Users\Administrator\Desktop\BLUR.jpg')# 邊緣加強im.filter(ImageFilter.EDGE_ENHANCE).save(r'C:\Users\Administrator\Desktop\EDGE_ENHANCE.jpg')# 找到邊緣im.filter(ImageFilter.FIND_EDGES).save(r'C:\Users\Administrator\Desktop\FIND_EDGES.jpg')# 浮雕im.filter(ImageFilter.EMBOSS).save(r'C:\Users\Administrator\Desktop\EMBOSS.jpg')# 輪廓im.filter(ImageFilter.CONTOUR).save(r'C:\Users\Administrator\Desktop\CONTOUR.jpg')# 銳化im.filter(ImageFilter.SHARPEN).save(r'C:\Users\Administrator\Desktop\SHARPEN.jpg')# 平滑im.filter(ImageFilter.SMOOTH).save(r'C:\Users\Administrator\Desktop\SMOOTH.jpg')# 細節im.filter(ImageFilter.DETAIL).save(r'C:\Users\Administrator\Desktop\DETAIL.jpg')
另外,如果要進行圖案、文字的繪製,可以使用ImageDraw。Pillow還有其餘強大功能,就不一一列舉了。
其實,Pillow只是個基礎的圖像處理庫。若不深刻圖像處理,已經夠用。專業人士使用opencv是更好地選擇。Python中使用import cv2
開始使用吧!
以上就是Python用Pillow(PIL)進行圖像操做實例的詳細內容,更多請關注php中文網其它相關文章!