Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 718|回复: 0

[默认分类] Python 之 使用 PIL 库做图像处理

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-7 12:56:17 | 显示全部楼层 |阅读模式
    1. 简介。
        图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 python 当然不会错过这一门盛宴。PIL (Python Imaging Library)是 Python 中最常用的图像处理库,目前版本为 1.1.7,我们可以 在这里 下载学习和查找资料。
        Image 类是 PIL 库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像和通过抓取的方法得到的图像这三种方法。
    2. 使用。
        导入 Image 模块。然后通过 Image 类中的 open 方法即可载入一个图像文件。如果载入文件失败,则会引起一个 IOError ;若无返回错误,则 open 函数返回一个 Image 对象。现在,我们可以通过一些对象属性来检查文件内容,即:

    1.   
    2.    1
    3.    >>>
    4.    
    5.    import
    6.     Image
    7.    2
    8.    
    9.    >>>
    10.     im
    11.    =
    12.     Image.open(
    13.    "
    14.    j.jpg
    15.    "
    16.    )
    17.    3
    18.    
    19.    >>>
    20.    
    21.    print
    22.     im.format, im.size, im.mode
    23.    4
    24.    JPEG (
    25.    440
    26.    ,
    27.    330
    28.    ) RGB
    29.   
    复制代码

        这里有三个属性,我们逐一了解。
            format : 识别图像的源格式,如果该文件不是从文件中读取的,则被置为 None 值。
            size : 返回的一个元组,有两个元素,其值为象素意义上的宽和高。
            mode : RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)。
        现在,我们可以使用一些在 Image 类中定义的方法来操作已读取的图像实例。比如,显示最新载入的图像:

    1.   
    2.    1
    3.    >>>
    4.    im.show()
    5.    2
    6.    
    7.    >>>
    8.   
    复制代码

        输出原图:

    3. 函数概貌。
    3.1    Reading and Writing Images : open( infilename ) , save( outfilename )
    3.2    Cutting and Pasting and Merging Images :
            crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。
            paste() :
            merge() :

    1.   
    2.    1
    3.    >>>
    4.     box
    5.    =
    6.     (
    7.    100
    8.    ,
    9.    100
    10.    ,
    11.    200
    12.    ,
    13.    200
    14.    )
    15.    2
    16.    
    17.    >>>
    18.     region
    19.    =
    20.     im.crop(box)
    21.    3
    22.    
    23.    >>>
    24.     region.show()
    25.    4
    26.    
    27.    >>>
    28.     region
    29.    =
    30.     region.transpose(Image.ROTATE_180)
    31.    5
    32.    
    33.    >>>
    34.     region.show()
    35.    6
    36.    
    37.    >>>
    38.     im.paste(region, box)
    39.    7
    40.    
    41.    >>>
    42.     im.show()
    43.   
    复制代码

        其效果图为:

        旋转一幅图片:

    1.   
    2.     1
    3.    def
    4.     roll(image, delta):
    5.     2
    6.    
    7.    "
    8.    Roll an image sideways
    9.    "
    10.    
    11.     3
    12.    
    13.     4
    14.     xsize, ysize
    15.    =
    16.     image.size
    17.     5
    18.    
    19.     6
    20.     delta
    21.    =
    22.     delta
    23.    %
    24.     xsize
    25.     7
    26.    
    27.    if
    28.     delta
    29.    ==
    30.     0:
    31.    return
    32.     image
    33.     8
    34.    
    35.     9
    36.     part1
    37.    =
    38.     image.crop((0, 0, delta, ysize))
    39.    10
    40.     part2
    41.    =
    42.     image.crop((delta, 0, xsize, ysize))
    43.    11
    44.     image.paste(part2, (0, 0, xsize
    45.    -
    46.    delta, ysize))
    47.    12
    48.     image.paste(part1, (xsize
    49.    -
    50.    delta, 0, xsize, ysize))
    51.    13
    52.    
    53.    14
    54.    
    55.    return
    56.     image
    57.   
    复制代码
    3.3    几何变换。
    3.3.1    简单的几何变换。

    1.   
    2.    1
    3.    >>>
    4.    out
    5.    =
    6.     im.resize((
    7.    128
    8.    ,
    9.    128
    10.    ))
    11.    #
    12.    2
    13.    
    14.    >>>
    15.    out
    16.    =
    17.     im.rotate(
    18.    45
    19.    )
    20.     #逆时针旋转 45 度角。
    21.    
    22.    3
    23.    
    24.    >>>
    25.    out
    26.    =
    27.     im.transpose(Image.FLIP_LEFT_RIGHT)
    28.    #
    29.    左右对换。
    30.    
    31.    4
    32.    
    33.    >>>
    34.    out
    35.    =
    36.     im.transpose(Image.FLIP_TOP_BOTTOM)
    37.    #
    38.    上下对换。
    39.    
    40.    5
    41.    
    42.    >>>
    43.    out
    44.    =
    45.     im.transpose(Image.ROTATE_90)
    46.    #
    47.    旋转 90 度角。
    48.    
    49.    6
    50.    
    51.    >>>
    52.    out
    53.    =
    54.     im.transpose(Image.ROTATE_180)
    55.    #
    56.    旋转 180 度角。
    57.    
    58.    7
    59.    
    60.    >>>
    61.    out
    62.    =
    63.     im.transpose(Image.ROTATE_270)
    64.    #
    65.    旋转 270 度角。
    66.   
    复制代码

        各个调整之后的图像为:
        图片1:
        图片2:
        图片3:
        图片4:
    3.3.2    色彩空间变换。
        convert() : 该函数可以用来将图像转换为不同色彩模式。
    3.3.3    图像增强。
        Filters : 在 ImageFilter 模块中可以使用 filter 函数来使用模块中一系列预定义的增强滤镜。


    1.   
    2.    1
    3.    >>>
    4.    
    5.    import
    6.     ImageFilter
    7.    2
    8.    
    9.    >>>
    10.     imfilter
    11.    =
    12.     im.filter(ImageFilter.DETAIL)
    13.    3
    14.    
    15.    >>>
    16.     imfilter.show()
    17.   
    复制代码
    3.4    序列图像。

        即我们常见到的动态图,最常见的后缀为 .gif ,另外还有 FLI / FLC 。PIL 库对这种动画格式图也提供了一些基本的支持。当我们打开这类图像文件时,PIL 自动载入图像的第一帧。我们可以使用 seek 和 tell 方法在各帧之间移动。


    1.   
    2.    1
    3.    import
    4.     Image
    5.    2
    6.    im.seek(
    7.    1
    8.    )
    9.    #
    10.     skip to the second frame
    11.    
    12.    3
    13.    
    14.    
    15.    4
    16.    
    17.    try
    18.    :
    19.    5
    20.    
    21.    while
    22.    
    23.    1
    24.    :
    25.    6
    26.     im.seek( im.tell()
    27.    +
    28.    
    29.    1
    30.    )
    31.    7
    32.    
    33.    #
    34.     do something to im
    35.    
    36.    8
    37.    
    38.    except
    39.     EOFError:
    40.    9
    41.    
    42.    pass
    43.   
    复制代码


    3.5    更多关于图像文件的读取。
        最基本的方式:im = Image.open("filename")
        类文件读取:fp = open("filename", "rb"); im = Image.open(fp)
        字符串数据读取:import StringIO; im = Image.open(StringIO.StringIO(buffer))
        从归档文件读取:import TarIO; fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm"); im = Image.open(fp)
    基本的 PIL 目前就练习到这里。其他函数的功能可点击 这里 进一步阅读。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-24 01:21 , Processed in 0.375051 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表