1. 程式人生 > >Python學習筆記(1):圖片處理

Python學習筆記(1):圖片處理

基礎學習

在配置完開發環境之後,就可以開始Python的學習之路啦!首先是基礎知識的學習,可以根據自己的情況找到合適的教程,我用了一週的時間把慕課網上的Python教程 過了一遍。
過完一遍之後,發現印象不夠深刻,所以找一些小的練習來鞏固基礎。我選擇了Python練習冊。從今天開始,分享我的練習過程,並且記錄其中用到的知識。

圖片處理

Python利用影象處理庫Pillow(PIL)對圖片進行處理。

安裝與匯入

在Linux系統中,只需要輸入pip install Pillow即可

需要注意的是:

  • 1.0版本以後,不再支援“import Image”,需要使用“from PIL import Image”;
  • 2.1.0版本以後,不再支援“import _imaging”,需要使用“from PIL.Image import core as _imaging”

Pillow與Python對應的版本

  • Pillow版本小於2.0.0支援Python 2.4,2.5,2.6,2.7
  • Pillow版本大於2.0.0(包括2.0.0)小於4.0.0支援Python 2.6,2.7,3.2,3.3,3.4,3.5
  • Pillow版本大於4.0.0(包括4.0.0)支援Python 2.7,3.3,3.4,3.5,3.6

模組

Image

Image模組包含了載入、儲存影象的方法,還有對影象進行旋轉等操作的一些方法。PIL.Image.open(fp,mode=’r’)方法是最基本的開啟影象的方法。該方法返回一個Image物件,可以對影象進行其他操作。

影象處理

  • PIL.Image.alpha_composite(im1, im2)
  • PIL.Image.blend(im1, im2, alpha)
  • PIL.Image.composite(im1, im2, mask)
    以上3個函式都是將兩個影象進行融合,需要注意的是,被融合的兩個影象的mode(瞭解mode)和size都要相同。這裡說明一下,alpha是透明度,mask是一個為“1”,“L”或“RGBA”,size和im1,im2相同的圖片。
blend函式示例
from PIL import Image, ImageDraw, ImageFont

img1 = Image.open
("cat.jpg") img2 = Image.new("RGB", (620, 423), "blue") out = Image.blend(img1, img2, 0.4) out.show()

執行結果:
這裡寫圖片描述

PIL.Image.eval(image, *args)函式對影象的每個畫素進行執行函式。

from PIL import Image, ImageDraw, ImageFont

img1 = Image.open("rab.jpg")
out = Image.eval(img1, lambda i: i * 2)
img1.show()
out.show()

執行結果:
這裡寫圖片描述
以上是對每個畫素值乘以2的結果。

ImageChops

Chops其實是Channel Operations,也就是對通道的操作。下面來看一下ImageChops模組提供的一些方法:
PIL.ImageChops.add(image1, image2, scale=1.0, offset=0)
add方法的操作是out = ((image1 + image2) / scale + offset),所以scale越大,顏色越深,offset越大,顏色越淺。預設情況下,scale為1,offset為0。

img1 = Image.open("cat.jpg")
img2 = Image.new("RGB", (620, 423), "blue")
# img3 = ImageChops.add(img1, img2, 10, 0)
img3 = ImageChops.add(img1, img2, 1, 200)
img3.show()

當scale等於10,offset等於0時,效果圖:
這裡寫圖片描述
當scale等於1,offset等於200時,效果圖:
這裡寫圖片描述
有了上面的例子,就可以更好的理解ImageChops.add()函式的用法了。
PIL.ImageChops.blend(image1, image2, alpha)函式和Image模組中的blend函式相同。
PIL.ImageChops.darker(image1, image2)函式是將兩個圖片逐個畫素比較,返回灰度值較大的畫素。例如:

img1 = Image.open("cat.jpg")
img2 = Image.new("RGB", (620, 423), "blue")
img3 = ImageChops.darker(img1, img2)
img3.show()

結果
這裡寫圖片描述
PIL.ImageChops.invert(image)函式,將影象的顏色反轉。
這裡寫圖片描述

ImageCms

該模組提供了顏色管理方法。
PIL.ImageCms.applyTransform(im, transform, inPlace=0)函式對一個圖片應用指定的轉換,引數im為指定的影象物件,該影象的mode必須和transform提供的inMode相同,transform是一個CmsTransform物件。inPlace是布林型引數,如果為True,則在原圖修改,不返回值;如果為False,則返回應用轉換後的影象物件。

在以下情況下,該方法會丟擲PyCMSError異常:
  • im.mode != transform.inMode
  • inPlace == TRUE and transform.inMode != transform.outMode
  • pyCMSdll不支援im.mode, transfer.inMode, 或 transfer.outMode
  • 轉換過程中發生錯誤

ImageDraw

可以利用該模組對2D影象進行建立和修改操作。
字型:PIL可以使用bitmap fonts or OpenType/TrueType fonts。class PIL.ImageDraw.Draw(im, mode=None)函式用來建立一個可以被修改的影象,針對影象的修改會在原圖上進行。
PIL.ImageDraw.ImageDraw.bitmap(xy, bitmap, fill=None)函式在指定區域繪製指定的點陣圖

cat = Image.open("cat.jpg")
rab = Image.open("rab.jpg")
d = ImageDraw.Draw(cat)
rab = rab.resize((100, 100), Image.ANTIALIAS)
r,g,b = rab.split()
d.bitmap((0, 0), r, fill=(0, 0, 0))
cat.show()

結果
這裡寫圖片描述

其他函式
  • PIL.ImageDraw.ImageDraw.ellipse(xy, fill=None, outline=None)函式用來繪製橢圓形。
  • PIL.ImageDraw.ImageDraw.pieslice(xy, start, end, fill=None, outline=None)函式用來扇形
  • PIL.ImageDraw.ImageDraw.polygon(xy, fill=None, outline=None)函式用來繪製多邊形,xy給定每個頂點的座標
  • PIL.ImageDraw.ImageDraw.rectangle(xy, fill=None, outline=None)用來繪製矩形
  • PIL.ImageDraw.ImageDraw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align=”left”, direction=None, features=None)函式用來繪製字元

ImageEnhance

ImageEnhance提供了一些類,可以用於影象增強。所有的增強類都實現了一個介面,這個介面包括一個方法enhancer.enhance(factor)。該方法返回增強過的影象。factor為1時,返回原影象拷貝,factor越大,增強效果越顯著。
示例如下:

dog = Image.open("/home/jackeyzhe/Downloads/dog.jpg")
enhancer = ImageEnhance.Sharpness(dog)
enhancer.enhance(0.0).show("Sharpness %f" % 0.0)
enhancer.enhance(10.0).show("Sharpness %f" % 10.0)

factor為0時
這裡寫圖片描述
factor為10時
這裡寫圖片描述
class PIL.ImageEnhance.Color(image)函式對顏色進行增強
同樣的,factor為1.0為原圖。當factor為0.0時為黑白影象。

dog = Image.open("/home/jackeyzhe/Downloads/dog.jpg")
ImageEnhance.Color(dog).enhance(0.0).show()
ImageEnhance.Color(dog).enhance(2.0).show()

factor為0時
這裡寫圖片描述
factor為2.0時
這裡寫圖片描述
class PIL.ImageEnhance.Contrast(image)函式用來調整對比度
class PIL.ImageEnhance.Brightness(image)函式用來調整亮度
class PIL.ImageEnhance.Sharpness(image)函式用來調整銳度

關於Python影象處理技術就先介紹這些,如果想了解更多可以自行檢視Pillow的文件,也歡迎各位正在學習Python的來探討技術問題。