Pillow简介

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

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

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

Pillow 库(有时也称 PIL 库) 是 Python 图像处理的基础库,它是一个免费开源的第三方库,Pillow 提供了非常强大的图像处理功能,它能够很轻松地完成一些图像处理任务。与 Python 的其他图像处理库相比(OpenCV、Scikit-image 等),Pillow 库简单易用,非常适合初学者学习。

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

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

    from PIL import Image
    #打开一图片文件
    im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
    #要显示图像需要调用 show()方法
    im.show()
    
    #使用颜色的十六进制格式
    im_1=Image.new(mode='RGB',(260,100),color="#ff0000")
    im_1.show()
    

    new() 方法可以创建一个新的 Image 对象

    查看图像的尺寸

    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)
    

    查看图片的格式

    from PIL import Image
    im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
    print("图像的格式:",im.format)
    

    查看图片相关信息

    from PIL import Image
    im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
    # 包括了每英寸像素点大小和截图软件信息
    print("图像信息:",im.info)
    

    图像模式

    from PIL import Image
    im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
    print("图像模式信息:",im.mode)
    

    图像转换

    Pillow 支持将图像从一种模式转换为另一种模式。常见的模式包括:

  • ‘L’:灰度模式
  • ‘RGB’:彩色模式
  • ‘CMYK’:印刷用的四分色模式
  • # 将RGB图像转换为灰度图像
    gray_image = image.convert('L')
    gray_image.show()
    

    保存图片

    from PIL import Image
    im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
    im.save('C:/Users/Administrator/Desktop/c.biancheng.net.bmp')
    
    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')
    

    图片缩放

    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("放大图像失败")
    
    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。
  • 图片裁剪

    # 裁剪图像
    cropped_image = image.crop((50, 50, 150, 150))
    cropped_image.show()
    
    crop(box=None)
    

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

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

    图像旋转与翻转

    # 旋转图像
    rotated_image = image.rotate(45)
    rotated_image.show()
     
    # 水平翻转图像
    flipped_image = image.transpose(Image.FLIP_LEFT_RIGHT)
    flipped_image.show()
    

    图像滤镜

    from PIL import ImageFilter
     
    # 应用模糊滤镜
    blurred_image = image.filter(ImageFilter.BLUR)
    blurred_image.show()
     
    # 应用轮廓滤镜
    contour_image = image.filter(ImageFilter.CONTOUR)
    contour_image.show()
    

    Pillow 内置了多种滤镜,常见的有模糊滤镜、轮廓滤镜、锐化滤镜等

    通道操作

    # 拆分通道
    r, g, b = image.split()
     
    # 操作通道,如增强红色通道
    enhanced_r = r.point(lambda i: i * 1.5)
    # 合并通道
    merged_image = Image.merge('RGB', (enhanced_r, g, b))
    merged_image.show()
    

    Pillow 允许我们对图像的各个颜色通道进行独立操作。比如,我们可以拆分图像的 RGB 通道,并单独处理某一通道

    文字与图像的结合

    from PIL import ImageDraw, ImageFont
     
    # 创建一个新的白色图像
    image = Image.new('RGB', (300, 100), color = 'white')
     
    # 初始化绘图对象
    draw = ImageDraw.Draw(image)
     
    # 定义字体和大小
    font = ImageFont.truetype("arial.ttf", 40)
     
    # 在图像上绘制文字
    draw.text((50, 25), "Hello, Pillow!", font=font, fill=(0, 0, 0))
     
    # 显示图像
    image.show()
    

    Pillow 支持在图像上绘制文字或图形,这一功能对于创建水印、生成动态图片等非常有用。ImageDraw 模块允许你在图像上进行绘制操作

    图像合并

    Image.merge(mode, bands)
    

    参数说明如下:

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

    模糊处理

    # 导入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")
    

    轮廓图

    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")
    

    边缘检测

    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")
    

    浮雕图

    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")
    

    平滑图像

    #生成平滑图像
    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")
    

    作者:凤枭香

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python Pillow图像编辑

    发表回复