• python中pil教程


    Image类是Pillow库中最重要的类

    安装Pillow包

    pip install pillow

    首先导入Image模块

    from PIL import Image

    打开图像

    通过Image 类中的open ()方法,可以创建一个Image对象。语法格式:

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

    fp:表示文件路径,字符串格式

    mode: 可选参数 

    1. from PIL import Image
    2. #打开图片
    3. img=Image.open(r"./t53.png")
    4. #显示图像
    5. img.show()

    图像的属性

    size:查看图像的大小

    print(img.size)

    format:查看图片的格式

    print(img.format)

    info : 查看图片相关信息

    print(img.info)

    mode:图片的模式

    print(img.mode)

     图片格式转换

    Pillow库支持多种图片格式,可以直接使用open()方法读取图片。

    图片格式的转换有两种方法

    save()

    1. from PIL import Image
    2. im=Image.open('./hh.png')
    3. ##这里可以使用save()方法将图片保存为其他格式的图片类型
    4. im.save('./hhh.bmp')

    convert()方法转换图片的格式

    1. #这时会返回一个新的Image对象
    2. image=im.convert('RGB')

    图片的缩放操作

    在图像处理过程中,经常遇到需要将图片放大或缩小的操作。Image类提供了resize()方法可以实现任意缩小和放大图像

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

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

     批量修改图片的尺寸

    1. import os
    2. from PIL import Image
    3. #读取该目录下所有图像的名字
    4. fileName = os.listdir('./image/T91_HR')
    5. print(fileName)
    6. #设定尺寸
    7. width = 350
    8. height = 350
    9. # 如果目录不存在,则创建目录
    10. if not os.path.exists(r'./hh'):
    11. os.mkdir(r'./hh')
    12. # 循环读取每一张图片
    13. for img in fileName:
    14. ##注意这里的路径必须是绝对路径,否则容易报错
    15. old_pic = Image.open('./image/T91_HR/'+img)
    16. ##这里返回一个新的Image对象
    17. new_image = old_pic.resize((width, height),Image.BILINEAR)
    18. print (new_image)
    19. new_image.save('./hh/'+img)

    图像分离与合并

    split()方法分离颜色通道

    1. from PIL import Image
    2. im=Image.open(r"./t53.png")
    3. #修改图像大小,以适应图像处理
    4. image=im.resize((450,400))
    5. #分离颜色通道,产生三个 Image对象
    6. r,g,b = image.split()
    7. r.show()
    8. g.show()
    9. b.show()

    merge() 通道合并

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

    Image.merge(mode, bands)

    参数说明如下:

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

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

    1. from PIL import Image
    2. im=Image.open("./t53.png")
    3. #修改图像大小,以适应图像处理
    4. image=im.resize((450,400))
    5. #分离颜色通道,产生三个 Image对象
    6. r,g,b = image.split()
    7. #重新组合颜色通道,返回先的Image对象
    8. image_merge=Image.merge('RGB',(b,g,r))
    9. image_merge.show()

    图像处理

    图片裁剪操作 

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

    crop(box=None)

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

    1. im = Image.open(r"./t53.png")
    2. box =(0,0,20,10)
    3. im_crop = im.crop(box)
    4. im_crop.show()

    图像拷贝与粘贴

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

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

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

    • image:指被粘贴的图片;
    • box:指定图片被粘贴的位置或者区域,其参数值是长度为 2 或者 4 的元组序列,长度为 2 时,表示具体的某一点 (x,y);长度为 4 则表示图片粘贴的区域,此时区域的大小必须要和被粘贴的图像大小保持一致。
    • mask:可选参数,为图片添加蒙版效果。
    1. im = Image.open("./t53.png")
    2. #复制一张图片副本
    3. im_copy=im.copy()
    4. #对副本进行裁剪
    5. im_crop = im_copy.crop((0,0,200,100))
    6. #创建一个新的图像作为蒙版,L模式,单颜色值
    7. image_new = Image.new('L', (200, 100), 200)
    8. image_new.show()
    9. #将裁剪后的副本粘贴至副本图像上,并添加蒙版
    10. im_copy.paste(im_crop,(100,100,300,200),mask=image_new)
    11. #显示粘贴后的图像
    12. im_copy.show()

    图像几何变换

    图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,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:图像横向翻转。
    1. im = Image.open("./hh.png")
    2. #返回一个新的Image对象
    3. im_out=im.transpose(Image.FLIP_LEFT_RIGHT) ###水平翻转
    4. im_out.show()

     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:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充。
    1. im = Image.open("./hh.png")
    2. #translate的参数值可以为负数,并将旋转图之外的区域填充为绿色
    3. #返回同一个新的Image对象
    4. im_out=im.rotate(45,translate=(0,-25),fillcolor="green")
    5. im_out.show()

     transform()图像变换

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

     参数说明:

    • size:指定新图片的大小;
    • method:指定图片的变化方式,比如 Image.EXTENT 表示矩形变换;
    • data:该参数用来给变换方式提供所需数据;
    • resample:图像重采样滤波器,默认参数值为 PIL.Image.NEAREST。
    1. from PIL import Image
    2. im = Image.open("./hh.png")
    3. #设置图像大小250*250,并根据data的数据截取原图像的区域,生成新的图像
    4. im_out=im.transform((250,250),Image.EXTENT,data=[0,0,30 + im.width//4,im.height//3])
    5. im_out.show()

    图像降噪处理

    Pillow 通过 ImageFilter 类达到图像降噪的目的,该类中集成了不同种类的滤波器,通过调用它们从而实现图像的平滑、锐化、边界增强等图像降噪操作。

    1. # 导入Image类和ImageFilter类
    2. from PIL import Image,ImageFilter
    3. im = Image.open("./hh.jpg")
    4. #图像模糊处理
    5. im_blur=im.filter(ImageFilter.BLUR)
    6. ##生成轮廓图
    7. im2=im.filter(ImageFilter.CONTOUR)
    8. im2.show()
    9. #边缘检测
    10. im3=im.filter(ImageFilter.FIND_EDGES)
    11. im3.show()
    12. #浮雕图
    13. im4=im.filter(ImageFilter.EMBOSS)
    14. im4.show()
    15. #平滑图smooth
    16. im5=im.filter(ImageFilter.SMOOTH)
    17. im5.show()

    图像和数组

    将PIL.Image对象和ndarray对象相互转化。

    Image.fromarray(array) 将数组转化为Image对象

    img = Image.fromarray(array)

    Image对象转化为ndarray数组

    1. from PIL import Image
    2. import numpy as np
    3. ##image对象
    4. img = Image.open("./hh.png")
    5. img.show()
    6. #Image图像转换为ndarray数组
    7. img_2 = np.array(img)
    8. print(img_2)
    9. #ndarray转换为Image图像
    10. arr_img = Image.fromarray(img_2)
    11. #显示图片
    12. arr_img.show()

  • 相关阅读:
    ES6的箭头函数和普通函数相比有什么不同?
    python的datetime模块常用的语法和实例
    Linux之yum/git的使用
    【CSS】transition、transform以及animation
    Maya——1——在maya中,用Arnold(阿诺德)还原Subtance Painter(sp)中的材质效果。
    智能合约平台开发方案:构建可靠且高效的区块链应用
    基于Java的智能仓库(进销存)管理系统设计与实现(源码+lw+部署文档+讲解等)
    java使用itext生成pdf
    uniapp的表单验证
    标准化学校考场自动校时同步时钟系统
  • 原文地址:https://blog.csdn.net/qq_40107571/article/details/126007556