PIL全称Python Image Library,是python官方的图像处理库,包含各种图像处理模块。Pillow是PIL的一个派生分支,包含与PIL相同的功能,并且更灵活。python3.0之后,PIL不再更新,pillow代替了它原有的地位。Pillow的官方文档:

  https://pillow.readthedocs.io/en/stable/reference/index.html

  在调用pillow时,代码依然是写成PIL,模块导入方式如下:

from PIL import Image,ImageFilter 

  下面介绍基本用法。

Image

  Image是pillow最基本的模块,包含用于保存图像对象的类。

图像导入、旋转、显示、保存

from PIL import Image
img = Image.open('1.jpg')
img = img.rotate(45)
img.show()
img.save('r.jpg')

  图像导入后保存为Image对象,该对象自带各种函数,包括图像处理操作、显示、保存等功能,大部分操作返回的依然是Image对象。需要注意的是,open函数执行的时候并没有立即把图像像素数据导入,仅仅是对图像文件添加占用标记,直到图像真正需要用于计算时,才会把像素数据导入。以上代码结果如下:

Numpy.array与Image之间的转换

Image到array

import numpy as np
from PIL import Image img = Image.open('1.jpg')
a = np.array(img)
print(a.shape, a.dtype)

  对于读取的图像,在Image对象中,图像默认以RGB模式保存,且各个像素值默认用 8bit 的无符号整型来存,不论图像以什么类型保存。因此转换为array后dtype是uint8,不像matplotlib,png是float32,而jpg是uint8。其它图像模式看官方文档:

  https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-modes

array到Image

import numpy as np
from PIL import Image a = np.random.random([256,256,3])*255
a = np.array(a,dtype = np.uint8)
img = Image.fromarray(a)
img.show()

  array必须先将数据类型转换到uint8才能转换成Image,否则会出错,尽管文档中写着能有限地支持浮点类型。

图像模式转换

from PIL import Image

img = Image.open('1.jpg').convert('1')
img.show()

  以上代码将Image模式从RGB转换为1,也就是黑白两色。效果如下:

  图像转换后,Image对象所对应的像素值以及对应的数据类型也就变了。显示的时候,Pillow会以对应的模式来显示。可以做如下实验,先将图像转变为YCbCr模式,然后分别直接显示和转变成array后在matplotlib中显示,代码如下:

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image img = Image.open('1.jpg').convert('YCbCr')
img.show() # 直接显示
img = np.array(img)
plt.imshow(img)# matplotlib中显示
plt.axis('off')
plt.show()

  两个效果分别如下:

  可以看出,pillow 对转换成 YCbCr 模式的图像能以对应的模式显示,而因为 matplotlib 是以RGB模式来显示的,因此 YCbCr 模式的图像会呈现右图效果。

图像缩放

等比例缩放

from PIL import Image 

size = 80,80
img = Image.open('1.jpg')
img.thumbnail(size)
img.show()

  按等比例缩小图像,长宽都小于等于size。需要注意的是,这个操作是直接作用与原对象上,返回为None。而通常的操作则是返回处理得到的新对象,原对象不改变,比如上面的rotate。所以这个函数的实现有点问题,和其它的特性不同,容易导致出错,最好少用。

直接缩放

img = img.resize([128,128],Image.BICUBIC,box = (10,50,1200,1000))

  三个参数分别表示:目标大小 (宽,高),采样方式,用于缩放的图像区域。

图像混合

无透明通道

from PIL import Image 

img1 = Image.open('1.jpg')
img2 = Image.open('2.jpg')
img = Image.blend(img1,img2,0.5)
img.show()

  将两张图像按$\alpha : (1-\alpha)$的透明度混合,$\alpha$可以不在$(0,1)$内,结果像素值会裁剪到合理范围内。显示结果如下:

有透明通道

img = Image.alpha_composite(img1,img2)

  其中两张图像必须都有$\alpha$通道。

自定义混合

import numpy as np
from PIL import Image img1 = Image.open('1.jpg')
img2 = Image.open('2.jpg')
mask = np.ones([img1.size[1],img1.size[0]],dtype=np.uint8)
mask[:,img1.size[0]//2:] *= 175
mask[:,:img1.size[0]//2] *= 80
mask = Image.fromarray(mask)
img = Image.composite(img1,img2,mask)
img.show()

  composite函数使用mask对两张图像进行混合,从而不同的位置可以定义不同的透明度,以上代码效果如下:

单像素处理

from PIL import Image
import numpy as np
img = Image.open('1.jpg')
img = Image.eval(img, lambda x : x*np.random.rand()*2)
img.show()

  eval第二个参数传入对单一像素的操作,这个操作会作用在整张图像的每个像素值上。效果如下:

旋转、镜像

from PIL import Image

img = Image.open('1.jpg')
img = img.transpose(1)
img.show()

  transpose 有0~6共7个输入,代表图像7个旋转、镜像方向,加上原图,一共8个方向。

ImageFilter

  这个模块用于图像的滤波处理。用法也是基于Image模块。基本用法如下:

from PIL import Image,ImageFilter

img = Image.open('1.jpg')
img = img.filter(ImageFilter.GaussianBlur(5))
img.show()

  将ImageFilter的函数作为参数输入filter中。还有很多种滤波方式,不一一列举。

其它模块

  ImageEnhance:用于图像增强,如锐化、增亮。

  ImageGrab:用于截屏或读取剪贴板获取图像。

  ImageDraw:用于绘制简单的线条和标记。

  还有很多模块,但感觉用起来还不如numpy+matplotlib方便,不在此记录,有需要请看官方文档。

Python图像处理库——PIL的更多相关文章

  1. Python图像处理库PIL中图像格式转换(一)

    在数字图像处理中,针对不同的图像格式有其特定的处理算法. 所以,在做图像处理之前,我们须要考虑清楚自己要基于哪种格式的图像进行算法设计及事实上现.本文基于这个需求.使用python中的图像处理库PIL ...

  2. Python图像处理库PIL中图像格式转换

    o 在数字图像处理中,针对不同的图像格式有其特定的处理算法.所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现.本文基于这个需求,使用python中的图像处理库PIL ...

  3. Python图像处理库(PIL)

    官方:(详细)http://pillow.readthedocs.io/en/3.1.x/reference/ImageDraw.html http://pillow.readthedocs.io/e ...

  4. python图像处理库PIL的基本概念介绍

    PIL中所涉及的基本概念有如下几个:通道(bands).模式(mode).尺寸(size).坐标系统(coordinate system).调色板(palette).信息(info)和滤波器(filt ...

  5. Python图像处理库PIL的ImageSequence模块介绍

    ImageSequence模块包括了一个wrapper类,它能够让用户迭代訪问图形序列中每一帧图像. 一.ImageSequence模块的函数 1.  Iterator 定义:ImageSequenc ...

  6. Python图像处理库PIL的ImageStat模块介绍

    ImageStat模块用于计算整个图像或者图像的一个区域的统计数据. 一.ImageStat模块的函数 1.  Stat 定义1:ImageStat.Stat(image)⇒ Stat instanc ...

  7. Python图像处理库PIL从入门到精通

    https://blog.csdn.net/column/details/pythonpil.html 示例: from PIL import Image import pytesseract pyt ...

  8. Python图像处理库:PIL中Image,ImageDraw等基本模块介绍

    Python图像处理库:PIL中Image,ImageDraw等基本模块介绍 标签: 图像处理PILPYTHON 2016-08-19 10:58 461人阅读 评论(0) 收藏 举报  分类: 其他 ...

  9. Python图像处理库:Pillow 初级教程

    Python图像处理库:Pillow 初级教程 2014-09-14 翻译 http://pillow.readthedocs.org/en/latest/handbook/tutorial.html ...

随机推荐

  1. MBP 2018

    MBP 2018 touch pad MacBook Pro 如何调节键盘背光 https://support.apple.com/zh-cn/HT202310 F6 & F5 如何清洁 Ma ...

  2. scrimba & interactive free online tutorials

    scrimba & interactive free online tutorials https://github.com/scrimba/community/blob/master/FAQ ...

  3. 如何理解NGK的Layer2-侧链?

    对于 NGK来说,Layer-2越来越重要,并成为共识.但是,"Layer-2" 是个不精确的标签.有些人说起 "Layer-2" 时,仅仅指的是 " ...

  4. [转]ubuntu系统重新分区、根目录扩容

    原文地址:https://blog.csdn.net/code_segment/article/details/79237500,转载主要方便随时查阅,如有版权要求,请及时联系. gparted是一款 ...

  5. 发布Jar包到maven中央仓库

    什么是maven中央仓库 maven是java世界最流行的构建工具,构建内容囊括了一个java项目的整个生命周期.其中最重要的功能就是依赖管理,maven通过一个类似云的ftp站点统一管理所有java ...

  6. 总结 接口 final关键字 abstract关键字 static 关键字

    final关键字: * final 修饰的方法能被继承 不能被重写 * final修饰的类不能被继承 * final 修饰的变量(基本类型)不能被修改 * final 修饰的成员变量必须初始化 局部变 ...

  7. Vue学习笔记-VSCode安装与配置

    一  使用环境: windows 7 64位操作系统 二  VSCode安装与配置  1.下载: https://code.visualstudio.com 直接点击即可. 2. 点击按装程序,默认安 ...

  8. pwn篇:攻防世界进阶welpwn,LibcSearcher使用

    攻防世界welpwn (搬运一篇自己在CSDN写的帖子) 链接:https://blog.csdn.net/weixin_44644249/article/details/113781356 这题主要 ...

  9. wxWidgets源码分析(9) - wxString

    目录 wxString wxString的中文字符支持 Windows Linux Unicode Linux UTF-8 总结 wxString与通用字符串的转换 wxString对象的创建 将wx ...

  10. Pyqt5实现model/View,解决tableView出现空白行问题。

    项目中表格需要显示5万条数据以上,并且实时刷新.开始使用的tableWidget,数据量一大显得力不从心,所以使用Qt的Model/View来重新实现.下面是更改之前编写的小Demo. import ...