鱼C论坛

 找回密码
 立即注册
查看: 5130|回复: 2

[技术交流] Pillow库官方文档翻译-快速上手(二)

[复制链接]
发表于 2016-6-7 21:16:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不好意思 因为 readthedocs 这几天编译服务器挂了一直没能同步上最新译文, 直到今天才成功同步, 让大家久等了

让我们接着上节讲~ 点我直达上节


裁剪, 粘贴 和 合成图片

Image 类包含了可以让你操作图片的方法. 当你想从图片截取一部分的时候, 直接用 crop() 方法.

从图像中拷贝出子矩形

  1. box = (100, 100, 400, 400)
  2. region = im.crop(box)
复制代码

这个图像区域由含有4个元素的元组组成, 这四个元素分别代表 (左, 上, 右, 下). Python Imaging Library 使用(0, 0)来表示在左上角的情况. 另外值得注意的是, 这些坐标的单位是像素(px), 所以上面的例子实际上表示了 300x300 像素.

这个图像区域现在可以在某些情况下进行处理.

在原图像中处理子矩形

  1. region = region.transpose(Image.ROTATE_180)
  2. im.paste(region, box)
复制代码

当你修改原图像的时候, 图像区域的大小必须和原图像保持一致. 另外, 图像区域不能扩充到图像便捷之外. 尽管如此, 原图像和目标图像的模式不必保持一致. 如果不一致, 目标图像会在保存的时候自动进行转换, 详见 色彩转换 .

接下来是扩展实例:

翻转图像

  1. def roll(image, delta):
  2.     "Roll an image sideways"

  3.     xsize, ysize = image.size

  4.     delta = delta % xsize
  5.     if delta == 0: return image

  6.     part1 = image.crop((0, 0, delta, ysize))
  7.     part2 = image.crop((delta, 0, xsize, ysize))
  8.     part1.load()
  9.     part2.load()
  10.     image.paste(part2, (0, 0, xsize-delta, ysize))
  11.     image.paste(part1, (xsize-delta, 0, xsize, ysize))

  12.     return image
复制代码

值得注意的是, 当你使用 crop() 方法来修改图像文件的时候, load() 方法会首先被调用. 这是由于修改是一个惰性操作. 如果 load() 未被调用, 那么在保存修改之前都不会执行修改这个操作. 这暗示着 part1 会在首次修改 image 的时候被修改.

至于更多黑魔法, paste方法也可以传入一个表示透明度的可选参数. 当你使用了这个黑魔法, 传入255这个值将会使图像变得不透明. 反之传入0则会使图像完全透明. 传入中间值则会使图片半透明. 例如, 修改一个 RGBA 图像并且使用透明度参数将会影响他的前景色透明度, 而并不会影响他的背景色透明度.

Python Imaging Library 同样允许你操作多波段的图片, 比如RGB图片. split 方法会创建一个图片集合, 每一个表示了这个图片的一个波段. merge 方法需要传入一个mode参数和一个图片的元组, 然后融合这个图像. 以下示例演示了如何分割三波段的 RGB 图片:


分割与合并波段

  1. r, g, b = im.split()
  2. im = Image.merge("RGB", (b, g, r))
复制代码

值得注意的是单一波段的图片, split() 返回这个图像本身. 如果需要操作不同波段, 可能需要你先把图片转换成 RGB 格式.


几何变换

PIL.Image.Image 类包含了 resize() 和 rotate() 方法来操作图像. 前者需要传入一个表示新大小的元组, 而后者则需要传入旋转的角度.

简单的几何变换

  1. out = im.resize((128, 128))
  2. out = im.rotate(45) # degrees counter-clockwise
复制代码

要想以90度旋转图片, 你既可以使用 rotate() 方法, 也可以使用 transpose() 方法. 后者也能水平或者垂直翻转图像.

旋转图像

  1. out = im.transpose(Image.FLIP_LEFT_RIGHT)
  2. out = im.transpose(Image.FLIP_TOP_BOTTOM)
  3. out = im.transpose(Image.ROTATE_90)
  4. out = im.transpose(Image.ROTATE_180)
  5. out = im.transpose(Image.ROTATE_270)
复制代码

使用 rotate() 也能完成 transpose(ROTATE) 操作, 把 expand 参数设置为 True 来同时修改图片的尺寸.

至于修改图片方向的一般方法是使用 transform() 方法.

色彩转换

Python Imaging Library 允许你使用 convert() 方法, 以像素为单位修改图像.

模式转换

  1. im = Image.open("lena.ppm").convert("L")
复制代码

这个库支持 “L” 模式和 “RGB” 模式的互相转换. 要想转换到其他的模式, 可能需要使用一个中介模式, 比如 “RGB”.


图像效果增强

Python Imaging Library 提供了一些用来增强图像效果的方法和模块.

滤镜

ImageFilter 模块内置一个预定义的图像效果增强的滤镜, 可用 filter() 方法来实现效果增强.

使用滤镜

  1. from PIL import ImageFilter
  2. out = im.filter(ImageFilter.DETAIL)
复制代码

浮点运算

point() 方法用来转换图片的像素值, 例如图像的对比度. 绝大多数情况下, 一个函数对象需要一个参数传入这个方法. 每一个像素将会被这个函数处理:

使用浮点运算

  1. # multiply each pixel by 1.2
  2. out = im.point(lambda i: i * 1.2)
复制代码

运行上述代码, 就能轻松处理一个图像. 另外你也可以结合 point() 方法和 paste() 方法来有的放矢的修改图像:

处理不同波段

  1. # split the image into individual bands
  2. source = im.split()

  3. R, G, B = 0, 1, 2

  4. # select regions where red is less than 100
  5. mask = source[R].point(lambda i: i < 100 and 255)

  6. # process the green band
  7. out = source[G].point(lambda i: i * 0.7)

  8. # paste the processed band back, but only where red was < 100
  9. source[G].paste(out, None, mask)

  10. # build a new multiband image
  11. im = Image.merge(im.mode, source)
复制代码

请注意这里的语法:

  1. imout = im.point(lambda i: expression and 255)
复制代码

Python 只会计算结果所需的逻辑表达式, 并返回最后一个表达式的计算结果. 所以, 如果存在某个表达式返回了 false 也就是0, Python 不会进行后续的计算并且返回0, 反之则返回255.


效果增强

更多图像增强效果, 都能在 ImageEnhance 模块中找到. 一旦你实例化了一个图像, 效果增强对象就可以直接调用了.

你可以像这样修改对比度, 亮度, 色彩平衡度和锐度.

效果增强

  1. from PIL import ImageEnhance

  2. enh = ImageEnhance.Contrast(im)
  3. enh.enhance(1.3).show("30% more contrast")
复制代码


下一节 -> Pillow库官方文档翻译-快速上手(三)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-8 07:46:41 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-8 10:10:49 | 显示全部楼层
学习分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 01:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表