北京网站设计培训,手机网站主页推荐,公司要搭建网站,那种类型的网站可以自己做也可以赚钱文章目录 Opencv、Matplotlib(plt)、Pillow(PIL)、Pytorch读取数据的通道顺序Python图像处理库#xff08;PIL、Pillow、Scikit-image、Opencv#xff09;Pillow 官方文档#xff08;超详细#xff0c;超推荐#xff09;一、PIL库与Pillow库的区别二、Pillow库#xff08… 文章目录 Opencv、Matplotlib(plt)、Pillow(PIL)、Pytorch读取数据的通道顺序Python图像处理库PIL、Pillow、Scikit-image、OpencvPillow 官方文档超详细超推荐一、PIL库与Pillow库的区别二、Pillow库1Pillow库特点2Pillow库安装 三、Pillow的Image对象PIL.Image1打开图像Image.open() —— 可以加载任意图像格式2自建图像Image.new()3查看Image对象的属性 —— width height size format randonly info mode4保存图像Image.save() —— 保存的同时可以改变格式5图像模式转换im.convert() —— 不同格式之间的转换6图像缩放im.resize() —— 整体缩放 局部放大指定区域7图像的缩略图im.thumbnail() —— 只能在原图上修改返回None8图像通道分离im.split() —— r/g/b三通道9图像通道合并Image.merge() —— 颜色通道合并 图像融合权重值五五开10混合图像Image.blend() —— 将两张图像叠加在一起并可以选择其中一张图像的透明度取值范围[0, 1]。11 图像裁剪im.crop() —— 获取指定区域12 图像拷贝im.copy() —— 深拷贝13 图像粘贴im.paste() —— 可以将两张图叠加在一起14 图像几何变换翻转im.transpose()15 图像几何变换旋转im.rotate()16 图像几何变换形状变换im.transform()17 图像降噪处理ImageFilter —— 集成多种滤波器17种18 图像像素增强ImageEnhance —— 对选择的属性增强N倍颜色平衡、对比度、亮度、锐度19 绘制图形ImageDraw.Draw() —— 添加文字 绘制点、直线、矩形、多边形、椭圆、圆弧、弦、饼图20获取 RGB 值ImageColor.getrgb()21获取颜色值ImageColor.getcolor()22ndarray数组与图像之间的相互转换np.array Image.fromarray23读取序列图像 seek() tell() 、ImageSequence()应用一批量修改图像尺寸应用二图像添加水印ImageDraw ImageFont应用三生成GIF动态图 Opencv、Matplotlib(plt)、Pillow(PIL)、Pytorch读取数据的通道顺序
需注意Pillow加载图像后的尺寸是二维图形化是三维但无法打印三维尺寸。 详细区别 Opencvuint8的ndarray数据通道顺序[h, w, c]颜色通道BGR。 导入模块import cv2 1cv2.imread() 2cv2.imshow() 3cv2.cvtColor(image, cv2.COLOR_BGR2RGB) Matplotlib(plt)uint8的ndarray数据通道顺序[h, w, c]颜色通道RGB。 导入模块import matplotlib.pyplot as plt 1plt.imread() 2plt.imshow() Pillow(PIL)uint8的ndarray数据通道顺序[h, w, c]颜色通道RGB。 导入模块import PIL 1PIL.Image.open() 2PIL.Image.show() Pythorchtensor数据通道顺序[n, c, h, w]颜色通道RGB。 导入模块import torchvision 1torchvision.transforms.ToTensor() 2torchvision.transforms.ToPILImage() Python图像处理库PIL、Pillow、Scikit-image、Opencv
图像指数字图像由许多像素点组成像素是组成图像的基本单位而每一个像素点又可以使用不同的颜色最终呈现出了绚丽多彩的图像。 1PIL是一个免费开源的Python图像处理库。而Pillow是基于PIL库的一个派生分支它在 PIL 库的基础上增加了许多新的特性。 特点PIL、Pillow只提供最基础的数字图像处理**功能有限。 2Scikit-image基于 scipy 科学计算的python图像处理软件包由 scipy 社区开发和维护以数组的形式对图像进行处理。 特点轻量易安装易使用轻量级 3Opencv由 C/C 语言编写的图像处理库同时提供Python、Ruby、MATLAB等语言的接口。图像处理界中的绝对大佬 特点环境难搭建重量型集成功能较多 Pillow 官方文档超详细超推荐
Pillow 官方文档https://pillow.readthedocs.io/en/stable/index.html 一、PIL库与Pillow库的区别
PILPython Imaging Library是一个免费开源的Python图像处理库其功能丰富API 简洁易用一度深受好评。 发展历程 2011年PIL官网宣布不再更新PIL其最新版本仅支持 Python 2.7而不支持 Python3。于是一群 Python 社区的志愿者主要贡献者Alex Clark 和 Contributors在 PIL 库的基础上开发了一个支持 Python3 版本的图像处理库它就是 Pillow。目前已成为Linux发行版中原始PIL的替代品。 二、Pillow库
Pillow是基于PIL库的一个派生分支它在 PIL 库的基础上增加了许多新的特性。发展至今已经成为比PIL本身更具活力的图像处理库。
Pillow 安装后导入库的使用方式仍是import PIL但实际上使用的是 Pillow 库这里的 PIL 可以看做是 Pillow 库的简称。Pillow 支持跨平台运行比如 Windows、Linux、MacOS 等。Pillow支持python3Pillow官网最新版Pillow 8.4.0。
1Pillow库特点 1 支持图像的多种输入格式jpeg、png、bmp、gif、ppm、tiff 等。且支持图像格式之间的相互转换。 2支持多种图像操作 11、创建缩略图、生成预览图像、图像批量处理等22、图像裁剪、图像缩放、像素点处理、添加滤镜、图像颜色处理等。33、添加水印、合成 GIF 动态效果图等等。 3可以配合 Python GUI图形用户界面工具 Tkinter 一起使用。 2Pillow库安装 备注Pillow 和 PIL 不能共存于同一个环境中在安装 Pillow 前需要先卸载 PIL。 1pip安装该方法是最简单、轻量级的一种安装方式并且适用于任何平台。只需执行pip install Pillow。 2whl轮子安装 通过Python PyPi第三方库官网下载与平台系统相对应的版本。下载完成后进入下载文件的所在位置然后执行pip install whl文件名。 3Anaconda安装 Anaconda 是一款开源的 Python 发行版官网下载地址是当下较为流行的科学计算平台支持 Windows、Linux、MacOS 系统。Anaconda 自带许多已经安装完成软件包其中就包含 Pillow因此无须重新安装。但默认安装的 Pillow 版本可能会比较低或不是你需要的版本。 验证是否安装成功 0WIN键R键打开运行输入cmd回车进入命令提示符。 1输入python打开 Python 解释器交互环境 2输入import PIL如果解释器没有报错则安装成功 三、Pillow的Image对象PIL.Image
Image 类是 Pillow 库中最为重要的类该类被定义在和与其同名的 Image 模块中。
导入 Image 模块from PIL import Image。使用 Image 类可以实例化 Image 对象通过调用该对象的属性和方法对图像进行处理。Pillow 提供了两种创建 Image 实例对象的方法open()、new()。
1打开图像Image.open() —— 可以加载任意图像格式 函数说明 im Image.open(fp, mode r)
参数说明1fp(file_path)文件路径 字符串格式2mode可选参数。若使用则必须设置moder否则显示ValueError异常。
from PIL import Image
im_open Image.open(C:/Users/pc/Desktop/1.png) # 打开图像
im_open.show() # 显示图像2自建图像Image.new() 函数说明 im Image.new(mode, size, color)
参数说明1mode指定图像模式字符串格式。如 RGB真彩图像、L灰度图像、CMYK色彩图打印模式等2size指定图像大小width, height。3color图像颜色默认0表示黑色。参数值支持 [R,G,B] 三元组数字格式、颜色的十六进制值以及颜色英文单词。
from PIL import Image
im_new Image.new(modeRGB, size(260, 100), color#ff0000) # 使用颜色的十六进制格式
im_new.show() # 显示图像3查看Image对象的属性 —— width height size format randonly info mode
from PIL import Image
im Image.open(C:/Users/pc/Desktop/1.png)
print(打印image对象:, im)
print(图像的宽%s, 高%s %(im.width, im.height)) # width/height查看图像的宽/高
print(图像的尺寸:, im.size) # size查看图像的尺寸
print(图像的格式:, im.format) # format查看图片的格式
print(图像是否为只读:, im.readonly) # readonly图片是否为只读
print(图像信息:, im.info) # info查看图片相关信息。包括每英寸像素点大小和截图软件信息
print(图像模式:, im.mode) # mode图像模式
打印image对象PIL.PngImagePlugin.PngImageFile image modeRGB size1810x228 at 0x17426DA3610
图像的宽1810, 高228
图像的尺寸(1810, 228)
图像的格式PNG
图像是否为可读1
图像信息{}
图像模式PGB4保存图像Image.save() —— 保存的同时可以改变格式 函数说明 Image.save(fp, formatNone)
参数说明1fp图像的存储路径包含图像的名称后缀字符串格式2format可选参数指定图像保存的格式。若不指定文件格式则以默认的图片格式来存储。
from PIL import Image
im Image.open(C:/Users/pc/Desktop/1.png) # 打开图像
im.save(C:/Users/pc/Desktop/2.bmp) # 保存图像并非所有的图片格式都可以用 save() 方法转换完成比如将 PNG 格式的图片四通道 RGBA 模式保存为 JPG 格式三通道 RGB 模式。保存之前需要进行图像模型转换。
5图像模式转换im.convert() —— 不同格式之间的转换
常用的图像模式如下 函数说明 im.convert(mode, parms**)
参数说明1mode指的是要转换成的图像模式2parms其他可选参数。如matrix、dither 等。其中最关键的参数是 mode其余参数无须关心。from PIL import Image
import matplotlib.pyplot as pltim Image.open(大黄蜂.jpg)
print(im.mode) # RGB
im1 im.convert(1)
im2 im.convert(L)
im3 im.convert(P)
im4 im.convert(RGB)
im5 im.convert(RGBA)
im6 im.convert(CMYK)
im7 im.convert(YCbCr)
# im8 im.convert(LAB) # ValueError: conversion from RGB to LAB not supported
im9 im.convert(HSV)
im10 im.convert(I)
im11 im.convert(F)
######################################################################
# 绘图
im_list [im, im1, im2, im3, im4, im5, im6, im7, im9, im10, im11]
for i, j in enumerate(im_list):plt.subplot(3, 4, i1)plt.title([raw, 1, L, P, RGB, RGBA, CMYK, YCbCr, HSV, I, F][i])plt.axis(off)plt.imshow(j)
plt.show()
plt.subplot(3,4,1), plt.imshow(im), plt.title(raw), plt.axis(off)
plt.subplot(3,4,2), plt.imshow(im1), plt.title(1), plt.axis(off)
plt.subplot(3,4,3), plt.imshow(im2), plt.title(L), plt.axis(off)
plt.subplot(3,4,4), plt.imshow(im3), plt.title(P), plt.axis(off)
plt.subplot(3,4,5), plt.imshow(im4), plt.title(RGB), plt.axis(off)
plt.subplot(3,4,6), plt.imshow(im5), plt.title(RGBA), plt.axis(off)
plt.subplot(3,4,7), plt.imshow(im6), plt.title(CMYK), plt.axis(off)
plt.subplot(3,4,8), plt.imshow(im7), plt.title(YCbCr), plt.axis(off)
# plt.subplot(3,4,9), plt.imshow(im8), plt.title(LAB), plt.axis(off)
plt.subplot(3,4,10), plt.imshow(im9), plt.title(HSV), plt.axis(off)
plt.subplot(3,4,11), plt.imshow(im10), plt.title(I), plt.axis(off)
plt.subplot(3,4,12), plt.imshow(im11), plt.title(F), plt.axis(off)
plt.show()6图像缩放im.resize() —— 整体缩放 局部放大指定区域
整体缩放操作 函数说明 resize(size, resampleimage.BICUBIC, boxNone, reducing_gapNone)
参数说明1size元组参数 (width,height)图片缩放后的尺寸2resample可选参数指图像重采样滤波器与 thumbnail() 的 resample 参数类似默认为 Image.BICUBIC3box可选参数对指定区域进行缩放默认对整个原图进行缩放。备注1指定区域必须在原图范围内若超出范围则报错。每个像素点代表一个单位。备注2box 的参数值是长度为 4 的像素坐标元组即 (x_左上, y_左下, x1_右上, y1_右下)分别表示被裁剪矩形区域的左上角x, y和右下角x, y。例如(0,0,120,180)表示以原图的左上角为原点选择宽和高分别是(120,180)的图像区域。4reducing_gap可选参数浮点参数值用于优化图片的缩放效果常用参数值有 3.0 和 5.0。
from PIL import Image
import matplotlib.pyplot as pltim Image.new(modeRGB, size(260, 100), color#ff0000) # 使用颜色的十六进制格式
im1 im.resize((550, 260)) # 放大图像
im2 im.resize((80, 50)) # 缩小图像
######################################################################
# 绘图
im_list [im, im1, im2]
for i, j in enumerate(im_list):plt.subplot(1, 3, i1)plt.title([raw, Enlarge image, Reduced image][i])plt.imshow(j)
plt.show()
局部放大操作
from PIL import Image
im Image.open(大黄蜂.jpg)
try:image im.resize((550, 260), resampleImage.LANCZOS, box(0, 0, 120, 180))print(查看新图像的尺寸, image.size)image.show()
except IOError:print(操作有误)
7图像的缩略图im.thumbnail() —— 只能在原图上修改返回None 函数说明 thumbnail(size, resample)
参数说明1size元组参数指的是缩小后的图像大小2resample可选参数默认为 Image.BICUBIC。备注有四种图像重采样滤波器分别是 Image.BICUBIC双立方插值法、PIL.Image.NEAREST最近邻插值法、PIL.Image.BILINEAR双线性插值法、PIL.Image.LANCZOS下采样过滤插值法。
from PIL import Image
im Image.open(C:/Users/pc/Desktop/1.png)
im.thumbnail((150, 50))注意缩略图的尺寸与您指定的尺寸可能会出现不一致的情况。
因为 Pillow 会对原图像的长、宽进行等比例缩小当指定的尺寸不符合图像的尺寸规格时缩略图就会创建失败。比如指定的尺寸超出了原图像的尺寸规格。
8图像通道分离im.split() —— r/g/b三通道 from PIL import Image
import matplotlib.pyplot as pltim Image.open(C:/Users/pc/Desktop/1.jpg)
r, g, b im.split() # 分离颜色通道产生三个Image对象plt.subplot(131), plt.imshow(im), plt.title(im), plt.axis(off)
plt.subplot(132), plt.imshow(r), plt.title(r), plt.axis(off)
plt.subplot(133), plt.imshow(g), plt.title(g), plt.axis(off)
plt.subplot(133), plt.imshow(b), plt.title(b), plt.axis(off)
plt.show()# r.show()
# g.show()
# b.show()9图像通道合并Image.merge() —— 颜色通道合并 图像融合权重值五五开
颜色通道合并 函数说明 Image.merge(mode, bands)
参数说明1mode指定输出图像的模式2bands参数类型为元组或者列表序列其元素值是组成图像的颜色通道比如 RGB 分别代表三种颜色通道(r,g,b)。备注要求两张图片的模式、大小必须一致否则不能合并。from PIL import Image
import matplotlib.pyplot as pltim Image.open(starry_night.jpg)
r, g, b im.split() # 分离颜色通道产生三个 Image 对象
im1 Image.merge(RGB, (r, g, b)) # 重新组合颜色通道返回 Image 对象
im2 Image.merge(RGB, (r, b, g))
im3 Image.merge(RGB, (g, r, b))
im4 Image.merge(RGB, (g, b, r))
im5 Image.merge(RGB, (b, r, g))
im6 Image.merge(RGB, (b, g, r))plt.subplot(231), plt.imshow(im1), plt.title(rgb), plt.axis(off)
plt.subplot(232), plt.imshow(im2), plt.title(rbg), plt.axis(off)
plt.subplot(233), plt.imshow(im3), plt.title(grb), plt.axis(off)
plt.subplot(234), plt.imshow(im4), plt.title(gbr), plt.axis(off)
plt.subplot(235), plt.imshow(im5), plt.title(brg), plt.axis(off)
plt.subplot(236), plt.imshow(im6), plt.title(bgr), plt.axis(off)
plt.show()图像融合每张图像的权重值都是50% from PIL import Image
im_1 Image.open(starry_night.jpg)
im_2 Image.open(大黄蜂.jpg)# 因为两种图片的图片格式一致所以仅需要处理图片的大小让它们保持一致
im_2 im_2.resize(im_1.size)
r1, g1, b1 im_1.split()
r2, g2, b2 im_2.split()
im_3 Image.merge(RGB, [r2, g2, b1])
im_3.show()10混合图像Image.blend() —— 将两张图像叠加在一起并可以选择其中一张图像的透明度取值范围[0, 1]。 函数说明 Image.blend(image1, image2, alpha)
参数说明1image1image2表示两个 Image 对象。2alpha表示透明度取值范围为 0 到 1。11当取值为 0 时等同于 image1 的拷贝。22而取值为 1 时等同于 image2 的拷贝。33当取值为 0.5 时与Image.merge()效果等同。备注要求两张图片的模式、大小必须一致否则不能合并。
from PIL import Imageim_1 Image.open(starry_night.jpg)
im_2 Image.open(大黄蜂.jpg)
im_2 im_2.resize(im_1.size)
im3 Image.blend(im_1, im_2, 0.7)
im3.show()11 图像裁剪im.crop() —— 获取指定区域 函数说明 crop(boxNone)
参数说明 box表示裁剪区域默认为 None表示拷贝原图像。备注box 是一个有四个数字的元组参数 (x_左上, y_左下, x1_右上, y1_右下)分别表示被裁剪矩形区域的左上角x, y和右下角x, y。默认0, 0表示坐标原点宽度的方向为 x 轴高度的方向为 y 轴每个像素点代表一个单位。
from PIL import Imageim Image.open(大黄蜂.jpg)
im2 im.crop((0, 0, 50, 50))
im2.show()12 图像拷贝im.copy() —— 深拷贝 函数说明 copy(image)
参数说明 image拷贝图像
from PIL import Imageim Image.open(大黄蜂.jpg)
im_copy im.copy()
im_copy.show()13 图像粘贴im.paste() —— 可以将两张图叠加在一起 函数说明 im.paste(image, boxNone, maskNone)
参数说明 1image指被粘贴的图像2box指定图像被粘贴的位置或者区域其参数值是长度为 2 或者 4 的元组序列。备注1长度为 2 时表示具体的某一点 (x, y)。备注2长度为 4 时表示具体的粘贴的区域此时区域的大小必须要和被粘贴的图像大小保持一致。3mask可选参数为图片添加蒙版效果。
from PIL import Imageim Image.open(starry_night.jpg)
im1 Image.open(大黄蜂.jpg)
im_copy im1.copy() # 图像拷贝
im_crop im_copy.crop((0, 0, 200, 100)) # 图像裁剪# 创建一个新的图像作为蒙版L模式单颜色值
image_new Image.new(L, (200, 100), 200)
# 将裁剪后的副本粘贴至副本图像上并添加蒙版
im.paste(im_crop, (100, 100, 300, 200), maskimage_new) # 图像粘贴
im.show()14 图像几何变换翻转im.transpose() 函数说明 im.transpose(method)
常见方法 1Image.FLIP_LEFT_RIGHT左右水平翻转2Image.FLIP_TOP_BOTTOM上下垂直翻转3Image.ROTATE_90图像旋转 90 度4Image.ROTATE_180图像旋转 180 度5Image.ROTATE_270图像旋转 270 度6Image.TRANSPOSE图像转置7Image.TRANSVERSE图像横向翻转。
from PIL import Image
import matplotlib.pyplot as pltim Image.open(starry_night.jpg)
im1 im.transpose(Image.FLIP_LEFT_RIGHT)
im2 im.transpose(Image.FLIP_TOP_BOTTOM)
im3 im.transpose(Image.ROTATE_90)
im4 im.transpose(Image.ROTATE_180)
im5 im.transpose(Image.ROTATE_270)
im6 im.transpose(Image.TRANSPOSE)
im7 im.transpose(Image.TRANSVERSE)
############################################################
# 绘图
im_list [im, im1, im2, im3, im4, im5, im6, im7]
for i, j in enumerate(im_list):plt.subplot(2, 4, i1)plt.title([raw, Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM, Image.ROTATE_90, Image.ROTATE_180, Image.ROTATE_270, Image.TRANSPOSE, Image.TRANSVERSE][i])plt.axis(off)plt.imshow(j)
plt.show()
plt.subplot(421), plt.imshow(im), plt.title(raw_image), plt.axis(off)
plt.subplot(422), plt.imshow(im1), plt.title(Image.FLIP_LEFT_RIGHT), plt.axis(off)
plt.subplot(423), plt.imshow(im2), plt.title(Image.FLIP_TOP_BOTTOM), plt.axis(off)
plt.subplot(424), plt.imshow(im3), plt.title(Image.ROTATE_90), plt.axis(off)
plt.subplot(425), plt.imshow(im4), plt.title(Image.ROTATE_180), plt.axis(off)
plt.subplot(426), plt.imshow(im5), plt.title(Image.ROTATE_270), plt.axis(off)
plt.subplot(427), plt.imshow(im6), plt.title(Image.TRANSPOSE), plt.axis(off)
plt.subplot(428), plt.imshow(im7), plt.title(Image.TRANSVERSE), plt.axis(off)
plt.show()15 图像几何变换旋转im.rotate() 函数说明 im.rotate(angle, resamplePIL.Image.NEAREST, expandNone, centerNone, translateNone, fillcolorNone)
参数说明 1angle表示任意旋转的角度2resample重采样滤波器默认为 PIL.Image.NEAREST 最近邻插值方法3expand可选参数表示是否对图像进行扩展如果参数值为 True 则扩大输出图像如果为 False 或者省略则表示按原图像大小输出4center可选参数指定旋转中心参数值是长度为 2 的元组默认以图像中心进行旋转5translate表示对旋转后的图像进行平移。参数值为二元组以左上角为原点可以为负数6fillcolor可选参数填充颜色图像旋转后对图像之外的区域进行填充。
from PIL import Imageim Image.open(starry_night.jpg)
im_out im.rotate(angle30, translate(0, -25), fillcolorgreen)
im_out.show()16 图像几何变换形状变换im.transform() 函数说明 im.transform(size, method, dataNone, resample0)
参数说明 1size指定变换后的图像尺寸2method指定图像的变化方式。比如Image.EXTENT 表示矩形变换3data截取原图像的区域4resample图像重采样滤波器默认参数值为 PIL.Image.NEAREST。
from PIL import Imageim Image.open(starry_night.jpg)
im_out im.transform((500, 500), Image.EXTENT, data[0, 0, 100 im.width//2, im.height//3])
im_out.show()17 图像降噪处理ImageFilter —— 集成多种滤波器17种
常见的降噪滤波器如下表官网Fillow对每个滤波器的详细定义
函数说明from PIL import 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()卷积核滤波Kernel(size,kernel, scaleNone, offset0)。1当前版本size必须为(3,3)或者(5,5)。kernel必须对应为9个或者25个整数或者浮点数的序列。如Kernel((3,3),(1,1,1,0,0,0,2,0,2)。2scale将卷积核作用于每个像素值之后的数据都需要除以这个变量。默认值为卷积核的权重之和。3offset将该值加到卷积核作用的结果上然后再除以变量scale。ImageFilter.MinFilter(num)最小值滤波器从 sizenum x num 参数指定的区域中选择最小像素值然后将其存储至输出图像中。ImageFilter.MedianFilter(num)中值滤波器从 sizenum x num参数指定的区域中选择中值像素值然后将其存储至输出图像中。特别是消除椒盐噪声中值滤波的效果要比均值滤波更好ImageFilter.MaxFilter(num)最大值滤波器从 sizenum x num参数指定的区域中选择最大值像素值然后将其存储至输出图像中。ImageFilter.ModeFilter(num)模式滤波从 sizenum x num参数指定的区域中拷贝出现次数最多的像素值存储到输出图像中。如果没有一个像素值出现过两次极其以上,则使用原始像素值。 from PIL import Image, ImageFilter
import matplotlib.pyplot as pltim Image.open(大黄蜂.jpg)
im1 im.filter(ImageFilter.BLUR)
im2 im.filter(ImageFilter.CONTOUR)
im3 im.filter(ImageFilter.DETAIL)
im4 im.filter(ImageFilter.FIND_EDGES)
im5 im.filter(ImageFilter.EMBOSS)
im6 im.filter(ImageFilter.EDGE_ENHANCE)
im7 im.filter(ImageFilter.EDGE_ENHANCE_MORE)
im8 im.filter(ImageFilter.SMOOTH)
im9 im.filter(ImageFilter.SMOOTH_MORE)
im10 im.filter(ImageFilter.SHARPEN)
im11 im.filter(ImageFilter.GaussianBlur())
im12 im.filter(ImageFilter.UnsharpMask())
im13 im.filter(ImageFilter.Kernel((3,3),(1,1,1,0,0,0,2,0,2)))
im14 im.filter(ImageFilter.MinFilter(3))
im15 im.filter(ImageFilter.MedianFilter(3))
im16 im.filter(ImageFilter.MaxFilter(3))
im17 im.filter(ImageFilter.ModeFilter())
############################################################
# 绘图
im_list [im, im1, im2, im3, im4, im5, im6, im7, im8, im9, im10, im11, im12, im13, im14, im15, im16, im17]
for i, j in enumerate(im_list):plt.subplot(4, 5, i1)plt.title([raw, 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, ImageFilter.MedianFilter, ImageFilter.MaxFilter, ImageFilter.ModeFilter][i])plt.axis(off)plt.imshow(j)
plt.show()
plt.subplot(4,5,1), plt.imshow(im), plt.title(raw_image), plt.axis(off)
plt.subplot(4,5,2), plt.imshow(im1), plt.title(ImageFilter.BLUR), plt.axis(off)
plt.subplot(4,5,3), plt.imshow(im2), plt.title(ImageFilter.CONTOUR), plt.axis(off)
plt.subplot(4,5,4), plt.imshow(im3), plt.title(ImageFilter.DETAIL), plt.axis(off)
plt.subplot(4,5,5), plt.imshow(im4), plt.title(ImageFilter.FIND_EDGES), plt.axis(off)
plt.subplot(4,5,6), plt.imshow(im5), plt.title(ImageFilter.EMBOSS), plt.axis(off)
plt.subplot(4,5,7), plt.imshow(im6), plt.title(ImageFilter.EDGE_ENHANCE), plt.axis(off)
plt.subplot(4,5,8), plt.imshow(im7), plt.title(ImageFilter.EDGE_ENHANCE_MORE), plt.axis(off)
plt.subplot(4,5,9), plt.imshow(im8), plt.title(ImageFilter.SMOOTH), plt.axis(off)
plt.subplot(4,5,10), plt.imshow(im9), plt.title(ImageFilter.SMOOTH_MORE), plt.axis(off)
plt.subplot(4,5,11), plt.imshow(im10), plt.title(ImageFilter.SHARPEN), plt.axis(off)
plt.subplot(4,5,12), plt.imshow(im11), plt.title(ImageFilter.GaussianBlur), plt.axis(off)
plt.subplot(4,5,13), plt.imshow(im12), plt.title(ImageFilter.UnsharpMask), plt.axis(off)
plt.subplot(4,5,14), plt.imshow(im13), plt.title(ImageFilter.Kernel), plt.axis(off)
plt.subplot(4,5,15), plt.imshow(im14), plt.title(ImageFilter.MinFilter), plt.axis(off)
plt.subplot(4,5,16), plt.imshow(im15), plt.title(ImageFilter.MedianFilter), plt.axis(off)
plt.subplot(4,5,17), plt.imshow(im16), plt.title(ImageFilter.MaxFilter), plt.axis(off)
plt.subplot(4,5,18), plt.imshow(im17), plt.title(ImageFilter.ModeFilter), plt.axis(off)
plt.show()18 图像像素增强ImageEnhance —— 对选择的属性增强N倍颜色平衡、对比度、亮度、锐度
常见的降噪滤波器如下表
函数说明from PIL import ImagEnhance\––ImageEnhance.Color(im).enhance(N)调整图像的颜色平衡ImageEnhance.Contrast(im).enhance(N)调整图像的对比度ImageEnhance.Brightness(im).enhance(N)调整图像的亮度ImageEnhance.Sharpness(im).enhance(N)调整图像的锐度 from PIL import Image, ImageEnhance
import matplotlib.pyplot as pltim Image.open(大黄蜂.jpg)
im1 ImageEnhance.Color(im).enhance(2)
im2 ImageEnhance.Contrast(im).enhance(2)
im3 ImageEnhance.Brightness(im).enhance(2)
im4 ImageEnhance.Sharpness(im).enhance(8)
############################################################
# 绘图
im_list [im, im1, im2, im3, im4]
for i, j in enumerate(im_list):plt.subplot(2, 3, i1)plt.title([raw, ImageEnhance.Color, ImageEnhance.Contrast, ImageEnhance.Brightness, ImageEnhance.Sharpness][i])plt.axis(off)plt.imshow(j)
plt.show()
plt.subplot(2,3,1), plt.imshow(im), plt.title(raw_image), plt.axis(off)
plt.subplot(2,3,2), plt.imshow(im1), plt.title(ImageEnhance.Color), plt.axis(off)
plt.subplot(2,3,3), plt.imshow(im2), plt.title(ImageEnhance.Contrast), plt.axis(off)
plt.subplot(2,3,4), plt.imshow(im3), plt.title(ImageEnhance.Brightness), plt.axis(off)
plt.subplot(2,3,5), plt.imshow(im4), plt.title(ImageEnhance.Sharpness), plt.axis(off)
plt.show()19 绘制图形ImageDraw.Draw() —— 添加文字 绘制点、直线、矩形、多边形、椭圆、圆弧、弦、饼图
方法说明draw ImageDraw.Draw(im)新建 ImageDraw 绘图对象参数 im 表示 Image 对象––draw.text(xy(x,y), text, font, fillNone)绘制文字。1(x,y)起始坐标位置以图像左上角为坐标原点2text字符串格式要添加的文本内容3fontImageFont 对象4fill填充色。draw.point(xy(x,y), fillNone)绘制点。1(x,y)起始坐标位置以图像左上角为坐标原点2fill填充色。draw.line(xy(x1, y1, x2, y2), fillNone, widthNone)绘制直线。1(x,y)左上角和右下角位置以图像左上角为坐标原点2fill填充色。3边框宽度draw.rectangle(xy(x1, y1, x2, y2), fillNone, outlineNone, widthNone)绘制矩形。1xy左上角和右下角位置以图像的左上角为坐标原点2fill填充色3outline边框颜色。4边框宽度draw.polygon(xy(x1, y1, x2, y2), fillNone, outlineNone, widthNone)绘制多边形。1xy左上角和右下角位置以图像的左上角为坐标原点2fill填充色3outline边框颜色4边框宽度draw.eclipse(xy(x1, y1, x2, y2), fillNone, outlineNone, widthNone)绘制椭圆形。1xy左上角和右下角位置以图像的左上角为坐标原点2fill填充色3outline边框颜色4边框宽度draw.arc(xy(x1, y1, x2, y2), start, end, fillNone, widthNone)绘制圆弧。1xy左上角和右下角位置以图像的左上角为坐标原点2start开始点3end结束点4fill填充色5边框宽度draw.chord(xy(x1, y1, x2, y2), start, end, fillNone, outlineNone, widthNone)绘制弦。1xy左上角和右下角位置以图像的左上角为坐标原点2start开始点3end结束点4fill填充色5outline边框颜色6边框宽度draw.pieslice(xy(x1, y1, x2, y2), start, end, fillNone, outlineNone, widthNone)绘制饼图。1xy左上角和右下角位置以图像的左上角为坐标原点2start开始点3end结束点4fill填充色5outline边框颜色6边框宽度 函数说明 ImageColor.getrgb(color)
参数说明 一个颜色名称字符串格式可以是颜色的英文单词或者十六进制颜色名。如果是不支持的颜色会报 ValueError 错误备注该模块支持不同格式的颜色比如 RGB 格式的颜色三元组、十六进制的颜色名称#ff0000以及颜色英文单词red。
from PIL import Image, ImageDraw, ImageFontim Image.new(RGB, (600, 600), colorgray) # 创建 Image 对象当做背景图
draw ImageDraw.Draw(im) # 创建 ImageDraw 对象######################################################################
# 绘制文字
font ImageFont.truetype(C:/Windows/Fonts/msyh.ttc, size25) # 加载计算机本地字体文件
draw.text(xy(200, 200), text胖墩会武术, fill(255, 0, 0), fontfont) # 在原图像上添加文本函数说明 font ImageFont.truetype(font, size)
参数说明 1font:指定的字体格式文件路径字符串格式。如TrueType 和 OpenType 类型的字体2size:字体大小######################################################################
# 绘制点 —— 点的pixel为1若觉得太小可以使用绘制圆来替代
draw.point(((400, 250), (400, 200), (400, 220)), fill(255, 255, 0))
###################################
# 绘制直线
draw.line(((5,5), (5,100)), fill(255,0,0), width5)
###################################
# 绘制矩形
draw.rectangle(((10,10), (50,50)), fill(0,255,0), outline(255,0,0))
# 绘制正方形
draw.rectangle(((50,50), (100,100)), fillNone, outline(0,0,255), width5)
# 绘制多边形
draw.polygon(((400, 400), (350, 380), (420, 350)), fill(255, 255, 0), outline(0, 0, 0))
###################################
# 绘制椭圆形
draw.ellipse(((100, 100), (120, 150)), fill(0, 255, 0), outline(255, 0, 0))
# 绘制圆形
draw.ellipse(((250, 250), (300, 300)), fillNone, outline(0, 0, 255), width5)
# 绘制圆弧
draw.arc((25, 50, 175, 200), start30, end270, fill(255, 255, 0))
# 绘制弦
draw.chord((225, 50, 375, 200), start30, end270, fill(255, 255, 0), outline(0, 0, 0))
# 绘制饼图
draw.pieslice((425, 50, 575, 200), start30, end270, fill(255, 255, 0), outline(0, 0, 0))im.show()20获取 RGB 值ImageColor.getrgb()
RGB 色彩模式、HSL 色调-饱和度-明度、HSB 又称 HSV色调-饱和度-亮度。 下面对 HSL 做简单介绍 H即 Hue 色调取值范围 0 -360其中 0 表示红色red120 表示绿色green240 表示蓝色blueS即 Saturation 饱和度代表色彩的纯度取值 0~100%其中 0 代表灰色gry100% 表示色光最饱和L即 Lightness 明度取值为 0~100%其中 0 表示黑色black50% 表示正常颜色100% 则表示白色。 函数说明 ImageColor.getrgb(color)
参数说明 一个颜色名称字符串格式可以是颜色的英文单词或者十六进制颜色名。如果是不支持的颜色会报 ValueError 错误备注该模块支持不同格式的颜色比如 RGB 格式的颜色三元组、十六进制的颜色名称#ff0000以及颜色英文单词red。
from PIL import Image, ImageColorcolor1 ImageColor.getrgb(blue)
color2 ImageColor.getrgb(#DCDCDC)
color3 ImageColor.getrgb(HSL(0, 100%, 50%)) # 使用HSL模式红色print(color1) # (0, 0, 255)
print(color2) # (220, 220, 220)
print(color3) # (255, 0, 0)21获取颜色值ImageColor.getcolor() 函数说明 ImageColor.getcolor(color, mode)
参数说明 1color一个颜色名称字符串格式可以是颜色的英文单词或者十六进制颜色名。如果是不支持的颜色会报 ValueError 错误2mode指定色彩模式如果是不支持的模式会报 KeyError 错误。备注该模块支持不同格式的颜色比如 RGB 格式的颜色三元组、十六进制的颜色名称#ff0000以及颜色英文单词red。
from PIL import Image, ImageColorcolor4 ImageColor.getcolor(#EEA9B8,L)
color5 ImageColor.getcolor(yellow,RGBA)print(color4) # 191
print(color5) # (255, 255, 0, 255)22ndarray数组与图像之间的相互转换np.array Image.fromarray
ndarray 是 NumPy 中的数组类型也称为 ndarray 数组该数组可以与 Pillow 的 PIL.Image 对象实现相互转化。
from PIL import Image
import numpy as npimg Image.open(C:/Users/pc/Desktop/1.png)
img_2 np.array(img) # Image图像转换为ndarray数组
arr_img Image.fromarray(img_2) # ndarray转换为Image图像
arr_img.show()23读取序列图像 seek() tell() 、ImageSequence()
Pillow 库也包含对图像序列动画格式的一些基本支持。支持的序列格式文件包括GIF、TIFF 和 FLI 等等。当加载序列图像时默认加载的是第一帧。 方法一除使用 seek() 方法读取图像序列外ImageSequence 模块还提供了 for 循环迭代遍历图像序列的方法。你可以使用 seek() 和 tell() 方法访问不同的帧。 from PIL import Image
import matplotlib.pyplot as pltfname rC:\Users\my\Desktop\image\my.gif
im Image.open(fname)
im_list [im.copy()]
try:while True:im.seek(im.tell()1)im_list.append(im.copy())
except EOFError:pass
#################################################
# 绘图
for i, j in enumerate(im_list):plt.subplot(1, 4, i1)plt.title(str(i1))plt.axis(off)plt.imshow(j)
plt.show()方法二除使用 seek() 方法读取图像序列外ImageSequence 模块还提供了 for 循环迭代遍历图像序列的方法。 from PIL import Image, ImageSequence
import matplotlib.pyplot as pltfname rC:\Users\my\Desktop\image\my.gif
im Image.open(fname)
im_list []
for frame in ImageSequence.Iterator(im):im_list.append(frame.copy())
##############################################
# 绘图
for i, j in enumerate(im_list):plt.subplot(1, 4, i1)plt.title(str(i1))plt.axis(off)plt.imshow(j)
plt.show()应用一批量修改图像尺寸
import os
from PIL import Image# 若文件夹不存在则新建NewImage
if not os.path.exists(C:/Users/pc/Desktop/NewImage/):os.mkdir(C:/Users/pc/Desktop/NewImage/) fileName os.listdir(C:/Users/pc/Desktop/image01/) # 指定图像的文件夹image01
for img in fileName:raw_image Image.open(C:/Users/pc/Desktop/image01/ img)new_image raw_image.resize((350, 350), Image.BILINEAR)new_image.save(C:/Users/pc/Desktop/NewImage/img)应用二图像添加水印ImageDraw ImageFont 即在原图上添加自定义的字体 from PIL import Image, ImageFont, ImageDrawdef creating_watermark(im, text, font):# 给水印添加透明度因此需要转换图片的格式im_rgba im.convert(RGBA)im_text_canvas Image.new(RGBA, im_rgba.size, (255, 255, 255, 0))draw ImageDraw.Draw(im_text_canvas)text_x_width, text_y_height draw.textsize(text, fontfont) # 设置文本文字大小text_xy (im_rgba.size[0] - text_x_width, im_rgba.size[1] - text_y_height)draw.text(text_xy, text, fontfont, fill(0, 125, 125)) # 设置文本im_text Image.alpha_composite(im_rgba, im_text_canvas) # 将原图片与文字复合return im_textimage Image.open(大黄蜂.jpg)
font1 ImageFont.truetype(C:/Windows/Fonts/msyh.ttc, size100)
image_water creating_watermark(image, 胖墩会武术, fontfont1)
image_water.show()应用三生成GIF动态图 以第一张图片作为开始将多张连续图像合并成 gif 动态图 import os
import random
from PIL import Imagedef png_to_gif(png_path, gif_name):png合成gif图像保存图像的文件夹路径, gif保存路径frames []png_files os.listdir(png_path)print(png_files)# 读取文件内的静态图for frame_id in range(1, len(png_files)1):frame Image.open(os.path.join(png_path, image%d.jpg%frame_id))frames.append(frame)frames[0].save(gif_name, save_allTrue, append_imagesframes[1:], transparency0, duration2000, loop0, disposal2)
# 函数作用以第一张图片作为开始将后续5张图片合并成 gif 动态图
# 参数说明
# save_all 保存图像;
# transparency 设置透明背景色;
# duration 单位毫秒动画持续时间。
# loop0 无限循环;
# disposal2 恢复原背景颜色。
# 注意Pillow 总是以灰度模式L或调色板模式P来读取 GIF 文件。
png_to_gif(C:/Users/pc/Desktop/image, C:/Users/pc/Desktop/t.gif)