Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2339523
  • 博文数量: 168
  • 博客积分: 3184
  • 博客等级: 中校
  • 技术积分: 3959
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-12 18:57
文章存档

2019年(1)

2018年(2)

2017年(3)

2016年(15)

2015年(10)

2014年(60)

2011年(1)

2010年(76)

分类: Python/Ruby

2014-07-16 10:25:56

1. 简介。

    图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴。PIL (Python Imaging Library)是 Python 中最常用的图像处理库,目前版本为 1.1.7,我们可以  下载学习和查找资料。

    Image 类是 PIL 库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像和通过抓取的方法得到的图像这三种方法。

2. 使用。

    导入 Image 模块。然后通过 Image 类中的 open 方法即可载入一个图像文件。如果载入文件失败,则会引起一个 IOError ;若无返回错误,则 open 函数返回一个 Image 对象。现在,我们可以通过一些对象属性来检查文件内容,即:

1 >>> import Image 2  >>> im = Image.open("j.jpg") 3  >>> print im.format, im.size, im.mode 4 JPEG (440, 330) RGB

    这里有三个属性,我们逐一了解。

        format : 识别图像的源格式,如果该文件不是从文件中读取的,则被置为 None 值。

        size : 返回的一个元组,有两个元素,其值为象素意义上的宽和高。

        mode : RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)。

    现在,我们可以使用一些在 Image 类中定义的方法来操作已读取的图像实例。比如,显示最新载入的图像:

1 >>>im.show() 2  >>>

    输出原图:

3. 函数概貌。

3.1    Reading and Writing Images : open( infilename ) , save( outfilename )

3.2    Cutting and Pasting and Merging Images :

        crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。

        paste() : 

        merge() :

复制代码
1 >>> box = (100, 100, 200, 200) 2  >>> region = im.crop(box) 3  >>> region.show() 4  >>> region = region.transpose(Image.ROTATE_180) 5  >>> region.show() 6  >>> im.paste(region, box) 7  >>> im.show()
复制代码

    其效果图为:

    旋转一幅图片:

复制代码
 1 def roll(image, delta):  2  "Roll an image sideways"  3   4  xsize, ysize = image.size  5   6  delta = delta % xsize  7  if delta == 0: return image  8   9  part1 = image.crop((0, 0, delta, ysize)) 10  part2 = image.crop((delta, 0, xsize, ysize)) 11  image.paste(part2, (0, 0, xsize-delta, ysize)) 12  image.paste(part1, (xsize-delta, 0, xsize, ysize)) 13  14  return image
复制代码
3.3    几何变换。

3.3.1    简单的几何变换。

复制代码
1 >>>out = im.resize((128, 128)) # 2  >>>out = im.rotate(45)  #逆时针旋转 45 度角。 3  >>>out = im.transpose(Image.FLIP_LEFT_RIGHT) #左右对换。 4  >>>out = im.transpose(Image.FLIP_TOP_BOTTOM) #上下对换。 5  >>>out = im.transpose(Image.ROTATE_90) #旋转 90 度角。 6  >>>out = im.transpose(Image.ROTATE_180) #旋转 180 度角。 7 >>>out = im.transpose(Image.ROTATE_270) #旋转 270 度角。
复制代码

    各个调整之后的图像为:

    图片1:

    图片2:

    图片3:

    图片4:

3.3.2    色彩空间变换。

    convert() : 该函数可以用来将图像转换为不同色彩模式。

3.3.3    图像增强。

    Filters : 在 ImageFilter 模块中可以使用 filter 函数来使用模块中一系列预定义的增强滤镜。


1 >>> import ImageFilter 2 >>> imfilter = im.filter(ImageFilter.DETAIL) 3 >>> imfilter.show()
3.4    序列图像。


    即我们常见到的动态图,最常见的后缀为 .gif ,另外还有 FLI / FLC 。PIL 库对这种动画格式图也提供了一些基本的支持。当我们打开这类图像文件时,PIL 自动载入图像的第一帧。我们可以使用 seek 和 tell 方法在各帧之间移动。


复制代码
1 import Image 2 im.seek(1) # skip to the second frame 3  4 try: 5  while 1: 6  im.seek( im.tell() + 1) 7  # do something to im 8 except EOFError: 9  pass
复制代码


3.5    更多关于图像文件的读取。

    最基本的方式:im = Image.open("filename")

    类文件读取:fp = open("filename", "rb"); im = Image.open(fp)

    字符串数据读取:import StringIO; im = Image.open(StringIO.StringIO(buffer))

    从归档文件读取:import TarIO; fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm"); im = Image.open(fp)

基本的 PIL 目前就练习到这里。其他函数的功能可点击  进一步阅读。





关于PIL库的一些概念


pil能处理的图片类型
pil可以处理光栅图片(像素数据组成的的块)。

通道
一个图片可以包含一到多个数据通道,如果这些通道具有相同的维数和深度,Pil允许将这些通道进行叠加

模式

1  1位像素,黑和白,存成8位的像素
L  8位像素,黑白
P  8位像素,使用调色板映射到任何其他模式
RGB  3×8位像素,真彩
RGBA  4×8位像素,真彩+透明通道
CMYK  4×8位像素,颜色隔离
YCbCr  3×8位像素,彩色视频格式
I  32位整型像素
F  32位浮点型像素




尺寸
通过图片对象的size属性可以得到图片的尺寸,结果这是一个二元组,包含水平和垂直方向上的像素数。

坐标
Pil采取左上角为(0,0)的坐标系统

调色板
mode("P")为每个像素定义具体的颜色值

图片信息
可以通过info属性读取一张图片的附加信息,这个与图片的格式有关。

滤镜
在对图片的几何操作中可能会将多个输入像素映射到单个的输出像素,pil提供4种不同的采样滤镜(在目前的版本中,后续的版本可能支持更多)

 

NEAREST 最近
BILINEAR 双线型
BICUBIC 双三次插值
ANTIALIAS 平滑

 

 

在RGB模式下,每个图片由三个通道叠加而成,每个模式下为一个灰度图,当有一个调色板来调色的时候,这三张灰度图的叠加即可合成3*8位(每个像素)的一个真彩图片。pil库中,图片之间的模式(mode)可以转化。下面给出一些简单的例子,例子中的所有图片均来自于国家地理的官网,为了使得文档比较短小,每个图片均使用Pil缩放成1/2大小,如有侵权嫌疑,请尽快联系,我会删除这些图片。

阅读(6855) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~