Pillow(PIL)入门教程(非常详细)

2024-06-30 1467阅读

Pillow 库提供了非常丰富的功能,主要有以下几点:

  • Pillow 库能够很轻松的读取和保存各种格式的图片;
  • Pillow 库提供了简洁易用的 API 接口,可以让您轻松地完成许多图像处理任务;
  • Pillow 库能够配合 GUI(图形用户界面) 软件包 Tkinter 一起使用;
  • Pillow 库中的 Image 对象能够与 NumPy ndarray 数组实现相互转换。

    丰富功能的实现得益于 Pillow 提供了众多的模块。在 Pillow 库中有二十多个模块,比如 Image 图像处理模块、ImageFont 添加文本模块、ImageColor 颜色处理模块、ImageDraw 绘图模块等等,每个模块各自实现了不同的功能,同时模块之间又可以互相配合。

    相关资源
    • Python Pillow 官方文档:https://pillow.readthedocs.io/en/latest/
    • 本套教程的图片资源下载:https://pan.baidu.com/s/17mhdGCTuKMPS5RuAgbtv3A(提取码:n1v2)

      教程特点

      本套教程的初衷是尽快让初学者入门,因此更偏重于基础知识。在教程中,我们详细讲解了如何使用 Pillow 库的 Image 模块完成一些图像的处理操作,比如调整图像大小、图像的拷贝、粘贴、裁剪等基础操作,通过这些内容的学习,让您掌握图像处理的基本方法。对于 Pillow 的进阶知识,我们讲解了如何使用 Pillow 为图片添加水印、批量处理图片以及生成 GIF 动态图等。

      在创作教程的过程中,我们尽量从初学者的角度来讲解 Pillow 库的相关知识,使教程通俗易懂、易学、易用。本套教程采用了“知识讲解 + 实例演示”的方式,避免了学习过程中的“枯燥和乏味”。学习完本教程后,您可以使用 Pillow 库完成一些简单的图像处理操作。

      读者&阅读条件

      本套 Pillow 教程适合有一定 Python 编程基础的人员学习,如果您已经掌握 Python 基础知识,那可以直接阅读本教程,否则建议您提前阅读《Python基础教程》。通过本套教程的学习,您将初步掌握图像处理的相关知识,将它作为学习图像处理的第一套教程,是一个非常不错的选择。

      Pillow是什么

      PIL( Python Imaging Library)是 Python 的第三方图像处理库,由于其功能丰富,API 简洁易用,因此深受好评。

      自 2011 年以来,由于 PIL 库更新缓慢,目前仅支持 Python 2.7 版本,这明显无法满足 Python3 版本的使用需求。于是一群 Python 社区的志愿者(主要贡献者:Alex Clark 和 Contributors)在 PIL 库的基础上开发了一个支持 Python3 版本的图像处理库,它就是 Pillow。

      Pillow 不仅是 PIL 库的“复制版”,而且它又在 PIL 库的基础上增加了许多新的特性。Pillow 发展至今,已经成为了比 PIL 更具活力的图像处理库。

      Pillow 的初衷只是想作为 PIL 库的分支和补充,如今它已是“青出于蓝而胜于蓝”。

      除了 PIL 和 Pillow 库之外,Python 还提供了一些其他图像处理库:

      • Scikit-image:一款基于 scipy 科学计算的图像处理软件包,以数组的形式对图像进行处理;
      • OpenCV:其实是一个 C++ 图像处理库,不过它提供了 Python 语言的接口。

        Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像、调整图像大小和图像颜色处理等。与 Pillow 相比,OpenCV 和 Scikit-image 的功能更为丰富,所以使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,比如众所周知的“人脸识别”应用。

        Pillow版本支持

        Pillow 支持跨平台运行,比如 Windows、Linux、MacOS 等,其最新版本为 Pillow 8.3.2,该版本支持 Python 3.6 及以上的版本(推荐使用)。Pillow 与 Python 支持版本的对照表如下所示:

        Python版本3.103.93.83.73.63.52.7
        Pillow>=8.3.2支持支持支持支持支持
        Pillow8.0-8.3.1支持支持支持支持
        Pillow7.0-7.2支持支持支持支持
        Pillow6.2.1-6.22支持支持支持支持支持
        Pillow6…0-6.2.0支持支持支持支持

        Pillow库特点

        Pillow 库作为图像处理的常用库,主要有以下三大特点:

        1) 支持广泛的文件格式

        Pillow 支持广泛的图像格式,比如 “jpeg”,“png”,“bmp”,“gif”,“ppm”,“tiff” 等。同时,它也支持图像格式之间的相互转换。总之, Pillow 几乎能够处理任何格式的图像。

        2) 提供了丰富的功能

        Pillow 提供了丰富的图像处理功能,可概括为两个方面:

        • 图像归档
        • 图像处理

          图像归档,包括创建缩略图、生成预览图像、图像批量处理等;而图像处理,则包括调整图像大小、裁剪图像、像素点处理、添加滤镜、图像颜色处理等。

          3) 配合GUI工具使用

          Pillow 库可以配合 Python GUI(图形用户界面)工具 Tkinter 一起使用。

          除上述特点之外,Pillow 库还能实现一些较为复杂的图像处理操作,比如给图像添加水印、合成 GIF 动态效果图等等。

          Pillow的下载与安装

          Pillow 安装非常简单和方便,有三种安装途径,分别是:

          • pip包管理器安装
          • 二进制包安装
          • Anaconda安装

            下面对上述安装方式做简单介绍。

            注意,PIL 库与 Pillow 库不允许在同一环境中共存,如果您之前安装了 PIL 库,请卸载后,再安装 Pillow。

            pip包管理器安装

            通过 Python 包管理器 pip 来安装 Pillow 是最简单、轻量级的一种安装方式,并且这种方法适用于任何平台。只需执行以下命令即可:

            pip install pillow
            

            二进制包安装

            通过 Python PyPi 第三方库官网(https://pypi.org/project/Pillow/#files)下载与平台系统相对应的版本,如下所示:

            Pillow(PIL)入门教程(非常详细)

            图1:Pillow下载版本

            下载完成后,进入下载文件的所在位置,然后直接使用pip命令来安装.whl文件即可,如下所示:

            pip install + whl文件名
            

            Anaconda安装

            Anaconda 是一款开源的 Python 发行版(下载地址:https://www.anaconda.com/products/individual#Downloads),它是当下较为流行的科学计算平台,支持 Windows、Linux、MacOS 系统。Anaconda 自带许多已经安装完成软件包,其中就包含 Pillow,因此无须重新安装。

            Pillow(PIL)入门教程(非常详细)

            图2:Anaconda安装

            无论采用上述哪种方式都可以成功安装 Pillow。不过对于初学者来说,我们建议您使用第一种安装方式。

            注意,本教程以 Windows 平台为例对 Pillow 库的相关知识进行讲解。

            最后,在 CMD 命令行打开 Python 解释器交互环境,输入以下代码,验证 Pillow 是否安装成功。

            #导入Image类,该类是pillow中用于图像处理的重要类from PIL import Image
            

            如下所示,如果解释器没有返回错误,则证明已经安装成功。

            Pillow(PIL)入门教程(非常详细)

            图3:测试Pillow安装成功

            注意,这里使用 PIL 导入,但实际上使用的是 Pillow 库,这里的 PIL 可以看做是 Pillow 库的简称。

            Pillow创建Image对象

            Image 类是 Pillow 库中最为重要的类,该类被定义在和与其同名的 Image 模块中。

            使用下列导包方式引入 Image 模块:

            from PIL import Image
            

            使用 Image 类可以实例化一个 Image 对象,通过调用该对象的一系列属性和方法对图像进行处理。Pilow 提供了两种创建 Image 实例对象的方法,下面对它们进行简单的介绍。

            open()

            使用 Image 类的 open() 方法,可以创建一个 Image 对象,语法格式如下:

            im = Image.open(fp,mode="r")
            

            参数说明:

            • fp:即 filepath 的缩写,表示文件路径,字符串格式;
            • mode:可选参数,若出现该参数,则必须设置为 “r”,否则会引发 ValueError 异常。

              示例如下:

              from PIL import Image
              #打开一图片文件
              im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
              #要显示图像需要调用 show()方法
              im.show()
              

              图像显示结果如下:

              Pillow(PIL)入门教程(非常详细)

              图1:显示结果

              new()

              使用 Image 类提供的 new() 方法可以创建一个新的 Image 对象,语法格式如下:

              im=Image.new(mode,size,color)
              

              参数说明如下:

              • mode:图像模式,字符串参数,比如 RGB(真彩图像)、L(灰度图像)、CMYK(色彩图打印模式)等;
              • size:图像大小,元组参数(width, height)代表图像的像素大小;
              • color:图片颜色,默认值为 0 表示黑色,参数值支持(R,G,B)三元组数字格式、颜色的十六进制值以及颜色英文单词。

                示例如下:

                #使用颜色的十六进制格式
                im_1=Image.new(mode='RGB',(260,100),color="#ff0000")
                im_1.show()
                

                输出图像如下所示:

                Pillow(PIL)入门教程(非常详细)

                图2:显示结果

                Pillow Image对象属性

                Image 对象有一些常用的基本属性,这些属性能够帮助我们了解图片的基本信息,下面对这些属性做简单的讲解:

                1) size:查看图像的尺寸
                from PIL import Image
                im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                #打印image对象
                print(im)
                #查看尺寸
                print("宽是%s高是%s"%(im.width,im.height))
                #或者通过size查看
                print("图像的大小size:",im.size)
                

                输出结果:

                宽是455高是191
                图像的大小size: (455, 191)
                
                2) format:查看图片的格式
                from PIL import Image
                im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                print("图像的格式:",im.format)
                

                输出结果:

                图像的格式: PNG
                
                3) readonly:图片是否为只读
                from PIL import Image
                im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                print("图像是否为只读:",im.readonly)
                

                该属性的返回为 0 或者 1,分别对应着是和否,输出结果如下:

                图像是否为只读: 1
                
                4) info:查看图片相关信息
                from PIL import Image
                im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                # 包括了每英寸像素点大小和截图软件信息
                print("图像信息:",im.info)
                

                该属性的返回值为字典格式,输出结果如下:

                图像信息: {'dpi': (96, 96), 'Software': 'Snipaste'}
                
                5) mode:图像模式
                from PIL import Image
                im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                print("图像模式信息:",im.mode)
                

                输出结果:

                图像的模式: RGBA
                

                上述涉及了许多图片模式的名称,比如 RGB、RGBA 等,下面对常用的图片模式做简单的总结,如下表所示:

                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 位浮点像素,单色通道。

                Pillow图片格式转换

                Pillow 库支持多种图片格式,您可以直接使用 open() 方法来读取图片,并且无须考虑图片是何种类型。同时,Pillow 能够很轻松地实现图片格式之间的转换。

                图片格式之间的转换主要有以下两种方法,下面分别对它们进行了介绍:

                save()

                顾名思义,save() 方法用于保存图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片。save() 的语法格式如下:

                Image.save(fp, format=None)
                

                参数说明如下:

                • fp:图片的存储路径,包含图片的名称,字符串格式;
                • format:可选参数,可以指定图片的格式。

                  示例如下:

                  from PIL import Image
                  im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                  im.save('C:/Users/Administrator/Desktop/c.biancheng.net.bmp')
                  

                  此时您的计算机桌面上会存在一个 c.bianchneg.net.BMP格式的图片。

                  convert()+save()

                  注意,并非所有的图片格式都可以用 save() 方法转换完成,比如将 PNG 格式的图片保存为 JPG 格式,如果直接使用 save() 方法就会出现以下错误:

                  from PIL import Image
                  im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                  im.save('C:/Users/Administrator/Desktop/c.biancheng.net.jpg')
                  

                  错误信息如下所示:

                  #系统错误,RGBA不能作为JPEG图片的模式
                  OSError: cannot write mode RGBA as JPEG
                  

                  引发错误的原因是由于 PNG 和 JPG 图像模式不一致导致的。其中 PNG 是四通道 RGBA 模式,即红色、绿色、蓝色、Alpha 透明色;JPG 是三通道 RGB 模式。因此要想实现图片格式的转换,就要将 PNG 转变为三通道 RGB 模式。

                  Image 类提供的 convert() 方法可以实现图像模式的转换。该函数提供了多个参数,比如 mode、matrix、dither 等,其中最关键的参数是 mode,其余参数无须关心。语法格式如下:

                  convert(mode,parms**)
                  
                  • mode:指的是要转换成的图像模式;
                  • params:其他可选参数。

                    修改后的代码如下所示:

                    from PIL import Image
                    im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                    #此时返回一个新的image对象,转换图片模式
                    image=im.convert('RGB')
                    #调用save()保存
                    image.save('C:/Users/Administrator/Desktop/c.biancheng.net.jpg')
                    

                    通过以上代码,成功将 PNG 格式的图片转换为了 JPG 格式。

                    Pillow图像缩放操作

                    在图像处理过程中经常会遇到缩小或放大图像的情况,Image 类提供的 resize() 方法能够实现任意缩小和放大图像。

                    resize() 函数的语法格式如下:

                    resize(size, resample=image.BICUBIC, box=None, reducing_gap=None)
                    

                    参数说明:

                    • size:元组参数 (width,height),图片缩放后的尺寸;
                    • resample:可选参数,指图像重采样滤波器,与 thumbnail() 的 resample 参数类似,默认为 Image.BICUBIC;
                    • box:对指定图片区域进行缩放,box 的参数值是长度为 4 的像素坐标元组,即 (左,上,右,下)。注意,被指定的区域必须在原图的范围内,如果超出范围就会报错。当不传该参数时,默认对整个原图进行缩放;
                    • reducing_gap:可选参数,浮点参数值,用于优化图片的缩放效果,常用参数值有 3.0 和 5.0。

                      注意,resize() 会返回一个新的 image 对象。下面是一组对图像进行放大操的示例:

                      from PIL import Image
                      im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                      try:
                          #放大图片
                          image=im.resize((550,260))
                          #将新图像保存至桌面
                          image.save("C:/Users/Administrator/Desktop/放大图像.png")
                          print("查看新图像的尺寸",image.size)
                      except IOError:
                          print("放大图像失败")
                      

                      输出结果:

                      查看新图像的尺寸 (550, 260)
                      

                      放大后的图片效果。如下所示:

                      Pillow(PIL)入门教程(非常详细)

                      图1:pillow放大图像

                      对图片的局部位置进行放大,示例如下:

                      from PIL import Image
                      im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                      try:
                          #选择放大的局部位置,并选择图片重采样方式
                          # box四元组指的是像素坐标 (左,上,右,下) 
                          #(0,0,120,180),表示以原图的左上角为原点,选择宽和高分别是(120,180)的图像区域
                          image=im.resize((550,260),resample=Image.LANCZOS,box=(0,0,120,180))
                          image.show()
                          #保存
                          image.save("C:/Users/Administrator/Desktop/放大图像.png")
                          print("查看新图像的尺寸",image.size)
                      except IOError:
                          print("放大失败")
                      

                      图片的放大效果如下所示:

                      Pillow(PIL)入门教程(非常详细)

                      图2:局部放大操作

                      创建缩略图

                      缩略图(thumbnail image)指的是将原图缩小至一个指定大小(size)的图像。通过创建缩略图可以使图像更易于展示和浏览。

                      Image 对象提供了一个 thumbnail() 方法用来生图像的缩略图,该函数的语法格式如下:

                      thumbnail(size,resample)
                      
                      • size:元组参数,指的是缩小后的图像大小;
                      • resample:可选参数,指图像重采样滤波器,有四种过滤方式,分别是 Image.BICUBIC(双立方插值法)、PIL.Image.NEAREST(最近邻插值法)、PIL.Image.BILINEAR(双线性插值法)、PIL.Image.LANCZOS(下采样过滤插值法),默认为 Image.BICUBIC。

                        使用示例如下:

                        from PIL import Image
                        im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                        im.thumbnail((150,50))
                        print("缩略图尺寸",im.size)
                        #将缩略图保存至桌面
                        im.save("C:/Users/Administrator/Desktop/th.png")
                        

                        输出结果:

                        缩略图尺寸 (118, 50)
                        

                        注意,缩略图的尺寸可能与您指定的尺寸不一致,这是因为 Pillow 会对原图像的长、宽进行等比例缩小,当指定的尺寸不符合图像的尺寸规格时,缩略图就会创建失败, 比如指定的尺寸超出了原图像的尺寸规格。

                        批量修改图片尺寸

                        在图像处理过程中,对于某些不需要精细处理的环节,我们往往采用批量处理方法,比如批量转换格式,批量修改尺寸,批量添加水印,批量创建缩略图等,这是一种提升工作效率的有效途径,它避免了单一、重复的操作。通过 Pillow 提供的 Image.resize() 方法可以批量地修改图片尺寸,下面看一组简单的示例。

                        首先找一些类型相同,但尺寸不一的图片,并把它们放入桌面的 image01 文件夹中。如下所示:

                        Pillow(PIL)入门教程(非常详细)

                        图3:待处理的图片

                        下面开始编写代码:

                        # 批量修改图片尺寸
                        import os
                        from PIL import Image
                        #读取图片目录
                        fileName = os.listdir('C:/Users/Administrator/Desktop/image01/')
                        print(fileName)
                        #设定尺寸
                        width = 350
                        height = 350
                        # 如果目录不存在,则创建目录
                        if not os.path.exists('C:/Users/Administrator/Desktop/NewImage/'):
                            os.mkdir('C:/Users/Administrator/Desktop/NewImage/')
                        # 循环读取每一张图片
                        for img in fileName:
                            old_pic = Image.open('C:/Users/Administrator/Desktop/image01/' + img)
                            new_image = old_pic.resize((width, height),Image.BILINEAR)
                            print (new_image)
                            new_image.save('C:/Users/Administrator/Desktop/NewImage/'+img)
                        

                        输出结果如下所示:

                        ['向日葵.jpg', '国宝.jpg', '矩形图.jpg', '蝴蝶.jpg']
                        
                        
                        
                        
                        

                        NewImage 目录的内容如下:

                        Pillow(PIL)入门教程(非常详细)

                        图4:处理完成的图片

                        Pillow图像分离与合并

                        我们知道,图像(指数字图像)由许多像素点组成,像素是组成图像的基本单位,而每一个像素点又可以使用不同的颜色,最终呈现出了绚丽多彩的图像。在《Pillow Image对象属性》一节,我们介绍一些图片模式,它们的本质就是图片呈现颜色时需要遵循的规则,比如 RGB、RGBA、CYMK 等,而图像的分离与合并,指的就是图像颜色的分离和合并。

                        Image 类提供了用于分离图像和合并图像的方法 split() 和 merge() 方法,通常情况下,这两个方法会一起使用。

                        split()

                        split() 的使用方法比较简单,用来分离颜色通道。我们使用它来处理蝴蝶图片:

                        Pillow(PIL)入门教程(非常详细)

                        图1:pilow 图像处理操作

                        代码如下所示:

                        im=Image.open("C:/Users/Administrator/Desktop/1.jpg")
                        #修改图像大小,以适应图像处理
                        image=im.resize((450,400))
                        image.save("C:/Users/Administrator/Desktop/2.jpg")
                        #分离颜色通道,产生三个 Image对象
                        r,g,b = image.split()
                        r.show()
                        g.show()
                        b.show()
                        

                        输出的结果,依次展示如下:

                        Pillow(PIL)入门教程(非常详细)

                        图2:分离结果预览

                        merge()

                        Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像。

                        merge() 方法的语法格式如下:

                        Image.merge(mode, bands)
                        

                        参数说明如下:

                        • mode:指定输出图片的模式
                        • bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,比如 RGB 分别代表三种颜色通道,可以表示为 (r,g,b)。

                          注意,该函数会返回一个新的 Image 对象。

                          下面对图像合并的两种类型分别进行介绍:

                          一. 单个图像的合并指的是将颜色通道进行重新组合,从而得到不一样的图片效果,代码如下所示:

                          from PIL import Image
                          im=Image.open("C:/Users/Administrator/Desktop/1.jpg")
                          #修改图像大小,以适应图像处理
                          image=im.resize((450,400))
                          image.save("C:/Users/Administrator/Desktop/2.jpg")
                          #分离颜色通道,产生三个 Image对象
                          r,g,b = image.split()
                          #重新组合颜色通道,返回先的Image对象
                          image_merge=Image.merge('RGB',(b,g,r))
                          image_merge.show()
                          #保存图像至桌面
                          image_merge.save("C:/Users/Administrator/Desktop/3.jpg")
                          

                          新合成的图像入如下所示:

                          Pillow(PIL)入门教程(非常详细)

                          图3:图像合并操作

                          两张图片的合并操作也并不复杂,但是要求两张图片的模式、图像大小必须要保持一致,否则不能合并。因此,对于那些模式、大小不同的图片要进行预处理。

                          下面我们将蝴蝶图与向日葵图进行合并,向日葵原图如下:

                          Pillow(PIL)入门教程(非常详细)

                          图4:向日葵原图

                          示例代码如下:

                          from PIL import Image
                          #打开图2.jpg
                          im_1 = Image.open("C:/Users/Administrator/Desktop/2.jpg")
                          im_2= Image.open("C:/Users/Administrator/Desktop/向日葵.jpg")
                          #因为两种图片的图片格式一致,所以仅需要处理图片的大小,让它们保持一致
                          #让 im_2 的图像尺寸与 im_1 一致,注意此处新生成了 Image 对象
                          image = im_2.resize(im_1.size)
                          #接下来,对图像进行颜色分离操作
                          r1, g1 ,b1 = im_1.split()
                          r2, g2 , b2 = image.split()
                          # 合并图像
                          im_3 = Image.merge('RGB',[r2,g1,b2])
                          im_3.show()
                          im_3.save("C:/Users/Administrator/Desktop/合成.jpg")
                          

                          预览图像的合成结果:

                          Pillow(PIL)入门教程(非常详细)

                          图5:合成图像

                          扩展知识:blend() 混合图片

                          Image 类也提供了 blend() 方法来混合 RGBA 模式的图片(PNG 格式),函数的语法格式如下:

                          Image.blend(image1,image2, alpha)
                          

                          参数说明如下:

                          • image1,image2:表示两个 Image 对象。
                          • alpha:表示透明度,取值范围为 0 到 1,当取值为 0 时,输出图像相当于 image1 的拷贝,而取值为 1 时,则是 image2 的拷贝,只有当取值为 0.5 时,才为两个图像的中合。因此改值的大小决定了两个图像的混合程度。

                            与 RGB 模式相比,RGBA 在 RGB 的基础上增加了透明度,通过 Alpha 取值来决定两个图像的混合程度。示例如下:

                            """"
                            混合 rgba模式的图像
                            """
                            im1 = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                            image = Image.open("C:/Users/Administrator/Desktop/心形函数图像.png")
                            im2=image.resize(im1.size)
                            def blend_im(im1,im2):
                                 #设置 alpha 为 0.5
                                Image.blend(im1,im2,0.5).save("C:/Users/Administrator/Desktop/C语言中文网.png")
                            #调用函数
                            blend_im(im1,im2)  
                            

                            输出结果如下:

                            Pillow(PIL)入门教程(非常详细)

                            图6:混合图像

                            Pillow图像裁剪、复制、粘贴操作

                            图像的剪裁、复制、粘贴是图像处理过程中经常使用的基本操作,Pillow Image 类提供了简单、易用的 API 接口,能够帮助您快速实现这些简单的图像处理操作。

                            图像裁剪操作

                            Image 类提供的 crop() 函数允许我们以矩形区域的方式对原图像进行裁剪,函数的语法格式如下:

                            crop(box=None)
                            

                            box:表示裁剪区域,默认为 None,表示拷贝原图像。

                            注意:box 是一个有四个数字的元组参数 (x_左上,y_左下,x1_右上,y1_右下),分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位。

                            crop() 函数的会返回一个 Image 对象,使用示例如下:

                            """
                            裁剪图像
                            """
                            im = Image.open("C:/Users/Administrator/Desktop/C语言中文网.png")
                            box =(0,0,200,100)
                            im_crop = im.crop(box)
                            im_crop.show()
                            

                            输出图像显示如下:

                            Pillow(PIL)入门教程(非常详细)

                            图1:图像裁剪

                            最终,在原图的基础上裁剪出一张像素为 200 * 100 的图像。

                            图像拷贝和粘贴

                            拷贝、粘贴操作几乎是成对出现的,Image 类提供了 copy() 和 paste() 方法来实现图像的复制和粘贴。其中复制操作(即 copy() 方法)比较简单,下面主要介绍 paste() 粘贴方法,语法格式如下所示:

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

                            该函数的作用是将一张图片粘贴至另一张图片中。注意,粘贴后的图片模式将自动保持一致,不需要进行额外的转换。参数说明如下:

                            • image:指被粘贴的图片;
                            • box:指定图片被粘贴的位置或者区域,其参数值是长度为 2 或者 4 的元组序列,长度为 2 时,表示具体的某一点 (x,y);长度为 4 则表示图片粘贴的区域,此时区域的大小必须要和被粘贴的图像大小保持一致。
                            • mask:可选参数,为图片添加蒙版效果。

                              下面复制一张原图像的副本,对副本进行裁剪、粘贴操作,代码如下所示:

                              im = Image.open("C:/Users/Administrator/Desktop/C语言中文网.png")
                              #复制一张图片副本
                              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()
                              

                              输出的显示结果,如下所示:

                              Pillow(PIL)入门教程(非常详细)

                              图2:图像复制粘贴

                              Pillow图像几何变换

                              图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,Image 类提供了处理这些操作的函数 transpose()、rotate() 和 transform(),下面分别对它们进行讲解。

                              transpose()翻转操作

                              该函数可以实现图像的垂直、水平翻转,语法格式如下:

                              Image.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:图像横向翻转。

                                使用示例如下:

                                im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                                #返回一个新的Image对象
                                im_out=im.transpose(Image.FLIP_LEFT_RIGHT)
                                im_out.show()
                                im_out.save("C:/Users/Administrator/Desktop/水平翻转.png")
                                

                                图像显示结果,如下所示:

                                Pillow(PIL)入门教程(非常详细)

                                图1:图像翻转操作

                                rotate()任意角度旋转

                                当我们想把图像旋转任意角度时,可以使用 rotate() 函数,语法格式如下:

                                Image.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:参数值为二元组,表示对旋转后的图像进行平移,以左上角为原点;
                                • fillcolor:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充。

                                  使用示例如下:

                                  im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                                  #translate的参数值可以为负数,并将旋转图之外的区域填充为绿色
                                  #返回同一个新的Image对象
                                  im_out=im.rotate(45,translate=(0,-25),fillcolor="green")
                                  im_out.show()
                                  im_out.save("C:/Users/Administrator/Desktop/旋转图像.png")
                                  

                                  输出结果:

                                  Pillow(PIL)入门教程(非常详细)

                                  图2:图像旋转

                                  transform()图像变换

                                  该函数能够对图像进行变换操作,通过指定的变换方式,产生一张规定大小的新图像,语法格式如下:

                                  Image.transform(size, method, data=None, resample=0) 
                                  

                                  参数说明:

                                  • size:指定新图片的大小;
                                  • method:指定图片的变化方式,比如 Image.EXTENT 表示矩形变换;
                                  • data:该参数用来给变换方式提供所需数据;
                                  • resample:图像重采样滤波器,默认参数值为 PIL.Image.NEAREST。

                                    使用示例如下:

                                    from PIL import Image
                                    im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
                                    #设置图像大小250*250,并根据data的数据截取原图像的区域,生成新的图像
                                    im_out=im.transform((250,250),Image.EXTENT,data=[0,0,30 + im.width//4,im.height//3])
                                    im_out.show()
                                    im_out.save("C:/Users/Administrator/Desktop/变换.png")
                                    

                                    输出图像显示如下:

                                    Pillow(PIL)入门教程(非常详细)

                                    图3:图像矩形变换

                                    Pillow图像降噪处理

                                    由于成像设备、传输媒介等因素的影响,图像总会或多或少的存在一些不必要的干扰信息,我们将这些干扰信息统称为“噪声”,比如数字图像中常见的“椒盐噪声”,指的是图像会随机出现的一些白、黑色的像素点。图像噪声既影响了图像的质量,又妨碍人们的视觉观赏。因此,噪声处理是图像处理过程中必不可少的环节之一,我们把处理图像噪声的过程称为“图像降噪”。

                                    随着数字图像技术的不断发展,图像降噪方法也日趋成熟,通过某些算法来构造滤波器是图像降噪的主要方式。滤波器能够有效抑制噪声的产生,并且不影响被处理图像的形状、大小以及原有的拓扑结构。

                                    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()模式滤波

                                    从上述表格中选取几个方法进行示例演示,下面是等待处理的原始图像:

                                    Pillow(PIL)入门教程(非常详细)

                                    图1:pilow图像处理

                                    模糊处理

                                    # 导入Image类和ImageFilter类
                                    from PIL import Image,ImageFilter
                                    im = Image.open("C:/Users/Administrator/Desktop/国宝.jpg")
                                    #图像模糊处理
                                    im_blur=im.filter(ImageFilter.BLUR)
                                    im_blur.show()
                                    im_blur.save("C:/Users/Administrator/Desktop/模糊.png")
                                    

                                    输出图像如下:

                                    Pillow(PIL)入门教程(非常详细)

                                    图2:图像模糊

                                    轮廓图

                                    from PIL import Image,ImageFilter
                                    im = Image.open("C:/Users/Administrator/Desktop/国宝.jpg")
                                    #生成轮廓图
                                    im2=im.filter(ImageFilter.CONTOUR)
                                    im2.show()
                                    im2.save("C:/Users/Administrator/Desktop/轮廓图.png")
                                    

                                    输出图像,显示如下:

                                    Pillow(PIL)入门教程(非常详细)

                                    图3:图像轮廓图

                                    边缘检测

                                    from PIL import Image,ImageFilter
                                    im = Image.open("C:/Users/Administrator/Desktop/国宝.jpg")
                                    #边缘检测
                                    im3=im.filter(ImageFilter.FIND_EDGES)
                                    im3.show()
                                    im3.save("C:/Users/Administrator/Desktop/边缘检测.png")
                                    

                                    输出图像结果:

                                    Pillow(PIL)入门教程(非常详细)

                                    图4:图像边缘检测

                                    浮雕图

                                    from PIL import Image,ImageFilter
                                    im = Image.open("C:/Users/Administrator/Desktop/国宝.jpg")
                                    #浮雕图
                                    im4=im.filter(ImageFilter.EMBOSS)
                                    im4.show()
                                    im4.save("C:/Users/Administrator/Desktop/浮雕图.png")
                                    

                                    输出图像如下:

                                    Pillow(PIL)入门教程(非常详细)

                                    图5:浮雕图

                                    平滑图像

                                    #生成平滑图像
                                    from PIL import Image,ImageFilter
                                    im = Image.open("C:/Users/Administrator/Desktop/国宝.jpg")
                                    #平滑图smooth
                                    im5=im.filter(ImageFilter.SMOOTH)
                                    im5.show()
                                    im5.save("C:/Users/Administrator/Desktop/平滑图.png")
                                    

                                    输出图像如下:

                                    Pillow(PIL)入门教程(非常详细)

                                    图6:平滑图

                                    如果您使用过 PhotoShop(简称 Ps,一款专业的图像处理软件)、Fireworks(简称 Fw,一款专业的图像处理软件) 或者手机美图软件的话,其实不难发现,上述操作就是给图片添加一个“滤镜”,通过添加滤镜来改变图片的外观,从而影响了我们对于图片的感官体验。

                                    Pillow图像颜色处理

                                    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% 则表示白色。

                                      下面使用 HSL 色彩模式表示红色,格式如下:

                                      HSL(0,100%,50%)
                                      

                                      此时的颜色为“纯红色”,等同于 RGB (255,0,0)。如果想了解有关 HSL/HSB 的更多知识,点击链接前往。

                                      ImageColor 模块比较简单,只提供了两个常用方法,分别是 getrgb() 和 getcolor() 函数。

                                      自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

                                      深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

                                      因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

                                      Pillow(PIL)入门教程(非常详细)

                                      Pillow(PIL)入门教程(非常详细)

                                      Pillow(PIL)入门教程(非常详细)

                                      Pillow(PIL)入门教程(非常详细)

                                      Pillow(PIL)入门教程(非常详细)

                                      Pillow(PIL)入门教程(非常详细)

                                      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

                                      由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

                                      如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)

                                      Pillow(PIL)入门教程(非常详细)

                                      现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

                                      分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

                                      Pillow(PIL)入门教程(非常详细)

                                      一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

                                      Pillow(PIL)入门教程(非常详细)

                                      getcolor() 函数。

                                      自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

                                      深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

                                      因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

                                      [外链图片转存中…(img-U6M4I115-1712841782147)]

                                      [外链图片转存中…(img-oK68GehY-1712841782148)]

                                      Pillow(PIL)入门教程(非常详细)

                                      Pillow(PIL)入门教程(非常详细)

                                      Pillow(PIL)入门教程(非常详细)

                                      Pillow(PIL)入门教程(非常详细)

                                      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

                                      由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

                                      如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)

                                      [外链图片转存中…(img-l5q9HEnt-1712841782148)]

                                      现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

                                      分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

                                      Pillow(PIL)入门教程(非常详细)

                                      一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

                                      [外链图片转存中…(img-Pm5BhORS-1712841782149)]

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]