Pillow教程(一)

传统的PIL库不支持python3,所以使用从PIL派生出来的Pillow库。

Image类

Pillow中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片。

使用Image模块中的open函数打开一张图片:

from PIL import Image

im = Image.open('1.gif')
print(im)
print(im.format,im.size,im.mode)

如果打开成功,返回一个Image对象,可以通过对象属性检查文件内容

<PIL.GifImagePlugin.GifImageFile image mode=P size=170x288 at 0x567748>
GIF (170, 288) P
  • format属性定义了图像的格式,如果图像不是从文件打开的,那么该属性值为None;
  • size属性是一个tuple,表示图像的宽和高(单位为像素);
  • mode属性为表示图像的模式.
    模式属性如下:
11位像素,黑和白,存成8位的像素
L 8位像素,黑白
P8位像素,使用调色板映射到任何其他模式
RGB3×8位像素,真彩
RGBA4×8位像素,真彩+透明通道
CMYK4×8位像素,颜色隔离
YCbCr3×8位像素,彩色视频格式
I32位整型像素
F32位浮点型像素

当有一个Image对象时,可以用Image类的各个方法进行处理和操作图像,例如显示图片。

im.show()

PS:标准版本的show()方法不是很有效率,因为它先将图像保存为一个临时文件,然后使用查看器进行显示。

读写图片

Pillow库支持相当多的图片格式。直接使用Image模块中的open()函数读取图片,而不必先处理图片的格式,Pillow库自动根据文件决定格式。

Image模块中的save()函数可以保存图片,除非你指定文件格式,那么文件名中的扩展名用来指定文件格式。

im = Image.open('1.gif')
im.save('f.BMP')

通常,save用以保存一个临时的image对象到硬盘。而转换工作由一个功能更为强大的convert()方法来完成。

拷贝,粘贴,合并图片

from PIL import Image

im = Image.open('tu.jpg')
#设置要拷贝的区域  
box = (100, 100, 500, 500)

# 将im表示的图片对象拷贝到region中,大小为(400*400)像素。
# 这个region可以用来后续的操作(region其实就是一个Image对象),
# box变量是一个四元组(左,上,右,下)。  
region  = im.crop(box)

# 从字面上就可以看出,先把region中的Image反转180度,然后再放回到region中。  
region = region.transpose(Image.ROTATE_90)
#粘贴box大小的region到原先的图片对象中。  
im.paste(region, box)
im.save('1.jpg')

这里写图片描述

区域由4-tuple决定,该tuple中信息为(left, upper, right, lower),Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点。
上面示例粘贴后的图片是临时性,需要save保存成新图片。

box = im.copy() #直接复制图像
分离和合并通道

每一个RGB都是由三个通道的灰度图叠加的,所以pil提供了将这三个通道分离的方法.
对于单通道图片,split()返回图像本身。为了处理单通道图片,必须先将图片转成RGB。

r,g,b = im.split()#分割成三个通道  
im = Image.merge("RGB", (b, g, r))  #将b,r两个通道进行翻转。 
im.save('rgb.jpg')

这里写图片描述

几何转变

Image类有resize()、rotate()和transpose()、transform()方法进行几何变换,用以重定义图片大小,对图片进行旋转等操作。
简单几何变换:

out = im.resize( ( 128,128))
out = im.rotate(45)

这里写图片描述
置换图像:

# 左右翻转
out = im.transpose(Image.FLIP_LEFT_RIGHT)
# 上下反向
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)

transpose()和象的rotate()没有性能差别。
这里写图片描述

模式转换

# 黑白
am = im.convert('L')
am.show()

图像增强

1.滤镜
ImageFilter模块提供了很多预定义的图片加强滤镜。
比如一个常用的滤镜,细节(detail滤镜)

from PIL import ImageFilter  

im = Image.open('tu.jpg')
out = im.filter(ImageFilter.DETAIL)  

2.直接操作像素点
可以对每个像素点进行操作,而且,每一个通道都可以独立的进行操作。比如,将每个像素点的亮度(不知道有没有更专业的词)增大20%

#注意这里用到一个匿名函数(那个可以把i的1.2倍返回的函数)  
out = im.point(lambda i : i *  1.2)

3.读写图片的更多方式
通常,我们使用open方法进行图片的打开操作。但是这不是唯一的方式。完全可以跟python的IO整合起来。

fp = open("tu.jpg", "rb")  
im = Image.open(fp)  

附件:原图
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值