Python拓展3(Pillow----图片处理操作内含(Image函数、ImageFilter函数、ImageGrab 函数))
安装Pillow模块方法
Windows安装
在Windows,32位和64位版本的车轮,蛋和可执行安装程序中为Windows支持的Pythons矩阵编写了Pillow二进制文件。除raqm和libimagequant外,这些二进制文件还包含所有可选的库:
pip install Pillow
macOS安装
为wheel格式的每个受支持的Python版本提供macOS的二进制文件。这些包括对除libimagequant之外的所有可选库的支持。Raqm支持需要分别安装libraqm,fribidi和harfbuzz:
pip install Pillow
Linux安装
为manlininux wheel格式中的每个受支持的Python版本提供Linux的二进制文件。这些包括对除libimagequant之外的所有可选库的支持。Raqm支持需要分别安装libraqm,fribidi和harfbuzz:
pip install Pillo
Pillow模块使用
Image函数
要在文件中加载图像需要使用模块中的 open() 功能 Image:
# 引用PIL中的Image类 from PIL import Image # 注意要打开的图片文件路径需要以引号包裹起开(可以写绝对路径也可以是相对路径) # im = Image.open("./img/image.JPG") im = Image.open("E:/图片/LV/IMG_1025.JPG") # 如果成功,此函数返回一个Image对象
检查文件方法
# 注意下一行的引入需要放于顶部(作用print是Pyton3新特性要在Python2中使用需要引入) # from __future__ import print_function # 引用PIL中的Image类 from PIL import Image # im = Image.open("./img/image.JPG") im = Image.open("E:/图片/LV/IMG_1025.JPG") print(im.format, im.size, im.mode) # 结果:JPEG (720, 960) RGB # 解释: # format属性标识图像的来源。如果图像未从文件中读取,则将其设置为无。 # size属性是包含宽度和高度的2元组(以像素为单位)。 # mode属性定义图像中带的数量和名称,以及像素类型和深度。 # 常见模式为灰度图像为“L”(亮度),真彩色图像为“RGB”,印前图像为“CMYK”。
一旦拥有Image该类的实例,就可以使用此类定义的方法来处理和操作图像:
-
显示加载的图片
# 引用PIL中的Image类 from PIL import Image im = Image.open("./img/image.JPG") # 显示图片的方法 im.show() # PS:标准版本show()效率不高,因为它将图像保存到临时文件并调用 # xv实用程序来显示图像。如果你没有安装xv ,它甚至不会工作。 # 当它工作时,它对于调试和测试非常方便。
2. 要保存文件,请使用该类的save()方法 Image。保存文件时,名称变得重要。除非您指定格式,否则库使用文件扩展名来发现要使用的文件存储格式。(如有问题请看4.识别图像文件方法)
# 引用PIL中的Image类 from PIL import Image import os import sys # im = Image.open("./img/image.JPG") # 显示图片的方法 # im.show() for infile in sys.argv[1:]: # sys.argv[1:]此类似一个列表但是存储的是系统的信息,主要用于命令行启动程序使用, # 索引为0:代表的是脚本本身(实际是你写的脚本本身的名字例如123.py) f, e = os.path.splitext(infile) # os.path.splitext:作用是将文件名与后缀名分开,如果一个值接收会收到一个元组 outfile = f + ".jpg" if infile != outfile: try: Image.open(infile).save(outfile) except IOError: print("cannot convert", infile) # 注意:第二个参数可以提供给save() 明确指定文件格式的方法。如果您使用非标准扩展名,则必须始终以这种方式指定格式:
3.创建JPEG缩略图
import os, sys from PIL import Image size = (128, 128) for infile in sys.argv[1:]: outfile = os.path.splitext(infile)[0] + ".thumbnail" # 去除文件不含后缀名的名字与.thumbnail进行拼接 if infile != outfile: try: im = Image.open(infile) im.thumbnail(size) im.save(outfile, "JPEG") except IOError: print("cannot create thumbnail for", infile)
4.识别图像文件方法
import sys from PIL import Image for infile in sys.argv[1:]: # 注意此行代码可以不加,对程序运行无影响 # 可以直接指定infile的路径 例如:infile = './img/image.JPG' try: with Image.open(infile) as im: print(infile, im.format, "%dx%d" % im.size, im.mode) except IOError: pass
5.复制图片中的子矩形
from PIL import Image im = Image.open("./img/image.JPG") box = (100, 100, 500, 500) # 定义子矩形图片的大小 regin = im.crop(box) # 复制子矩形图片 regin.show() # 打开子矩形图片 # 解释:该区域由四元组定义,其中坐标是(左,上,右,下)。 # Python Imaging Library使用左上角带有(0,0)的坐标系。 # 另请注意,坐标是指像素之间的位置,因此上例中的区域恰好为400x400像素。
6.处理子矩形并粘贴回来
from PIL import Image im = Image.open("./img/image.JPG") box = (100, 100, 500, 500) # 定义子矩形图片的大小 regin = im.crop(box) # 复制子矩形图片 # regin.show() # 打开子矩形图片 region = regin.transpose(Image.ROTATE_180) # 将子矩形旋转180度 im.paste(region, box) # 将region区域为box黏贴在im上 im.show() # 打开处理完的图片
7.裁剪黏贴图片方法
# 导入PIL中的Image模块 from PIL import Image # 打开一张图片 img = Image.open("./img/image.JPG") # 裁剪黏贴图片方法 def roll(image, delta): """Roll an image sideways.""" # 获取图片的长和宽分别存储 x_size, y_size = image.size # 重新赋值delta delta = delta % x_size # 如果取余为零说明传进来的值为图片宽,故直接返回图片 if delta == 0: return image # 截取第一张小图位置(上,右,下,左) part1 = image.crop((0, 0, delta, y_size)) # 截取第二张小图位置(上,右,下,左) part2 = image.crop((delta, 0, x_size, y_size)) # 剪切 part1.load() part2.load() # 重新合并图片 image.paste(part2, (0, 0, x_size-delta, y_size)) image.paste(part1, (x_size-delta, 0, x_size, y_size)) return image our = roll(img, 400) print(our) our.show() # 结果 # <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=722x1280 at 0x1E7EBD475C0>
PS:请注意,从crop() 操作中粘贴时,load()首先被调用。这是因为裁剪是一项懒惰的操作。如果load()未被调用,则在粘贴命令中使用图像之前不会执行裁剪操作。这意味着part1将从image第一个粘贴已经修改的版本中剪切。
对于更高级的技巧,粘贴方法也可以将透明度掩码作为可选参数。在此掩码中,值255表示粘贴的图像在该位置不透明(即,应按原样使用粘贴的图像)。值0表示粘贴的图像是完全透明的。中间值表示不同级别的透明度。例如,粘贴RGBA图像并将其用作蒙版将粘贴图像的不透明部分,但不粘贴透明背景。
8.对图片三原色提取并重新赋值方法
# 引入Image模块 from PIL import Image # 打开一张图片,并定义图片对象 img = Image.open('./img/image.JPG') # 获取此图片的R,G,B色值 r, g, b = img.split() # 将原图片色值进行重新组合 im = Image.merge('RGB', (b, g, r)) # 显示图片 im.show()
9.几何变换
from PIL import Image img = Image.open('./img/image.JPG') # new_img = img.resize((80, 100)) # 给出图片的新的长宽高(以像素计量) # new_img = img.rotate(90) # 逆时针旋转90度(多余的部分将被切除) # new_img = img.transpose(Image.FLIP_TOP_BOTTOM) # 从上到下反转(完整图片旋转) # new_img = img.transpose(Image.FLIP_LEFT_RIGHT) # 从左到右反转(完整图片旋转) # new_img = img.transpose(Image.ROTATE_90) # 顺时针旋转90度(完整图片旋转) new_img.show() img.show()
10.颜色转换
# 颜色转换 from PIL import Image # 将颜色rgb格式转为黑白的L格式 img = Image.open('./img/image.JPG').convert("L") img.show()
PS:该库支持每种支持模式和“L”和“RGB”模式之间的转换。要在其他模式之间转换,您可能必须使用中间图像(通常是“RGB”图像)。
过滤器ImageFilter函数
1.函数初期使用
# 过滤器 # ImageFilter模块所支持的滤波器 from PIL import Image from PIL import ImageFilter # 导入图片 img = Image.open('./img/image.JPG') # new_img = img.filter(ImageFilter.BLUR) # 模糊滤波,处理之后的图像会整体变得模糊 # new_img = img.filter(ImageFilter.CONTOUR) # 轮廓滤波,将图像中的轮廓信息全部提取出来 # new_img = img.filter(ImageFilter.DETAIL) # 细节增强滤波,会使得图像中细节更加明显 # 边缘增强滤波,突出、加强和改善图像中不同灰度区域之间的边界和轮廓的图像增强方法。 # 经处理使得边界和边缘在图像上表现为图像灰度的突变,用以提高人眼识别能力。 # new_img = img.filter(ImageFilter.EDGE_ENHANCE) # new_img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 为深度边缘增强滤波,会使得图像中边缘部分更加明显 # new_img = img.filter(ImageFilter.EMBOSS) # 为浮雕滤波,会使图像呈现出浮雕效果 # new_img = img.filter(ImageFilter.FIND_EDGES) # 为寻找边缘信息的滤波,会找出图像中的边缘信息 # 为平滑滤波,突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分, # 使图像亮度平缓渐变,减小突变梯度,改善图像质量。 # new_img = img.filter(ImageFilter.SMOOTH) # new_img = img.filter(ImageFilter.SMOOTH_MORE) # 为深度平滑滤波,会使得图像变得更加平滑 # new_img = img.filter(ImageFilter.SHARPEN) # 为锐化滤波,补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰 # new_img = img.filter(ImageFilter.SHARPEN) # 为锐化滤波,补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰 new_img.show()
2.ImageFilter函数
1》Kernel:卷积核滤波
from PIL import ImageFilter from PIL import Image img = Image.open('./img/0010.JPG') new_img = img.filter(ImageFilter.Kernel((3, 3), (1, 1, 1, 0, 0, 0, 2, 0, 2))) new_img.show()
参数:Kernel(size,kernel, scale=None, offset=0)
含义:创建一个卷积核心。当前版本仅支持3x3和5x5整数和浮点内核。在当前版本中,内核只能应用于“L”和“RGB”图像。
参数解读:
- size: 内核大小,以(宽度,高度)给出。在当前版本中,这必须是(3,3)或(5,5)。
- kernel:包含内核权重的序列必须为包含9个或者25个整数或者浮点数的序列。
- scale: 比例因子。如果给出,每个像素的结果除以该值。默认值是内核权重的总和。
- offset:偏移量。如果给出,则在将该值除以比例因子后,将该值加到结果中。
2》GaussianBlur:高斯模糊
from PIL import ImageFilter from PIL import Image img = Image.open('./img/0010.JPG') new_img = img.filter(ImageFilter.GaussianBlur(radius=10)) new_img.show()
参数:GaussianBlur(radius=)
含义:高斯模糊过滤器。
参数解读:
- radius:半径--模糊半径
3》BoxBlur:马赛克滤波
from PIL import ImageFilter from PIL import Image img = Image.open('./img/0010.JPG') new_img = img.filter(ImageFilter.BoxBlur(radius=100)) new_img.show()
参数:BoxBlur(radius=)
含义:通过将每个像素设置为在每个方向上延伸半径像素的方框中的像素的平均值来模糊图像。支持任意大小的浮点半径。对于任何半径值,使用相对于图像大小以线性时间运行的优化实现。(万恶的马赛克式模糊)
参数解读:
- radius:半径-在一个方向上的框的大小。半径0不模糊,返回相同的图像。半径1在每个方向上取1个像素,即总共9个像素。
4》UnsharpMask:反锐化掩码滤波
from PIL import ImageFilter from PIL import Image img = Image.open('./img/0010.JPG') new_img = img.filter(ImageFilter.UnsharpMask(radius=10, percent=300, threshold=4)) new_img.show()
参数:UnsharpMask(radius=, percent=, threshold=)
含义:反锐化掩码滤波。
参数解读:
- radius:半径---模糊半径
- percent:百分比---不锐利的百分比
- threshold:阈值---阈值控制将被锐化的最小亮度
5》RankFilter:排序滤波
from PIL import ImageFilter from PIL import Image img = Image.open('./img/image.JPG') new_img = img.filter(ImageFilter.RankFilter(5, 8)) # 在每个像素点为中心的5x5区域25个像素点中选择排序第8位的像素作为新的值 new_img.show()
参数:RankFilter(size, rank)
含义:创建一个排名过滤器。排名过滤器对给定大小的窗口中的所有像素进行排序,并返回排名的第rank个值
参数解读:
- size:内核大小,以像素为单位(长*宽)PS:长和宽是同一个数
- rank:在每个像素点为中心的size区域长长*宽个像素点中选择排序第rank位的像素作为新的值
6》MedianFilter:中值滤波
from PIL import ImageFilter from PIL import Image img = Image.open('./img/image.JPG') new_img = img.filter(ImageFilter.MedianFilter(3)) # 在每个像素点为中心的3*3区域9个像素点中选择中间像素值作为新的值 new_img.show()
参数:MedianFilter(size=)
含义:对于输入图像的每个像素点,该滤波器从(size,size)的区域中拷贝中值对应的像素值存储到输出图像中
参数解读:
- size:内核大小,以像素为单位(长*宽)PS:长和宽是同一个数
7》MinFilter(size= ):最小滤波
from PIL import ImageFilter from PIL import Image img = Image.open('./img/image.JPG') new_img = img.filter(ImageFilter.MinFilter(5)) # 在每个像素点为中心的5*5区域25个像素点中选择最小像素值作为新的值 new_img.show()
参数:MinFilter(size=)
含义:创建一个最小过滤器。在给定大小的窗口中选取最低的像素值。
参数解读:
- size:内核大小,以像素为单位(长*宽)PS:长和宽是同一个数
8》MaxFilter(size= ):最大滤波
from PIL import ImageFilter from PIL import Image img = Image.open('./img/image.JPG') new_img = img.filter(ImageFilter.MaxFilter(5)) # 在每个像素点为中心的5*5区域25个像素点中选择最大像素值作为新的值 new_img.show()
参数:MaxFilter(size= )
含义:创建一个最大过滤器。在给定大小的窗口中选取最大的像素值。
参数解读:
- size:内核大小,以像素为单位(长*宽)PS:长和宽是同一个数
9》ModeFilter(size= ):最频繁使用的滤波
from PIL import ImageFilter from PIL import Image img = Image.open('./img/image.JPG') new_img = img.filter(ImageFilter.ModeFilter(5)) # 在每个像素点为中心的5*5区域25个像素点中选择出现次数最多的像素作为新的值 new_img.show()
参数:ModeFilter(size= )
含义:创建一个模式过滤器。在给定大小的框中挑选最频繁的像素值。仅出现一次或两次的像素值将被忽略; 如果没有像素值出现两次以上,则保留原始像素值。
参数解读:
- size:内核大小,以像素为单位(长*宽)PS:长和宽是同一个数
ImageGrab 模块
介绍:ImageGrab模块可用于将屏幕或剪贴板的内容复制到PIL图像存储器。
# 导入模块 import os from PIL import ImageGrab # 获取文件存储位置 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) IMG_SAVE = os.path.join(BASE_DIR, 'img') # 对桌面进行全部截屏 img = ImageGrab.grab() # 动态存储图片地点 img.save(IMG_SAVE+'122.jpg') img.show()
ImageGrab 模块函数
1》grab(bbox =)
# 导入模块 import os from PIL import ImageGrab # 获取文件存储位置 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) IMG_SAVE = os.path.join(BASE_DIR, 'img') # 对桌面进行选取截屏 img = ImageGrab.grab(bbox=(250, 161, 1141, 610)) # 动态存储图片地点 img.save(IMG_SAVE+'122.jpg') img.show()
参数:grab(bbox =)
含义:拍摄屏幕快照。边界框内的像素在Windows上以“RGB”图像或在macOS上以“RGBA”形式返回。如果省略了边界框,则会复制整个屏幕。
参数解读:
- bbox :要复制的区域。默认是整个屏幕。
- 设定区域:
bbox=(250,161,1141,610)
返回值:一张图片
2》grabclipboard()
# 导入模块 import os from PIL import ImageGrab # 定义存储位置 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) IMG_SAVE = os.path.join(BASE_DIR, 'img') # 持续启动监控截图模块 try: while 1: # 监控截图 img = ImageGrab.grabclipboard() # 存储地点及名称 img.save(IMG_SAVE + '221112e22.jpg') except Exception as e: print(123)
含义:抓取剪贴板图片的快照,如果有的话。
返回值:
在Windows上,图像,文件名列表或None(如果剪贴板不包含图像数据或文件名)。请注意,如果返回列表,则文件名可能不代表图像文件。
在Mac上为图像,如果剪贴板不包含图像数据,则为None。

浙公网安备 33010602011771号