您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python圖像處理庫PIL如何使用”,在日常操作中,相信很多人在Python圖像處理庫PIL如何使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python圖像處理庫PIL如何使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Pillow 是 Python 中較為基礎的圖像處理庫,主要用于圖像的基本處理,比如裁剪圖像、調整圖像大小和圖像顏色處理等。與 Pillow 相比,OpenCV 和 Scikit-image 的功能更為豐富,所以使用起來也更為復雜,主要應用于機器視覺、圖像分析等領域,比如眾所周知的“人臉識別”應用 。
支持格式繁多
Pillow 支持廣泛的圖像格式,比如 "jpeg","png","bmp","gif","ppm","tiff" 等。同時,它也支持圖像格式之間的相互轉換。總之, Pillow 幾乎能夠處理任何格式的圖像
提供豐富的功能
Pillow 提供了豐富的圖像處理功能,可概括為兩個方面:
圖像歸檔,包括創建縮略圖、生成預覽圖像、圖像批量處理等;而圖像處理,則包括調整圖像大小、裁剪圖像、像素點處理、添加濾鏡、圖像顏色處理等
圖像歸檔
圖像處理
配合 GUI 工具使用
pip install pillow 導包 imoprt PIL
導包
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)三元組數字格式、顏色的十六進制值以及顏色英文單詞
mode | 描述 |
---|---|
1 | 1 位像素(取值范圍 0-1),0表示黑,1 表示白,單色通道。 |
L | 8 位像素(取值范圍 0 -255),灰度圖,單色通道。 |
P | 8 位像素,使用調色板映射到任何其他模式,單色通道。 |
RGB | 3 x 8位像素,真彩色,三色通道,每個通道的取值范圍 0-255。 |
RGBA | 4 x 8位像素,真彩色+透明通道,四色通道。 |
CMYK | 4 x 8位像素,四色通道,可以適應于打印圖片。 |
YCbCr | 3 x 8位像素,彩色視頻格式,三色通道。 |
LAB | 3 x 8位像素,L * a * b顏色空間,三色通道 |
HSV | 3 x 8位像素,色相,飽和度,值顏色空間,三色通道。 |
I | 32 位有符號整數像素,單色通道。 |
F | 32 位浮點像素,單色通道。 |
import PIL.Image im = PIL.Image.open(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg") print(im.size) # 查看圖片大小 print(im.readonly) # 查看是否為只讀,1為是,0為否 print(im.format) # 查看圖片的格式 print(im.info) # 查看圖片的相關信息 print(im.mode) # 查看圖片的模式
save 方法用于保存 圖像,當不指定文件格式時,它會以默認的圖片格式來存儲;如果指定圖片格式,則會以指定的格式存儲圖片
語法:
im = PIL.Image.open(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg") im.save(fp, format=None) # 保存圖片
參數說明如下:
fp:圖片的存儲路徑,包含圖片的名稱,字符串格式
format:可選參數,可以指定圖片的格式
注意,并非所有的圖片格式都可以用 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:其他可選參數
在圖像處理過程中經常會遇到縮小或放大圖像的情況,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
縮略圖指的是將原圖縮小至一個指定大小(size)的圖像。通過創建縮略圖可以使圖像更易于展示和瀏覽
Image 對象提供了一個 thumbnail() 方法用來生圖像的縮略圖,等比縮放
語法:
im.thumbnail(size,resample) # 直接在原圖的基礎上修改 im.show() # 縮放后的圖片
參數:
size:元組參數,指的是縮小后的圖像大小
resample:可選參數,指圖像重采樣濾波器,有四種過濾方式,分別是 Image.BICUBIC(雙立方插值法)、PIL.Image.NEAREST(最近鄰插值法)、PIL.Image.BILINEAR(雙線性插值法)、PIL.Image.LANCZOS(下采樣過濾插值法),默認為 Image.BICUBIC
圖像(指數字圖像)由許多像素點組成,像素是組成圖像的基本單位,而每一個像素點又可以使用不同的顏色,最終呈現出了絢麗多彩的圖像 ,而圖像的分離與合并,指的就是圖像顏色的分離和合并
im = PIL.Image.open(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg") r, g, b = im.split() # split 方法使用較簡單,分離通道 r.show() g.show() b.show()
Image 類提供的 merge() 方法可以實現圖像的合并操作。注意,圖像合并,可以是單個圖像合并,也可以合并兩個以上的圖像
im_merge = PIL.Image.merge(mode, bands) im_merge.show()
參數:
mode:指定輸出圖片的模式
bands:參數類型為元組或者列表序列,其元素值是組成圖像的顏色通道,比如 RGB 分別代表三種顏色通道,可以表示為 (r, g, b)
Image 類也提供了 blend() 方法來混合 RGBA 模式的圖片(PNG 格式)
語法:
PIL.Image.blend(image1,image2, alpha)
參數:
image1:圖片對象1
image2:圖片對象2
alpha:透明度 ,取值范圍為 0 到 1,當取值為 0 時,輸出圖像相當于 image1 的拷貝,而取值為 1 時,則是 image2 的拷貝,只有當取值為 0.5 時,才為兩個圖像的中合。因此改值的大小決定了兩個圖像的混合程度
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 軸,每個像素點代表一個單位
拷貝、粘貼操作幾乎是成對出現的,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:\35005\Pictures\Screenshots\微信圖片_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()
圖像的幾何變換主要包括圖像翻轉、圖像旋轉和圖像變換操作,Image 類提供了處理這些操作的函數 transpose()、rotate() 和 transform()
該函數可以實現圖像的垂直、水平翻轉
語法:
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:圖像橫向翻轉
當我們想把圖像旋轉任意角度時,可以使用 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:可選參數,填充顏色,圖像旋轉后,對圖像之外的區域進行填充
該函數能夠對圖像進行變換操作,通過指定的變換方式,產生一張規定大小的新圖像
語法:
im_out = im.transform(size, method, data=None, resample=0) # 返回圖像對象
參數:
size:指定新圖片的大小
method:指定圖片的變化方式,比如 Image.EXTENT 表示矩形變換
data:該參數用來給變換方式提供所需數據
resample:圖像重采樣濾波器,默認參數值為 PIL.Image.NEAREST
隨著數字圖像技術的不斷發展,圖像降噪方法也日趨成熟,通過某些算法來構造濾波器是圖像降噪的主要方式。濾波器能夠有效抑制噪聲的產生,并且不影響被處理圖像的形狀、大小以及原有的拓撲結構
Pillow 通過 ImageFilter 類達到圖像降噪的目的,該類中集成了不同種類的濾波器,通過調用它們從而實現圖像的平滑、銳化、邊界增強等圖像降噪操作
名稱 | 說明 |
---|---|
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() | 模式濾波 |
語法:
im_ft = im.filter(filt_mode) # 返回圖像對象,里面傳入濾波器
實例:
from PIL import Image, ImageFilter im = Image.open(r"D:\35005\Pictures\Screenshots\微信圖片_20220302175157.jpg") im_ft = im.filter(ImageFilter.EMBOSS) # 添加浮雕濾波器 im_ft.show()
相當于PS里面添加的濾鏡
Pillow 提供了顏色處理模塊 ImageColor,該模塊支持不同格式的顏色,比如 RGB 格式的顏色三元組、十六進制的顏色名稱(#ff0000)以及顏色英文單詞("red")。同時,它還可以將 CSS(層疊樣式表,用來修飾網頁)風格的顏色轉換為 RGB 格式
在 ImageColor 模塊對顏色的大小寫并不敏感,比如 "Red" 也可以寫為 " red"
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() 函數
語法:
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()
語法:
val = PIL.ImageColor.getcolor(color, mode)
參數:
color:一個顏色名稱,字符串格式,可以是顏色的英文單詞,或者十六進制顏色名。如果是不支持的顏色,會報 ValueError 錯誤
mode:指定色彩模式,如果是不支持的模式,會報 KeyError 錯誤
ImageFont模塊定義了相同名稱的類,即ImageFont類。這個類的實例存儲bitmap字體,用于ImageDraw類的text()方法
PIL使用自己的字體文件格式存儲bitmap字體。用戶可以使用pilfont工具包將BDF和PCF字體描述器(Xwindow字體格式)轉換為這種格式
語法:
ft = PIL.ImageFont.load(font_file)
從指定的文件中加載一種字體 ,返回字體對象
語法:
ft = PIL.ImageFont.load_path(font_file)
和函數load()一樣,但是如果沒有指定當前路徑的話,會從sys.path開始查找指定的字體文件
語法:
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)
語法:
ft = PIL.ImageFont.load_default()
加載一個默認字體,返回一個字體對象
語法:
size = ft.getsize(text)
返回給定文本的寬度和高度,返回值為2元組
語法:
obj = ft.getmask(text,mode=None) # 為給定的文本返回一個位圖。這個位圖是PIL內部存儲內存的實例
參數:
text :要渲染的文本。
mode:某些圖形驅動程序使用它來指示驅動程序喜歡哪種模式;如果為空,渲染器可能返回任一模式。請注意,模式始終是字符串
ImageDraw 模塊也是 Pillow 庫的主要模塊之一,它能給圖像化圓弧,畫橫線,寫上文字等
導入:
from PIL import ImageDraw
實例化對象:
from PIL import Image, ImageDraw im = Image.open("./a.jpg") # 創建 image 對象 draw = ImageDraw.Draw(im) # 實例化可以在指定圖像上畫圖的 Draw 對象
Coordinates
繪圖接口使用和PIL一樣的坐標系統,即(0,0)為左上角。
Colours
為了指定顏色,用戶可以使用數字或者元組,對應用戶使用函數Image.new或者Image.putpixel。對于模式為“1”,“L”和“I”的圖像,使用整數。對于“RGB”圖像,使用整數組成的3元組。對于“F”圖像,使用整數或者浮點數。
對于調色板圖像(模式為“P”),使用整數作為顏色索引。在1.1.4及其以后,用戶也可以使用RGB 3元組或者顏色名稱。繪制層將自動分配顏色索引,只要用戶不繪制多于256種顏色。
Colours Names
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”都表示純紅色。
在PIL 1.1.4及其以后的版本,用戶繪制“RGB”圖像時,可以使用字符串常量。PIL支持如下字符串格式:
Fonts
PIL可以使用bitmap字體或者OpenType/TrueType字體
語法:
draw.arc(xy, start, end, options)
在給定的區域內,在開始和結束角度之間繪制一條弧
options:可以有什么內容可以在源代碼中查看
語法:
draw.bitmap(xy, bitmap, options) # options中可以添加 fill 覆蓋的顏色
在給定的區域里繪制變量bitmap所對應的位圖,非零部分使用變量options中fill的值來填充。變量bitmap位圖應該是一個有效的透明模板(模式為“1”)或者蒙版(模式為“L”或者“RGBA”)
變量xy是變量bitmap對應位圖起始的坐標值,而不是一個區域
這個方法與Image.paste(xy, color, bitmap)有相同的功能
語法:
draw.chord(xy, start, end, options)
和方法arc()一樣,但是使用直線連接起始點
變量 options 的 outline 給定弦輪廓的顏色;fill 給定弦內部的顏色
語法:
draw.ellipse(xy, options)
在給定的區域繪制一個橢圓形
變量 options 的 outline 給定弦輪廓的顏色;fill 給定弦內部的顏色
語法:
draw.line(xy, options)
在變量xy列表所表示的坐標之間畫線
xy里面至少有兩個坐標,坐標使用元組表示,存儲在一個列表里面[(x1, y1), (x2, y2)]
width指定寬度,fill 指定線的顏色
語法:
draw.pieslice(xy, start, end, options)
和方法arc()一樣,但是在指定區域內結束點和中心點之間繪制直線
語法:
draw.point(xy, options)
在指定位置畫一個只占一個像素的小點
語法:
draw.polygon(xy, options)
繪制一個多邊形
多邊形輪廓由給定坐標之間的直線組成,在最后一個坐標和第一個坐標間增加了一條直線,形成多邊形
坐標列表是包含2元組[(x,y),…]或者數字[x,y,…]的任何序列對象,它最少包括3個坐標值
變量options的fill給定多邊形內部的顏色
語法:
draw.rectangle(xy, options)
繪制一個長邊形
變量xy是包含2元組[(x,y),…]或者數字[x,y,…]的任何序列對象,它應該包括2個坐標值
注意:當長方形沒有沒有被填充時,第二個坐標對定義了一個長方形外面的點
變量options的fill給定長邊形內部的顏色
語法:
draw.text(xy, string, options)
在給定的位置繪制一個字符串。變量xy給出了文本的左上角的位置
變量option的 font 用于指定所用字體。它應該是類ImangFont的一個實例,使用ImageFont模塊的load()方法從文件中加載的
變量options的fill給定文本的顏色
語法:
draw.textsize(string, options)
返回給定字符串的大小,以像素為單位
變量option的 font 用于指定所用字體。它應該是類ImangFont的一個實例,使用ImageFont模塊的load()方法從文件中加載的
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如何使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。