首頁 > 軟體

Python影象處理庫PIL詳細使用說明

2022-04-06 19:03:12

一、 簡介

1、 基本介紹

Pillow 是 Python 中較為基礎的影象處理庫,主要用於影象的基本處理,比如裁剪影象、調整影象大小和影象顏色處理等。與 Pillow 相比,OpenCV 和 Scikit-image 的功能更為豐富,所以使用起來也更為複雜,主要應用於機器視覺、影象分析等領域,比如眾所周知的“臉部辨識”應用 。

2、 特點

  • 支援格式繁多

    Pillow 支援廣泛的影象格式,比如 "jpeg","png","bmp","gif","ppm","tiff" 等。同時,它也支援影象格式之間的相互轉換。總之, Pillow 幾乎能夠處理任何格式的影象

  • 提供豐富的功能

    Pillow 提供了豐富的影象處理功能,可概括為兩個方面:

    • 影象歸檔
    • 影象處理

    影象歸檔,包括建立縮圖、生成預覽影象、影象批次處理等;而影象處理,則包括調整影象大小、裁剪影象、畫素點處理、新增濾鏡、影象顏色處理等

  • 配合 GUI 工具使用

官方檔案:【https://www.osgeo.cn/pillow/reference/ImageFont.html】

3、 安裝

pip install pillow
導包
imoprt PIL

二、 Image 物件

1、 範例化物件

1.1 範例化

導包

from PIL import Image

使用 open 方法

im = PIL.Image.open(fp) # 匯入圖片
im.show() # 展示圖片

fp:圖片路徑

使用 open 方法

im = Image.new(mode,size,color) # 建立圖片
im.show() # 展示圖片

引數說明如下:

  • mode:影象模式,字串引數,比如 RGB(真彩影象)、L(灰度影象)、CMYK(色彩圖列印模式)等
  • size:影象大小,元組引數(width, height)代表影象的畫素大小
  • color:圖片顏色,預設值為 0 表示黑色,引數值支援(R,G,B)三元組數位格式、顏色的十六進位制值以及顏色英文單詞

1.2 影象模式

mode描述
11 位畫素(取值範圍 0-1),0表示黑,1 表示白,單色通道。
L8 位畫素(取值範圍 0 -255),灰度圖,單色通道。
P8 位畫素,使用調色盤對映到任何其他模式,單色通道。
RGB3 x 8位元畫素,真彩色,三色通道,每個通道的取值範圍 0-255。
RGBA4 x 8位元畫素,真彩色+透明通道,四色通道。
CMYK4 x 8位元畫素,四色通道,可以適應於列印圖片。
YCbCr3 x 8位元畫素,彩色視訊格式,三色通道。
LAB3 x 8位元畫素,L * a * b顏色空間,三色通道
HSV3 x 8位元畫素,色相,飽和度,值顏色空間,三色通道。
I32 位有符號整數畫素,單色通道。
F32 位浮點畫素,單色通道。

2、 物件屬性

import PIL.Image

im = PIL.Image.open(r"D:35005PicturesScreenshots微信圖片_20220302175157.jpg")
print(im.size) # 檢檢視片大小
print(im.readonly) # 檢視是否為唯讀,1為是,0為否
print(im.format) # 檢檢視片的格式
print(im.info) # 檢檢視片的相關資訊
print(im.mode) # 檢檢視片的模式

3、 格式轉換

3.1 save 方法

save 方法用於儲存 影象,當不指定檔案格式時,它會以預設的圖片格式來儲存;如果指定圖片格式,則會以指定的格式儲存圖片

語法:

im = PIL.Image.open(r"D:35005PicturesScreenshots微信圖片_20220302175157.jpg")
im.save(fp, format=None) # 儲存圖片

引數說明如下:

  • fp:圖片的儲存路徑,包含圖片的名稱,字串格式
  • format:可選引數,可以指定圖片的格式

3.2 convert 方法

注意,並非所有的圖片格式都可以用 save() 方法轉換完成,比如將 PNG 格式的圖片儲存為 JPG 格式,如果直接使用 save() 方法就會出現錯誤

引發錯誤的原因是由於 PNG 和 JPG 影象模式不一致導致的。其中 PNG 是四通道 RGBA 模式,即紅色、綠色、藍色、Alpha 透明色;JPG 是三通道 RGB 模式。因此要想實現圖片格式的轉換,就要將 PNG 轉變為三通道 RGB 模式

Image 類提供的 convert() 方法可以實現影象模式的轉換。該函數提供了多個引數,比如 mode、matrix、dither 等,其中最關鍵的引數是 mode,其餘引數無須關心

語法:

im.convert(mode, params) # 轉換模式
im.save(fp) # 儲存圖片

引數:

  • mode:指的是要轉換成的影象模式
  • params:其他可選引數

4、 圖片縮放

在影象處理過程中經常會遇到縮小或放大影象的情況,Image 類提供的 resize() 方法能夠實現任意縮小和放大影象

語法:

im_new = im.resize(size, resample=image.BICUBIC, box=None, reducing_gap=None) # 注意要重新賦值
im_new.show() # 縮放後的圖片

引數:

  • size:元組引數 (width,height),圖片縮放後的尺寸

  • resample:可選引數,指影象重取樣濾波器,與 thumbnail() 的 resample 引數類似,預設為 Image.BICUBIC

  • box:對指定圖片區域進行縮放,box 的引數值是長度為 4 的畫素座標元組,即 (左,上,右下)。注意,被指定的區域必須在原圖的範圍內,如果超出範圍就會報錯。當不傳該引數時,預設對整個原圖進行縮放

    (0, 0, 120, 180)代表的是以原圖的左上角為原點,選擇寬和高分別是(120,180)的影象區域

  • reducing_gap:可選引數,浮點引數值,用於優化圖片的縮放效果,常用引數值有 3.0 和 5.0

5、 建立縮圖

縮圖指的是將原圖縮小至一個指定大小(size)的影象。通過建立縮圖可以使影象更易於展示和瀏覽

Image 物件提供了一個 thumbnail() 方法用來生影象的縮圖,等比縮放

語法:

im.thumbnail(size,resample) # 直接在原圖的基礎上修改
im.show() # 縮放後的圖片

引數:

  • size:元組引數,指的是縮小後的影象大小
  • resample:可選引數,指影象重取樣濾波器,有四種過濾方式,分別是 Image.BICUBIC(雙立方插值法)、PIL.Image.NEAREST(最近鄰插值法)、PIL.Image.BILINEAR(雙線性插值法)、PIL.Image.LANCZOS(下取樣過濾插值法),預設為 Image.BICUBIC

6、 影象分離與合併

影象(指數位影像)由許多畫素點組成,畫素是組成影象的基本單位,而每一個畫素點又可以使用不同的顏色,最終呈現出了絢麗多彩的影象 ,而影象的分離與合併,指的就是影象顏色的分離和合並

6.1 split 方法

im = PIL.Image.open(r"D:35005PicturesScreenshots微信圖片_20220302175157.jpg")
r, g, b = im.split() # split 方法使用較簡單,分離通道
r.show()
g.show()
b.show()

6.2 merge 方法

Image 類提供的 merge() 方法可以實現影象的合併操作。注意,影象合併,可以是單個影象合併,也可以合併兩個以上的影象

im_merge = PIL.Image.merge(mode, bands)
im_merge.show()

引數:

  • mode:指定輸出圖片的模式
  • bands:引數型別為元組或者列表序列,其元素值是組成影象的顏色通道,比如 RGB 分別代表三種顏色通道,可以表示為 (r, g, b)

6.3 blend 方法

Image 類也提供了 blend() 方法來混合 RGBA 模式的圖片(PNG 格式)

語法:

PIL.Image.blend(image1,image2, alpha)

引數:

  • image1:圖片物件1
  • image2:圖片物件2
  • alpha:透明度 ,取值範圍為 0 到 1,當取值為 0 時,輸出影象相當於 image1 的拷貝,而取值為 1 時,則是 image2 的拷貝,只有當取值為 0.5 時,才為兩個影象的中合。因此改值的大小決定了兩個影象的混合程度

7、 影象處理

7.1 影象裁剪

Image 類提供的 crop() 函數允許我們以矩形區域的方式對原影象進行裁剪

語法:

im_crop = im.crop(box=None) # box 代表裁剪區域
im_crop.show()

box 是一個有四個數位的元組引數 (x_左上,y_左下,x1_右上,y1_右下),分別表示被裁剪矩形區域的左上角 x、y 座標和右下角 x,y 座標。預設 (0,0) 表示座標原點,寬度的方向為 x 軸,高度的方向為 y 軸,每個畫素點代表一個單位

7.2 拷貝和貼上

拷貝、貼上操作幾乎是成對出現的,Image 類提供了 copy() 和 paste() 方法來實現影象的複製和貼上

拷貝語法:

im_copy = im.copy() # 複製圖片

貼上語法:

im_copy.paste(image, box=None, mask=None)

引數:

  • image:指被貼上的圖片
  • box:指定圖片被貼上的位置或者區域,其引數值是長度為 2 或者 4 的元組序列,長度為 2 時,表示具體的某一點 (x, y);長度為 4 則表示圖片貼上的區域,此時區域的大小必須要和被貼上的影象大小保持一致
  • mask:可選引數,為圖片新增蒙版效果

注意:

  • 貼上後的圖片模式將自動保持一致,不需要進行額外的轉換
from PIL import Image

im = Image.open(r"D:35005PicturesScreenshots微信圖片_20220302175157.jpg")

# 複製一張圖片副本
im_copy = im.copy()

# 對副本進行裁剪
im_crop = im_copy.crop((0, 0, 200, 100))

# 建立一個新的影象作為蒙版,L模式,單顏色值
image_new = Image.new('L', (200, 100), 200)

# 將裁剪後的副本貼上至副本影象上,並新增蒙版
im_copy.paste(im_crop, (100, 100, 300, 200), mask=image_new)

# 顯示貼上後的影象
im_copy.show()

8、幾何變化

影象的幾何變換主要包括影象翻轉、影象旋轉和影象變換操作,Image 類提供了處理這些操作的函數 transpose()、rotate() 和 transform()

8.1 transpose

該函數可以實現影象的垂直、水平翻轉

語法:

im_out = im.transpose(method) # 生成新的影象物件

method取值:

  • Image.FLIP_LEFT_RIGHT:左右水平翻轉
  • Image.FLIP_TOP_BOTTOM:上下垂直翻轉
  • Image.ROTATE_90:影象逆時針旋轉 90 度
  • Image.ROTATE_180:影象旋轉 180 度
  • Image.ROTATE_270:影象旋轉 270 度
  • Image.TRANSPOSE:影象轉置
  • Image.TRANSVERSE:影象橫向翻轉

8.2 rotate

當我們想把影象旋轉任意角度時,可以使用 rotate() 函數

語法:

im_out = im.rotate(angle, resample=PIL.Image.NEAREST, expand=None, center=None, translate=None, fillcolor=None) # 返回影象物件

引數:

  • angle:表示任意旋轉的角度
  • resample:重取樣濾波器,預設為 PIL.Image.NEAREST 最近鄰插值方法
  • expand:可選引數,表示是否對影象進行擴充套件,如果引數值為 True 則擴大輸出影象,如果為 False 或者省略,則表示按原影象大小輸出
  • center:可選引數,指定旋轉中心,引數值是長度為 2 的元組,預設以影象中心進行旋轉
  • translate:引數值為二元組,表示對旋轉後的影象進行平移,以左上角為原點;translate的引數值可以為負數
  • fillcolor:可選引數,填充顏色,影象旋轉後,對影象之外的區域進行填充

8.3 transform

該函數能夠對影象進行變換操作,通過指定的變換方式,產生一張規定大小的新影象

語法:

im_out = im.transform(size, method, data=None, resample=0) # 返回影象物件

引數:

  • size:指定新圖片的大小
  • method:指定圖片的變化方式,比如 Image.EXTENT 表示矩形變換
  • data:該引數用來給變換方式提供所需資料
  • resample:影象重取樣濾波器,預設引數值為 PIL.Image.NEAREST

三、 ImageFilter

1、 簡介

隨著數位影像技術的不斷髮展,影象降噪方法也日趨成熟,通過某些演演算法來構造濾波器是影象降噪的主要方式。濾波器能夠有效抑制噪聲的產生,並且不影響被處理影象的形狀、大小以及原有的拓撲結構

Pillow 通過 ImageFilter 類達到影象降噪的目的,該類中整合了不同種類的濾波器,通過呼叫它們從而實現影象的平滑、銳化、邊界增強等影象降噪操作

2、 降噪處理

2.1 影象降噪濾波器

名稱說明
ImageFilter.BLUR模糊濾波,即均值濾波
ImageFilter.CONTOUR輪廓濾波,尋找影象輪廓資訊
ImageFilter.DETAIL細節濾波,使得影象顯示更加精細
ImageFilter.FIND_EDGES尋找邊界濾波(找尋影象的邊界資訊)
ImageFilter.EMBOSS浮雕濾波,以浮雕圖的形式顯示影象
ImageFilter.EDGE_ENHANCE邊界增強濾波
ImageFilter.EDGE_ENHANCE_MORE深度邊緣增強濾波
ImageFilter.SMOOTH平滑濾波
ImageFilter.SMOOTH_MORE深度平滑濾波
ImageFilter.SHARPEN銳化濾波
ImageFilter.GaussianBlur()高斯模糊
ImageFilter.UnsharpMask()反銳化掩碼濾波
ImageFilter.Kernel()折積核濾波
ImageFilter.MinFilter(size)最小值濾波器,從 size 引數指定的區域中選擇最小畫素值,然後將其儲存至輸出影象中。
ImageFilter.MedianFilter(size)中值濾波器,從 size 引數指定的區域中選擇中值畫素值,然後將其儲存至輸出影象中。
ImageFilter.MaxFilter(size)最大值濾波器
ImageFilter.ModeFilter()模式濾波

2.2 使用語法

語法:

im_ft = im.filter(filt_mode) # 返回影象物件,裡面傳入濾波器

範例:

from PIL import Image, ImageFilter

im = Image.open(r"D:35005PicturesScreenshots微信圖片_20220302175157.jpg")
im_ft = im.filter(ImageFilter.EMBOSS) # 新增浮雕濾波器
im_ft.show()

相當於PS裡面新增的濾鏡

四、 ImageColor

1、 簡介

Pillow 提供了顏色處理模組 ImageColor,該模組支援不同格式的顏色,比如 RGB 格式的顏色三元組、十六進位制的顏色名稱(#ff0000)以及顏色英文單詞("red")。同時,它還可以將 CSS(層疊樣式表,用來修飾網頁)風格的顏色轉換為 RGB 格式

在 ImageColor 模組對顏色的大小寫並不敏感,比如 "Red" 也可以寫為 " red"

2、 顏色處理

2.1 顏色命名

ImageColor 支援多種顏色模式的的命名(即使用固定的格式對顏值進行表示),比如我們熟知的 RGB 色彩模式,除此之外,還有 HSL (色調-飽和度-明度)、HSB (又稱 HSV,色調-飽和度-亮度)色彩模式。下面對 HSL 做簡單介紹:

  • H:即 Hue 色調,取值範圍 0 -360,其中 0 表示“red”,120 表示 “green”,240 表示“blue”
  • S:即 Saturation 飽和度,代表色彩的純度,取值 0~100%,其中 0 代表灰色(gry),100% 表示色光最飽和
  • L:即 Lightness 明度,取值為 0~100%,其中 0 表示“black”黑色,50% 表示正常顏色,100% 則表示白色

亮度和明度的表達方式類似,連結中有具體描述:【https://www.zhihu.com/question/22077462】

ImageColor 模組比較簡單,只提供了兩個常用方法,分別是 getrgb() 和 getcolor() 函數

2.2 getrgb

語法:

rgb = PIL.ImageColor.getrgb(color) # 得到顏色的 rgb 數值

color引數即可以是英文,也可以是HSL和HSB模式2.3

應用:

from PIL import Image, ImageColor

im = Image.new(mode="RGB", size=(100, 100), color=ImageColor.getrgb('HSL(0,100%,50%)'))
im.show()

2.3 getcolor

語法:

val = PIL.ImageColor.getcolor(color, mode)

引數:

  • color:一個顏色名稱,字串格式,可以是顏色的英文單詞,或者十六進位制顏色名。如果是不支援的顏色,會報 ValueError 錯誤
  • mode:指定色彩模式,如果是不支援的模式,會報 KeyError 錯誤

五、 ImageFont

1、 簡介

ImageFont模組定義了相同名稱的類,即ImageFont類。這個類的範例儲存bitmap字型,用於ImageDraw類的text()方法

PIL使用自己的字型檔案格式儲存bitmap字型。使用者可以使用pilfont工具包將BDF和PCF字型描述器(Xwindow字型格式)轉換為這種格式

2、 模組函數

2.1 load

語法:

ft = PIL.ImageFont.load(font_file)

從指定的檔案中載入一種字型 ,返回字型物件

2.2 load_path

語法:

ft = PIL.ImageFont.load_path(font_file)

和函數load()一樣,但是如果沒有指定當前路徑的話,會從sys.path開始查詢指定的字型檔案

2.3 truetype

語法:

ft = PIL.ImageFont.truetype(file, size[, encoding=None])

引數:

  • file: 載入一個TrueType或者OpenType字型檔案
  • size: 為指定大小的字型建立了字型物件
  • encoding:字型編碼,主要字型編碼有: “unic”(Unicode),“symb”(Microsoft Symbol),“ADOB”(Adobe Standard),“ADBE”(Adobe Expert)和“armn”(Apple Roman)

2.4 load_default

語法:

ft = PIL.ImageFont.load_default()

載入一個預設字型,返回一個字型物件

3、 模組方法

3.1 getsize

語法:

size = ft.getsize(text)

返回給定文字的寬度和高度,返回值為2元組

3.2 getmask

語法:

obj = ft.getmask(text,mode=None) # 為給定的文字返回一個點陣圖。這個點陣圖是PIL內部儲存記憶體的範例

引數:

  • text :要渲染的文字。
  • mode:某些圖形驅動程式使用它來指示驅動程式喜歡哪種模式;如果為空,渲染器可能返回任一模式。請注意,模式始終是字串

六、 ImageDraw

1、 簡介

1.1 匯入

ImageDraw 模組也是 Pillow 庫的主要模組之一,它能給影象化圓弧,畫橫線,寫上文字等

匯入:

from PIL import ImageDraw

範例化物件:

from PIL import Image, ImageDraw

im = Image.open("./a.jpg") # 建立 image 物件
draw = ImageDraw.Draw(im) # 範例化可以在指定影象上畫圖的 Draw 物件

1.2 基本概念

  • Coordinates

    • 繪圖介面使用和PIL一樣的座標系統,即(0,0)為左上角。
  • Colours

    • 為了指定顏色,使用者可以使用數位或者元組,對應使用者使用函數Image.new或者Image.putpixel。對於模式為“1”,“L”和“I”的影象,使用整數。對於“RGB”影象,使用整陣列成的3元組。對於“F”影象,使用整數或者浮點數。

    • 對於調色盤影象(模式為“P”),使用整數作為顏色索引。在1.1.4及其以後,使用者也可以使用RGB 3元組或者顏色名稱。繪製層將自動分配顏色索引,只要使用者不繪製多於256種顏色。

  • Colours Names

    • 在PIL 1.1.4及其以後的版本,使用者繪製“RGB”影象時,可以使用字串常數。PIL支援如下字串格式:

      • A、 十六進位制顏色說明符,定義為“#rgb”或者“#rrggbb”。例如,“#ff0000”表示純紅色。

      • B、 RGB函數,定義為“rgb(red, green, blue)”,變數red、green、blue的取值為[0,255]之間的整數。另外,顏色值也可以為[0%,100%]之間的三個百分比。例如,“rgb(255, 0, 0)”和“rgb(100%, 0%, 0%)”都表示純紅色。

      • C、 HSL(Hue-Saturation-Lightness)函數,定義為“hsl(hue,saturation%, lightness%)”,變數hue為[0,360]一個角度表示顏色(red=0, green=120, blue=240),變數saturation為[0%,100%]之間的一個值(gray=0%,full color=100%),變數lightness為[0%,100%]之間的一個值(black=0%, normal=50%, white=100%)。例如,“hsl(0,100%, 50%)”為純紅色。

      • D、 通用HTML顏色名稱,ImageDraw模組提供了140個標準顏色名稱,Xwindow系統和大多數web瀏覽器都支援這些顏色。顏色名稱對大小寫不敏感。例如,“red”和“Red”都表示純紅色。

  • Fonts

    • PIL可以使用bitmap字型或者OpenType/TrueType字型

2、 模組函數

2.1 arc

語法:

draw.arc(xy, start, end, options)

在給定的區域內,在開始和結束角度之間繪製一條弧

options:可以有什麼內容可以在原始碼中檢視

2.2 bitmap

語法:

draw.bitmap(xy, bitmap, options) # options中可以新增 fill 覆蓋的顏色

在給定的區域裡繪製變數bitmap所對應的點陣圖,非零部分使用變數options中fill的值來填充。變數bitmap點陣圖應該是一個有效的透明模板(模式為“1”)或者蒙版(模式為“L”或者“RGBA”)

變數xy是變數bitmap對應點陣圖起始的座標值,而不是一個區域

這個方法與Image.paste(xy, color, bitmap)有相同的功能

2.3 chord

語法:

draw.chord(xy, start, end, options) 

和方法arc()一樣,但是使用直線連線起始點

變數 options 的 outline 給定弦輪廓的顏色;fill 給定弦內部的顏色

2,4 ellipse

語法:

draw.ellipse(xy, options)

在給定的區域繪製一個橢圓形

變數 options 的 outline 給定弦輪廓的顏色;fill 給定弦內部的顏色

2.5 line

語法:

draw.line(xy, options)

在變數xy列表所表示的座標之間畫線

xy裡面至少有兩個座標,座標使用元組表示,儲存在一個列表裡面[(x1, y1), (x2, y2)]

width指定寬度,fill 指定線的顏色

2.6 pieslice

語法:

draw.pieslice(xy, start, end, options)

和方法arc()一樣,但是在指定區域內結束點和中心點之間繪製直線

2.7 point

語法:

draw.point(xy, options)

在指定位置畫一個只佔一個畫素的小點

2.8 polygon

語法:

draw.polygon(xy, options)

繪製一個多邊形

多邊形輪廓由給定座標之間的直線組成,在最後一個座標和第一個座標間增加了一條直線,形成多邊形

座標列表是包含2元組[(x,y),…]或者數位[x,y,…]的任何序列物件,它最少包括3個座標值

變數options的fill給定多邊形內部的顏色

2.9 rectangle

語法:

draw.rectangle(xy, options)

繪製一個長邊形

變數xy是包含2元組[(x,y),…]或者數位[x,y,…]的任何序列物件,它應該包括2個座標值

注意:當長方形沒有沒有被填充時,第二個座標對定義了一個長方形外面的點

變數options的fill給定長邊形內部的顏色

2.10 text

語法:

draw.text(xy, string, options)

在給定的位置繪製一個字串。變數xy給出了文字的左上角的位置

變數option的 font 用於指定所用字型。它應該是類ImangFont的一個範例,使用ImageFont模組的load()方法從檔案中載入的

變數options的fill給定文字的顏色

2.11 textsize

語法:

draw.textsize(string, options)

返回給定字串的大小,以畫素為單位

變數option的 font 用於指定所用字型。它應該是類ImangFont的一個範例,使用ImageFont模組的load()方法從檔案中載入的

七、 Image與Numpy

from PIL import Image
import numpy as np

im = Image.open("./a.jpg")
print(np.asarray(im)) # 三維陣列
na = np.asarray(im) # 將圖片轉換為陣列
na[0][0][0] = 0 # 修改陣列的值
im_new = Image.fromarray(na) # 將陣列轉換為圖片

更多關於Python影象處理庫PIL的詳細使用技術請檢視下面的相關連結


IT145.com E-mail:sddin#qq.com