Python环境Pillow( PIL )图像处理工具使用解析

前言

由于笔者近期的研究课题与图像后处理有关,需要通过图像处理工具对图像进行变换和处理,进而生成合适的训练图像数据。该系列文章即主要记录笔者在不同的环境下进行图像处理时常用的工具和库。在 Python 环境下,对图像的处理笔者主要使用 Pillow 库,主要操作包括对图像的读取、存储和变换等。实际应用中,Pillow 中提供的 Image 模块适合对图像整体进行变换处理操作。

注:以下介绍仅包括对应模块和函数的基础用法,故而在介绍时省略了部分参数和选项,更完备的用法和介绍可参考 Pillow 的官方文档。

安装

用户可通过 pip 直接安装 Pillow,更多安装方式可以参见这里。

pip install Pillow #安装 pillow

使用

在日常应用过程中,使用最多的是 Pillow 提供的 Image 模块,其提供了包括图像存储、变换以及一系列的相关处理功能。Pillow 使用 Image 对象来表示图像对象并基于其定义图像的属性信息以及可针对其进行的操作,后续即主要介绍通过 Image 对象可进行的图像操作。在 Python 中使用时,用户首先需从 PIL 中导入对应的 Image 模块。

from PIL import Image #通过 Image 进行图像处理相关的操作

图像读取与存储

通过 Image 提供的 open 方法读取图像,其以指定的文件名为参数,返回值为对应图像的 Image 对象,后续即可针对图像对应的 Image 对象进行操作。

  im = Image.open( "test.png" )  # open 方法以图像名(或图像对象)为参数,返回一个 Image 对象

通过 Image 对象的 save 方法存储图像对象,其使用存储目标文件名为参数,也可通过 format 参数指定存储文件的格式。

  im.save( "test.png" )          # im 为 Image 对象,其被保存至 test.png,不指定 format 参数时,该方法通过文件后缀推测文件类型
  im.save( "test.jpg" , format="JPEG")  # 以 JPEG 格式保存 Image 对象 im 至文件 test.jpg 中

基本属性

图像对应的 Image 对象具备基本属性。用户可以通过这些属性获得图像最基本的信息,Image 对象的完整属性信息可以查看这里。

  im.filename    # Image 对象 im 对应的文件/路径名
  im.mode      # Image 对象图像数据的解释方式,如灰度图为 “L”,彩色图为 “RGB”等
  im.size      # 返回图像的尺寸信息,为( width , height ) 格式的元祖

图像类型转换

不同的图像数据具有不同的图像格式,进而拥有不同的组织数据的方式。对于 RGB 图像而言,图像拥有 R、G、B 三个通道,像素数据由三个对应三通道的 8 bit 数据组成;对于黑白图像而言,其每个像素由一个 8 bit 字节表示等等。在打开图像时,open 方法会自动解析图像的格式,用户可通过 Image 对象的 mode 属性获得图像的状态。

Image 对象可通过 convert 方法进行图像类型间的转换,其使用转换的目标类型的字符串为参数,返回转换后的 Image 对象,常见的类型包括 RGB(真彩)、L(黑白)、YCbCr(视频图像)、HSV(色调饱和度亮度彩色空间)。

  data = im.convert( "L" )    #获得 RGB 图像 im 的灰度图

与 numpy 数组的转换

在程序中,一般使用图像对应的 Image 对象进行图像相关的操作,针对图像数据本身的计算处理一般将 Image 对象的数据转换为 numpy 数据后进行,处理完成之后的 numpy 数据再被转换为 Image 对象进行保存。

a. 将 Image 对象转换为 numpy 数组

使用 numpy.asarray 方法( 不唯一,可参见 Array creation routines )将 Image 对象的数据转换为 numpy 数组,进而可以对其进行计算处理。转换后 numpy 数组的数据类型根据 Image 数据对象本身的数据类型推断获得,使用时也可使用 numpy.asarray 的 dtype 参数指定转换后的数据类型。  

  im = Image.open( "test.png" )         #打开图像 test.png ,并获得其对应的 Image 对象
  data = numpy.asarray( im )           #将 Image 对象 im 的数据转换为 numpy 数组的形式,data 即为可供运算的 numpy 数组
  data = numpy.asarray( im, dtype=np.uint8 )   #转换图像数据为 numpy 数组,并指定其类型为 np.uint8

b.将 numpy 数组转换为 Image 对象

对于 numpy 数据形式的图像数据( 通过数据处理或其他途径获得 ),可通过 Image.fromarray 方法将已有的 numpy 图像数据转换为 Image 对象。

im = Image.fromarray( data ) # data 为 numpy 数组,im 为转换获得的 Image 对象

注意,在使用 Image.fromarray 方法时可能会出现报错 raise TypeError("Cannot handle this data type") , 这是由于待转换的 numpy 数据类型可能并不符合 Image 对象所需的数据类型( 一般为 8 bit 无符号值 ),解决方法是在转换前先将 numpy 数组的数据类型转换为 np.uint8 .

  im = Image.fromarray( data.astype( np.uint8 ) )  #将 numpy 数组的数据类型转换为 np.uint8 后再转换为 Image 对象

常用操作

裁剪图像——crop

可以使用 crop 方法获得图像的指定部分。crop 方法以指定 ( 左,上,右,下 ) 切割位置的元祖来定义待分割的图像部分,可以理解为定义的是切割获得的矩形的左上角和右下角位置的坐标。在 PIL 所支持的坐标系统中,坐标的( 0 , 0 ) 为图像的左上角,注意 ( 0 , 0 ) 指向的不是左上角的第一个像素,而是该像素位置前的位置,后续所有的坐标均为像素间的空隙位置,而不是指向像素。也就是说,第一个像素被 ( 0 , 0 ) 和 ( 0 , 1 ) 两个坐标左右包围。  

part = im.crop( ( 0 , 0 , 100 , 100 ) ) #截取获得图像 im 左上角大小为 100 × 100 像素的矩形图像

通道处理——split / getchannel

split 方法将图像数据按通道分离,其返回值为包含各个通道分离数据的元组tuple,如对于 RGB 图像而言,其被分成 R、G、B 三个通道的数据。

R, G, B = im.split() # im 为真彩色 Image 对象,其被分为独立的 R、G、B 通道信息

getchannel 方法以图像的通道的索引或字符名字为参数,返回包含有对应通道数据的 L 类型的图像( 即为黑白模式 )。  

  R = im.getchannel( 0 )  # 获得 RGB 图像的第一个通道的数据,即 R 通道信息
  R = im.getchannel( "R" ) #同上

缩放图像——resize

resize 方法以缩放目标图像大小的元祖( Width, Heigth ) 为参数,通过指定的采样方法将图像缩放为指定的图像大小。其支持采样的方法包括 PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC 等,resize 支持的全部采样方式见文档。注意,以上采样方法的全名为 PIL.Image.xxxx,但实际上由于之前已经使用 from PIL import Image 导入了 Image 这个模块名,故而后续可以直接使用 Image.xxxx 的形式调用上述方法,反之,在未导入模块名时需使用完整的名称来使用上述方法,下同。

  data = im.resize( ( 100, 100 ) )             #将 im 对应的 Image 对象缩放为 100×100 的大小,默认采用 PIL.Image.NEAREST 方法
  data = im.resize( ( 100, 100 ), Image.BICUBIC )     #使用 PIL.Image.BICUBIC 方法进行采样

翻转图像——rotate/transpose

通过 rotate 方法旋转图像,rotate 方法以旋转的角度为参数,将图像顺时针中心旋转对应的度数,并返回对应的 Image 对象。注意,通过 rotate 方法进行旋转时,结果图像是中心旋转后图像在源图像大小范围内被截取的部分,其他部分为填充。如大小为宽×高 200 * 100 的图像,经过 90 度旋转后,其大小仍为 200 * 100 ,图像内容为旋转后的理论为 100 * 200 的图像与原 200 * 100 区域的重合部分,其余部分为填充。

rotate 方法可以指定 expand 参数为 1 ,此时生成的新图像为完整包含有旋转后图像内容的最小矩形大小( 空白处为填充),如上例中,图像经过 90 度旋转后,获得的新图像的大小即为 100 * 200。更多介绍见 Image.rotate.

data = im.rotate( 90 ) #将图像顺时针旋转 90 度
data = im.rotate( 90 , expand=1 ) #将图像顺时针旋转 90 度,同时保留图像的完整内容

在某些图像训练的数据生成中,将图像进行 90 度为单位的旋转、上下或左右翻转是更为常见的操作。此时可以使用 transpose 方法,transpose 以翻转方式为参数,返回经过翻转后的图像,其支持的参数如下所示。

PIL.Image.FLIP_LEFT_RIGHT  #左右翻转图像
  PIL.Image.FLIP_TOP_BOTTOM  #上下翻转图像
  PIL.Image.ROTATE_90
  PIL.Image.ROTATE_180
  PIL.Image.ROTATE_270     #顺时针旋转对应度数
  PIL.Image.TRANSPOSE     #类似于左右翻转后再逆时针旋转图像 90 度
  PIL.Image.TRANSVERSE     #类似与左右翻转后再顺时针旋转图像 90 度

可以直接使用上述参数对图像进行变换,transpose 方法返回变换后的完整图像( 由于是 90 度倍数的变换,也不存在空白区域 )。

data = im.transpose( Image.FLIP_LEFT_RIGHT ) #获得 im 图像经过左右旋转后的数据

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python实现更改图片尺寸大小的方法(基于Pillow包)

    本文实例讲述了Python实现更改图片尺寸大小的方法.分享给大家供大家参考,具体如下: 1.PIL包推荐Pillow. 2.源码: #encoding=utf-8 #author: walker #date: 2014-05-15 #function: 更改图片尺寸大小 import os import os.path from PIL import Image ''' filein: 输入图片 fileout: 输出图片 width: 输出图片宽度 height:输出图片高度 type:输出图

  • python 3.7.0 下pillow安装方法

    PIL(Python Imaging Library)是Python中一个强大的图像处理库,但目前其只支持到Python2.7 pillow是PIL的一个分支,虽是分支但是其与PIL同样也具有很强的图像处理库. Python3.7.0 如何安装pillow 此安装方法在windows7环境下完成: >>>win+r调出运行窗口,键入cmd弹出命令窗口 >>>此处需要键入命令调到python所在的文件夹中,如图,我是将python安装在d盘中 >>>在D

  • Linux上安装Python的PIL和Pillow库处理图片的实例教程

    安装 正常情况,只需 pip install PIL==1.1.7 或者 pip install Pillow==2.9.0 即可.但需留意安装后的输出 安装完成后,需留意输出: *** TKINTER support not available *** JPEG support not available *** WEBP support not available *** ZLIB (PNG/ZIP) support not available *** FREETYPE2 support n

  • 详解Python图像处理库Pillow常用使用方法

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. 其官方主页为:PIL. PIL历史悠久,原来是只支持python2.x的版本的,后来出现了移植到python3的库pillow,pillow号称是friendly fork for PIL,其功能和PIL差不多,但是支持python3. PIL(Python Imaging Library)是Python一个强大方便的图像处理库

  • 在Mac OS系统上安装Python的Pillow库的教程

    今天帮朋友做个python的小工具,发现系统上缺少ptyhon的支持库,返回如下信息 ImportError: No module named PIL  然后就下载安装,因为机器上也没有python的管理工具pip,所以也一并安装 1. 安装pip sudo easy_install pip pip 安装成功就可以直接安装pil或者pillow 2. 通过命令pip install pil pip install Pil Downloading/unpacking Pil Could not f

  • Python3安装Pillow与PIL的方法

    关于Pillow与PIL PIL(Python Imaging Library)是Python一个强大方便的图像处理库,名气也比较大.不过只支持到Python 2.7. PIL官方网站:http://www.pythonware.com/products/pil/ Pillow是PIL的一个派生分支,但如今已经发展成为比PIL本身更具活力的图像处理库.目前最新版本是3.0.0. Pillow的Github主页:https://github.com/python-pillow/Pillow Pil

  • 详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决

    也许自己真的就是有手残的毛病,你说好端端的环境配置好了,自己还在那里瞎鼓捣,我最不想看到的就是在安装一个别的模块的时候,自动卸载了本地的其他模块,每每这个时候,满满的崩溃啊,今天就是一个鲜活的例子. 我们都知道由于2和3版本的差异,2中的PIL模块可以直接安装和导入使用,3中需要安装的实际是Pillow模块,导入的却是PIL模块,我在安装别的模块的时候居然自动地把我本机安装好的Pillow模块卸载了,导致我后面使用的时候一直报错,想着直接再安装一下就行了,却发现事情真的是一团糟. python

  • Python环境Pillow( PIL )图像处理工具使用解析

    前言 由于笔者近期的研究课题与图像后处理有关,需要通过图像处理工具对图像进行变换和处理,进而生成合适的训练图像数据.该系列文章即主要记录笔者在不同的环境下进行图像处理时常用的工具和库.在 Python 环境下,对图像的处理笔者主要使用 Pillow 库,主要操作包括对图像的读取.存储和变换等.实际应用中,Pillow 中提供的 Image 模块适合对图像整体进行变换处理操作. 注:以下介绍仅包括对应模块和函数的基础用法,故而在介绍时省略了部分参数和选项,更完备的用法和介绍可参考 Pillow 的

  • Python用Pillow(PIL)进行简单的图像操作方法

    Python用Pillow(PIL)进行简单的图像操作方法 颜色与RGBA值 计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透明度),称为RGBA值.在Pillow中,RGBA的值表示为由4个整数组成的元组,分别是R.G.B.A.整数的范围0~255.RGB全0就可以表示黑色,全255代表黑色.可以猜测(255, 0, 0, 255)代表红色,因为R分量最大,G.B分量为0,所以呈现出来是红色.但是当alpha值为0时,无论是什么颜色,该颜色都不可见,可以理解为透明. from

  • Python使用Pillow进行图像处理

    一.概述 PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow. Pillow在PIL的基础上,为Python3增加了更多功能和支持.它支持一系列图像文件格式,如PNG,JPEG,PPM,GIF

  • Python利用Pillow(PIL)库实现验证码图片的全过程

    前言 Pillow库有很多用途,本文使用Pillow来生成随机的验证码图片. Pillow的用法参考:https://www.jb51.net/article/196007.htm 验证码是随机的,使用Python内置的random库来生成随机的颜色和随机的字符. random的用法参考:https://www.jb51.net/article/196955.htm 一.验证码图片的效果 # coding=utf-8 import random from PIL import Image, Im

  • Python文字截图识别OCR工具实例解析

    一.简介 你一定用过那种"OCR神器",可以把图片中的文字提取出来,极大的提高工作效率. 今天,我们就来做一款实时截图识别的小工具.顾名思义,运行程序时,可以实时把你截出来的图片中的文字识别出来. 二.模块 import keyboard # 用于监控键盘按下,触发事件(pip install keyboard) import time from aip import AipOcr # 调用百度接口(pip install baidu-aip) from PIL import Imag

  • Python环境配置实现pip加速过程解析

    背景 学习 Python 的话,仅掌握标准库是远不够的,有很多好用的第三方库我们也需要用到的,比如,由鼎鼎大名的 K 神开发的爬虫必不可少的 requests 库,一般都是必装的库吧.安装第三方库当然还是用 pip 命令安装最方便了. 但是,大家发现 pip install + 包名 的方式 安装第三方库的时候,下载速度很慢,有时还会超时,遇到第三方库比较大时候,是真的很慢,我刚开始学 Python 的时候,我就大意了,没想到这么慢.话说有时都提裤子了,它却报安装超时了...咳咳,言归正传,今天

  • Python中的十大图像处理工具(小结)

    Python之成为图像处理任务的最佳选择,是因为这一科学编程语言日益普及,并且其自身免费提供许多最先进的图像处理工具.本文主要介绍了一些简单易懂最常用的Python图像处理库. 当今世界充满了各种数据,而图像是其中高的重要组成部分.然而,若想其有所应用,我们需要对这些图像进行处理.图像处理是分析和操纵数字图像的过程,旨在提高其质量或从中提取一些信息,然后将其用于某些方面. 图像处理中的常见任务包括显示图像,基本操作(如裁剪.翻转.旋转等),图像分割,分类和特征提取,图像恢复和图像识别等. Pyt

  • Python 3.6 -win64环境安装PIL模块的教程

    PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow. 32位的电脑环境安装pillow 如果安装了Anaconda,Pillow就已经可用了.否则,需要在命令行下通过pip安装: $ pip

  • Python Pillow(PIL)库的用法详解

    Pillow库是一个Python的第三方库. 在Python2中,PIL(Python Imaging Library)是一个非常好用的图像处理库,但PIL不支持Python3,所以有人(Alex Clark和Contributors)提供了Pillow,可以在Python3中使用. 官方文档路径:https://pillow.readthedocs.io/en/latest/ 一.安装Pillow pip install pillow Pillow库安装成功后,导包时要用PIL来导入,而不能用

  • 详解python opencv、scikit-image和PIL图像处理库比较

    进行深度学习时,对图像进行预处理的过程是非常重要的,使用pytorch或者TensorFlow时需要对图像进行预处理以及展示来观看处理效果,因此对python中的图像处理框架进行图像的读取和基本变换的掌握是必要的,接下来python中几个基本的图像处理库进行纵向对比. 项目地址:https://github.com/Oldpan/Pytorch-Learn/tree/master/Image-Processing 比较的图像处理框架: PIL scikit-image opencv-python

随机推荐