【Pillow】Python图像处理

本文地址:https://www.jianshu.com/p/3740dec1f436


1. 简介

Python传统的图像处理库PIL(Python Imaging Library ),可以说基本上是Python处理图像的标准库,功能强大,使用简单。

但是由于PIL不支持Python3,而且更新缓慢。所以有志愿者在PIL的基础上创建了一个分支版本,命名为PillowPillow目前最新支持到python3.6,更新活跃,并且增添了许多新的特性。所以我们安装Pillow即可。


2. 安装

Pillow的安装比较的简单,直接pip安装即可:

pip install Pillow

但是要注意的一点是,PillowPIL不能共存在同一个环境中,所以如果安装的有PIL的话,那么安装Pillow之前应该删除PIL

由于是继承自PIL的分支,所以Pillow的导入是这样的:

import PIL 
# 或者
from PIL import Image

3. Image

Image是Pillow中最为重要的类,实现了Pillow中大部分的功能,这个类的主要用来表示图片对象。要创建这个类的实例主要有三个方式:

  1. 从文件加载图像
  2. 处理其他图像获得
  3. 创建一个新的图像

3.1. 读取图像

一般来说,我们都是都过从文件加载图像来实例化这个类,如下所示:

from PIL import Image
picture = Image.open('happy.png')

如果没有指定图片格式的话,那么Pillow会自动识别文件内容为文件格式。

3.2. 新建图像

Pillow新建空白图像使用new()方法, 第一个参数是mode即颜色空间模式,第二个参数指定了图像的分辨率(宽x高),第三个参数是颜色。

  • 可以直接填入常用颜色的名称。如'red'。
  • 也可以填入十六进制表示的颜色,如#FF0000表示红色。
  • 还能传入元组,比如(255, 0, 0, 255)或者(255, 0, 0)表示红色。
picture = Image.new('RGB', (200, 100), 'red')

3.3. 保存图像

保存图片的话需要使用save()方法:

picture.save('happy.png')

保存的时候,如果没有指定图片格式的话,那么Pillow会根据输入的后缀名决定保存的文件格式。


3.4. 图像的坐标表示

在Pillow中,用的是图像的左上角为坐标的原点(0,0),所以这意味着,x轴的数值是从左到右增长的,y轴的数值是从上到下增长的。

我们处理图像时,常常需要去表示一个矩形的图像区域。Pillow中很多方法都需要传入一个表示矩形区域的元祖参数。

这个元组参数包含四个值,分别代表矩形四条边的距离X轴或者Y轴的距离。顺序是(左,顶,右,底)。其实就相当于,矩形的左上顶点坐标为(左,顶),矩形的右下顶点坐标为(右,底),两个顶点就可以确定一个矩形的位置。

右和底坐标稍微特殊,跟python列表索引规则一样,是左闭又开的。可以理解为[左, 右)[顶, 底)这样左闭右开的区间。比如(3, 2, 8, 9)就表示了横坐标范围[3, 7];纵坐标范围[2, 8]的矩形区域。


3.5. 常用属性

  • PIL.Image.filename

    图像源文件的文件名或者路径,只有使用open()方法创建的对象有这个属性。

    类型:字符串

  • PIL.Image.format

    图像源文件的文件格式。

  • PIL.Image.mode

    图像的模式,一般来说是“1”, “L”, “RGB”, 或者“CMYK” 。

  • PIL.Image.size

    图像的大小

  • PIL.Image.width

    图像的宽度

  • PIL.Image.height

    图像的高度

  • PIL.Image.info

    图像的一些信息,为字典格式


3.6. 常用方法

3.6.1. 裁剪图片

Image使用crop()方法来裁剪图像,此方法需要传入一个矩形元祖参数,返回一个新的Image对象,对原图没有影响。

croped_im = im.crop((100, 100, 200, 200))

3.6.2. 复制与粘贴图像

复制图像使用copy()方法:

copyed_im = im.copy()

粘贴图像使用paste()方法:

croped_im = im.crop((100, 100, 200, 200))
im.paste(croped_im, (0, 0))

im对象调用了paste()方法,第一个参数是被裁剪下来用来粘贴的图像,第二个参数是一个位置参数元祖,这个位置参数是粘贴的图像的左顶点。

3.6.3 调整图像的大小

调整图像大小使用resize()方法:

resized_im = im.resize((width, height))

resize()方法会返回一个重设了大小的Image对象。

3.6.4. 旋转图像和翻转图像

旋转图像使用rotate()方法,此方法按逆时针旋转,并返回一个新的Image对象:

# 逆时针旋转90度
im.rotate(90)
im.rotate(180)
im.rotate(20, expand=True)

旋转的时候,会将图片超出边界的边角裁剪掉。如果加入expand=True参数,就可以将图片边角保存住。

翻转图像使用transpose()

# 水平翻转
im.transpose(Image.FLIP_LEFT_RIGHT)
# 垂直翻转
im.transpose(Image.FLIP_TOP_BOTTOM)

3.6.5. 获取单个像素的值

使用getpixel(xy)方法可以获取单个像素位置的值:

im.getpixel((100, 100))

传入的xy需要是一个元祖形式的坐标。

如果图片是多通道的,那么返回的是一个元祖。

3.6.6. 通过通道分割图片

split()

split()可以将多通道图片按通道分割为单通道图片:

R, G, B = im.split()

split()方法返回的是一个元祖,元祖中的元素则是分割后的单个通道的值。

getchannel(channel)

getchannel()可以获取单个通道的数据:

R = im.getchannel("R")

3.6.7. 加载图片全部数据

我们可以使用load()方法加载图片所有的数据,并比较方便的修改像素的值:

pixdata = im.load()
pixdata[100,200] = 255

此方法返回的是一个PIL.PyAccess,可以通过这个类的索引来对指定坐标的像素点进行修改。

3.6.8. 关闭图片并释放内存

此方法会删除图片对象并释放内存

im.close()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容