目录
-
Python lmaging Library(PIL)是 python 下的图像处理模块,支持多种格式,并提供了强大的图像处理功能,可以通过 pip 进行安装。
-
PIL 模块的官方版本只支持 Python2,pillow 完美支持 Python3
pillow
Pillow 是 PIL 的一个派生分支,但如今已经发展成为比 PIL 本身更具活力的图像处理库。pillow 可以说已经取代了 PIL,将其封装成python的库(pip即可安装),且支持 python2 和 python3
Pillow的Github主页:https://github.com/python-pillow/Pillow
Pillow的文档(对应版本v3.0.0):
https://pillow.readthedocs.org/en/latest/handbook/index.html
基本操作
# 下载安装
pip install pillow
# python2
import Image
# python3(因为是派生的PIL库,所以要导入PIL中的Image)
from PIL import Image
# 打开图像文件
im = Image.open('sample.jpg') # 这个对象 会在下面多次的用到
# 生成新图像文件
im = Image.new('RGB', (200, 100), (255, 255, 255))
# 显示图像
im.show()
查看图像信息
# 查看图像的信息
print(im.format)
print(im.size) # 大小
# 查看图像直方图,图像如果是 RGB 则返回三组数,如果是灰度图则 返回一组数
print(im.histogram())
灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。
查看图像 像素值
# 读取图片的像素值
print(im.getpixel((100, 50))) # 100, 50 是指定图片的位置的颜色 像素值
# 如果说彩色图像 那么返回的就是一个元组
(124, 126, 123) # 红绿蓝 颜色的三个分量
# 如果是 灰度图像那么返回的就是一个数值
87
# 设置像素值
im.putpixel((100, 50), (128, 30, 120)) # 设置该图片指定位置的 RGB 颜色值
# 如果是灰度图像 那么只需要设置一个值
图像保存
# 保存图像文件
im.save('新名字.jpg')
# 转换图像格式
im.save('名字.你改的格式')
图像的角度转换
# 图像缩放
im_1 = im.resize((100, 100)) # 返回的是新图像,我们需要保存下来
# 逆时针旋转图像,rotate 方法支持任意角度的旋转,
# 而transpose方法支持部份特殊角度的旋转,如 90、180、270以及水平、垂直翻转
im_2 = im.rotate(90) # l < 0 < r
im_3 = im.transpose(Image.ROTATE_180)
im_3 = im.transpose(Image.FLIP_LEFT_RIGHT) # 左右水平 旋转
im_3 = im.transpose(Image.FLIP_TOP_BOTTOm) # 上下水平 翻转
图像的裁剪与粘贴
from PIL import Image
im = Image.open('sample.jpg')
box = (120, 194, 220, 294)
# 在原图片将 box 区域裁剪下来
region = im.crop(box) # region也是 img 对象哦,所以就可以使用 图像对象的所有方法 ↓ 例
# 将裁剪下来的图片 翻转180 (倒过来了)
region = region.transpose(Image_ROTATE_180)
# 原图片粘贴: 翻转后的图片 粘贴到 原图片的 box 区域上 注: 这里是粘贴,不是修补
im.paste(region, box)
im.show()
图像 像素增强减弱 ImageFilter
# 将色彩图像分离为红、绿、蓝 三分量子图,分离后每个图像大小与原图像一样,但是只包含一个颜色分量
r, g, b = im.split()
# 图像增强
from PIL import ImageFilter
im_4 = im.filter(ImageFilter.DETAIL)
# 图像模糊
im_4 = im.filter(ImageFilter.BLUR)
# 图像边缘提取
im_4 = im.filter(ImageFilter.FIND_EDGES)
# 别忘了
im_4.show()
图像样式 色调
- point
点分制图像 - ImageEnhance
图像增强模块 - merge
子图合并图像
# 图像的点运算,整体 变亮 / 变暗
im_5 = im.point(lambda i:i*1.3)
im_5 = im.point(lambda i:i*0.7)
--------------------- ↑ ↓两者都可以实现 ----------------------
# 使用图像增强模块来调整亮度
from PIL import ImageEnhance
enh = ImageEngance.Brightness(im)
enh.enhance(1.3).show()
# 图像对比度增强
im = Image.open('sample.jpg')
im.show()
from PIL import ImageEnhance
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show()
# 图像冷暖色调的调整
r, g, b = im.split() # 将图片分割成 红绿蓝 三个
r = r.point(lambda i:i*1.3) # 红色增强
g = g.point(lambda i:i*0.9) # 绿色减弱
b = b.point(lambda i:0) # 蓝色减为 0
im_6 = Image.merge(im.mode, (r, g, b)) # merge合并
im_6.show()
图像帧操作
# 将 gif图片 一帧一帧的抓取为图片
im = Image.open('test.gif')
try:
while True:
current = im.tell() # 获取img对象的 帧图片
im.save() # 保存
im.seek(current + 1) # seek的作用就相当于 装饰器的 next,代表下一个
except EOFError:
pass