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色彩空間,三色通道 |
3 x 8位元像素,色相,飽和度,值色彩空間,三色通道。 | |
32 位元有符號整數像素,單色通道。 | |
32 位元浮點像素,單一色通道。 |
#name | ##說明|
---|---|
##ImageFilter.BLUR | 模糊濾波,即平均值濾波 |
ImageFilter.CONTOUR | ##輪廓濾波,尋找影像輪廓資訊 |
ImageFilter.DETAIL | 細節濾波,讓影像顯示更精細 |
ImageFilter.FIND_EDGES | 尋找邊界濾波(找出影像的邊界資訊) |
ImageFilter.EMBOSS | 浮雕濾波,以浮雕圖的形式顯示影像 |
ImageFilter.EDGE_ENHANCE | 邊界增強濾波 |
#ImageFilter.EDGE_ENHANCE_MORE | ##深度邊緣增強濾波|
平滑濾波 | |
##深度平滑濾波 | |
銳利化濾波 | |
高斯模糊 | |
反銳利化遮罩濾波 | |
卷積核濾波 |
语法:
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怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!