1. 程式人生 > >python影象處理---python的影象處理模組Image-

python影象處理---python的影象處理模組Image-

【python影象處理】python的影象處理模組Image

 

版本資訊:2.7.11

環境:windows 7 64位系統

編輯器:PyCharm

執行工具:PyCharm

檔案地址:D:\phpStudy\WWW\python\Image

一、引入影象模組

1. PIL簡介:PIL(Python Imaging Library Python,影象處理類庫)提供了通用的影象處理功能,以及大量有用的基本影象操作,比如影象縮放、裁剪、旋轉、顏色轉換等。利用 PIL 中的函式,我們可以從大多數影象格式的檔案中讀取資料,然後寫入最常見的影象格式檔案中。PIL 中最重要的模組為 Image 。

 

2. 引入PIL:

 
  1. from PIL import Image

注意:有一些教程預設是用import Image的,但是在window 的64位系統中如果沒有在cmd中執行pip install PIL是找不到Image模組的,所以呢必須先安裝Pillow,在cmd中執行pip install Pillow,這裡也要變成from PIL import Image

 

二、讀取與儲存操作

1. PIL 的 open() 函式用於建立 PIL 影象物件,比如讀取一張圖片:

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')

注意:在該路徑下必須有qq_image.jpg圖片,否則會出錯

 

2. 儲存圖片:

save() 方法用於儲存影象到具有指定檔名的檔案。通過 save() 方法,PIL 可以將影象儲存成多種格式的檔案,PIL 是個足夠智慧的類庫,可以根據副檔名來判定影象的格式。比如:img.save('qq_image_thumb.jpg', 'JPEG'),PIL 函式會進行簡單的檢查,如果檔案不是 JPEG 格式,會自動將其轉換成 JPEG 格式;如果轉換失敗,它會在控制檯輸出一條報告失敗的訊息。

 

為了效果,生成縮圖並且儲存為qq_image_thumb.jpg:

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 生成縮圖
  8. img.thumbnail((128, 128))
  9.  
  10. # 儲存圖片
  11. img.save('qq_image_thumb.jpg', 'JPEG')

執行後,進去檔案目錄:

 

三、影象的一些基本操作

1. 輸出圖片的資訊(格式、尺寸以及影象型別)

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 輸出圖片的格式,尺寸以及影象型別
  8. print img.format, img.size, img.mode

輸出:JPEG (355, 346) RGB

 

2. 顯示圖片

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 顯示圖片
  8. img.show()

在PyCharm下執行呢,會直接呼叫Windows照片檢視器來顯示圖片

 

3. 生成縮圖

thumbnail() 方法接受一個元組引數(該引數指定生成縮圖的大小),然後將影象轉換成符合元組引數指定大小的縮圖。

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 生成縮圖
  8. img.thumbnail((128, 128))
  9.  
  10. # 顯示圖片
  11. img.show()

這樣執行之後就會顯示128*128的圖片

 

4. 旋轉圖片

要旋轉一幅影象,可以使用逆時針方式表示旋轉角度,然後呼叫 rotate() 方法:

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 逆時針旋轉45度
  8. rorate1 = img.rotate(45)
  9. rorate1.show()
  10.  
  11. # 逆時針旋轉90
  12. rorate2 = img.transpose(Image.ROTATE_90)
  13. rorate2.show()

執行後如圖:

rorate1:

由於尺寸不變,旋轉45度之後會填白

 

rorate2:

 

注意:只有選擇90度,180度以及270度的時候才能用img.transpose(Image.ROTATE_90),其他角度用rotate

 

5. 翻轉

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 左右對換
  8. rorate3 = img.transpose(Image.FLIP_LEFT_RIGHT)
  9. rorate3.show()
  10.  
  11. # 上下翻轉
  12. rorate4 = img.transpose(Image.FLIP_TOP_BOTTOM)
  13. rorate4.show()

執行後:

rorate3:

 

rorate4:

 

6. 縮放圖片

要調整一幅影象的尺寸,我們可以呼叫 resize() 方法。該方法的引數是一個元組,用來指定新影象的大小:

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 縮放圖片為50*50
  8. resize1 = img.resize((50, 50))
  9. resize1.show()

 

7. 圖片灰度化

影象的顏色轉換可以使用 convert() 方法來實現。要讀取一幅影象,並將其轉換成灰度影象,只需要加上 convert('L'),如下:

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 圖片轉換為灰度
  8. grey = img.convert('L')
  9. grey.show()

執行後:

 

8. 某個畫素點的色彩值的獲取以及更改

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 獲取某個畫素位置的值
  8. print img.getpixel((100, 100))
  9.  
  10. # 更改某個畫素位置的值
  11. img.putpixel((100, 100), (0, 0, 0))

 

9. 裁剪圖片

使用 crop() 方法可以從一幅影象中裁剪指定區域:

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 裁剪圖片 box為裁剪圖片的區域範圍
  8. box = (100, 100, 250, 250)
  9. region = img.crop(box)
  10. region.show()

執行輸出:

 注意:Python規定左上角為(0, 0)的座標點,box由一個4元組(左,上,右,下)定義,表示為座標為: (left, upper, right, lower),最後的兩個數字必須比前面兩個要大。如圖:

 

10. 貼上圖片

為了效果,裁剪該圖片的一部分然後旋轉,最後貼上到指定區域:

 
  1. # coding=utf-8
  2. from PIL import Image
  3.  
  4. # 讀取圖片
  5. img = Image.open('qq_image.jpg')
  6.  
  7. # 裁剪圖片 box為裁剪圖片的區域範圍
  8. box = (100, 100, 250, 250)
  9. region = img.crop(box)
  10. region.show()
  11.  
  12. # 逆時針旋轉圖片180度
  13. region2 = region.transpose(Image.ROTATE_180)
  14. region2.show()
  15.  
  16. # 圖片的貼上
  17. img.paste(region2, box)
  18. img.show()

執行:

 

 

總結:

如果需要更強大的影象處理操作的話,可以使用Matplotlib類庫,它具有比PIL更強大的繪圖功能,比如說可以繪製出強大的條形圖、餅狀圖、散點圖等。