[pil-handbook翻译]使用指南-5
更多图像载入方法 为了叙述的方便,Image模块里的open函数经常被用来打开像文件。在多数情况下,你只需要传给它一个文件名作为参数即可:
im = Image.open(”lena.ppm”)
如果一切顺利,返回的是一个Image实例,否则,将会引起一枚IOError异常。
你也可以用一个类文件的实列来代替文件名。这个实例必须实现read, seek 和tell方法,并以binary模式打开.
从一个打开的文件流读取:
fp = open(”lena.ppm”, “rb”)
im = Image.open(fp)
从一个字节流数据读取图像,使用StringIO类 :
从一个字节流读取:
import StringIO
im = Image.open(StringIO.StringIO(buffer))
注意,图像库可以在读取图像文件头之前就回朔图像(使用seek(0)),另外,seek也可以用于那些已经被读取的(使用load的方法)图像。如果图像被包含在一个大文件中,比如tar包,你可以使用ContainerIO或TarIO来读取它。
从一个TAR包读取
import TarIO
fp = TarIO.TarIO(”Imaging.tar”, “Imaging/test/lena.ppm”)
im = Image.open(fp)
控制编码
一些编码器允读你在读入图像之后对它进行操作。这个特性通常用于创建缩略图(效率高于图像质量)和使用单色激光打印机(仅需要一个灰度图)时.
draft方法操作的是一个打开而未载入的图像,因此它只能提供尽可能接近给定的模式和大小的结果。它是通过重新配置图像编码来完成这一功能的。
用drft模式读取:
im = Image.open(file)
print “original =”, im.mode, im.size
im.draft(”L”, (100, 100))
print “draft =”, im.mode, im.size
打印出的信息大概是这样:
original = RGB (512, 512)
draft = L (128, 128)
请注意,这里的结果图像并没有跟给定的模式与大小完全吻合。如果要确定结果不大于给定的大小,需使用thumbnail方法.
上一页 PIL目录
注:后面是一些概念和库说明什么的,没啥好翻 翻译到此为此
原文链接
[pil-handbook翻译]使用指南-4
图像序列(动画)
PIL包含对图像序列(也叫动画格式)的基本支持。所支持的序列图格式包括FLI/FLC, GIF和一部分还在试验中的格式。TIFF同样可以包含超过一帧的图像。
当你打开一个图像序列文件,PIL自动载入这个序列的第一帧。
你可以使用seek和tell方法在不同的帧之间移动:
Example: Reading sequences
import Image
im = Image.open(”animation.gif”)
im.seek(1) # skip to the second frame
try:
while 1:
im.seek(im.tell()+1)
# do something to im
except EOFError:
pass # end of sequence
如这个例子所示,当序列结束时你将得到一个EOFError异常。
注意,在当前库版本中的大部分方法都只允许你称动到下一帧(如上面的例子所示)。如果要回溯图像,你可以重新打开.
下面这个iterator类使你可以用for语名来循环图像序列:
Example: A sequence iterator class
class ImageSequence:
def __init__(self, im):
self.im = im
def __getitem__(self, ix):
try:
if ix:
self.im.seek(ix)
return self.im
except EOFError:
raise IndexError # end of sequence
for frame in ImageSequence(im):
# …do something to frame…
Postscript [...]
[pil-handbook翻译]指用指南-3
颜色转换
使用convert函数,PIL让你可以在不同的图像模式之间转换。
Example: 转换模式
im = Image.open(”lena.ppm”).convert(”L”)
图像库支持所有图像模式到 “L”和”RGB”模式之间的转换。如果需要在其它两种模式之间转化,你可以使用一个中间图像(一般是一枚”RGB”图像)
图像增强
PIL提供了许多方法和模块来支持图像增强。
滤镜
ImageFilter模块预置了一系列图像增强滤镜与filter方法一起使用。
Example: 应用滤镜
import ImageFilter
out = im.filter(ImageFilter.DETAIL)
象素操作
point方法可以用来改变一个图像象素点的值。(例,图像对比操作)。在大多数情况下,一个函数需要一个参数来运行。
每个象素都可以依照以下函数进行处理:
Example: Applying point transforms
# multiply each pixel by 1.2
out = im.point(lambda i: i * 1.2)
使用上述技术,你可以快速地在一枚图像上应用任何表达式。你也可以综合使用point和paste方法来选择性地修改一枚图像:
Example: 处理单个颜色通道
# split the image into individual bands
source = im.split()
R, G, B = 0, 1, 2
# select regions where red is less than [...]
[pil-handbook翻译]使用指南-2
剪切,粘贴与合并图像
Image类所包含的方法可以让你对图像的某个区域进行操作。取到图像的一个子区,可以使用crop方法。
Example: 从图像中复制一小框
box = (100, 100, 400, 400)
region = im.crop(box)
这个区域以一个四元组定义,其坐标表示为(左,上,右,下).PIL使用一个以(0,0)代表左上角的坐标系统。同时也要注意坐标指向的位置是以像素标识,所以在上面这个例子中的区域刚好是300×300像素。
现在,这个图区可以做一些处理然后粘贴回去。
Example: 处理一个子区,再贴回去
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
当粘贴一个区域时,该区域的大小必须与给定的大小吻合,另外,粘贴区也不能延展到图像外面。但是,原始图像和粘贴区域的格式并不需要一致。如果它们不一致,粘贴域会自动进行转化。(在下方的颜色转换部分会有详细讨论)
这里是另一个例子
Example: Rolling an image
def roll(image, delta):
“Roll an image sideways”
xsize, ysize = image.size
delta = delta % xsize
if delta == 0: return image
part1 = image.crop((0, 0, delta, ysize))
part2 = image.crop((delta, 0, xsize, ysize))
image.paste(part2, (0, 0, xsize-delta, ysize))
image.paste(part1, [...]
[pil-handbook翻译]使用指南-1
使用Image类
在PIL中最重要的类就是Image类,它在模块中以相同的名称定义。你可以用多种方式创建该类的实例:包括从文件中载放图像,处理其它图像所得,及从草稿中创建图像。
从文件中裁入图像,使用Imag模块中的open函数。
>>> import Image
>>> im = Image.open(”lena.ppm”)
如果成功,函数返回一个Image对象。现在,你可以使用实例属性来检视文件内容了。
>>> print im.format, im.size, im.mode
PPM (512, 512) RGB
format 属性标识出图像的类别,如果图像并不是从文件中读取,它的值会被设为None.size属性是一个二元组,内容包括图像的高和宽(以像素为单 位).mode属性定了的图像颜色通道数量及名字,同时也包括像素类型和深度.常见的模式比如”L”(luminance)代表灰度图,”RGB”是真彩色图像, 而”CMYK”则是打印图像.
如果打开失败,则抛出IOError异常.
一旦创建了一枚Image类的实例,你就可以使用这个类所定义的方法来处理和操作图像.举列来说,显示这一图像:
>>> im.show()
(标准版本的show并不是非常有效率,因为先将图像保存为临时文件,然后调用xv来显示它.如果你没有安装xv,它甚至可能无法使用.不过当它可用的时候,还是能够非常方便地调试与测试.)
–译注,xv是Unix下的一个看图工具,在windows是,应该是调用系统默认的工具打开图像.
接下来的部分,我们给出这个库中的一些不同函数的总览.
读写图像
PIL支持大范围的图像格式.从硬盘中读取图像,使用Image模块中的open函数.你不需要在打开文件的时候给出文件类型.图像库自动根据文件内容来决定格式.
保存一枚图像,使用Image模块中的save函数.在保存图像的时候,文件名就像得很重要了.除非你指定格式,否则图像库使用文件扩展名来确定文件所用的存储格式.
Example: 将图像转化为JPEG
import os, sys
import Image
for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + “.jpg”
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print “cannot convert”, infile
可以稍微花时间讨论一下显示指定文件格式时的save方法.如果你使用一个非标准的扩展名,就必须始终以这种方式指定文件格式:
Example: 创建JPEG图像的缩略图
import os, sys
import Image
for infile in [...]
[pil-handbook翻译]Python Imaging Library 概览
简介
Python Imaging Library为您的python程序添加有图像处理能力的接口。
这个库提供扩展文件格式支持——一种高效的扩展方式——和相当强大的图像处理能力。
核心图像库是为快速访问一些基本像素格式图像设计的。它能为普通图像处理工具提供一个可靠的基础。
让我们来看一个这个库的可能应用:
图像归档
针对于图像归档和批处理,Python Imaging Library是理想的程序。你可以用这个库来创建缩略呼,转化图像格工,打印图片等等。
Python Imaging Library的最新版本可以识别并读取多数图像格式。保存时则有意地限制为最常用的交流和发布格式。
图像显示
最新发布版本包含Tk PhotoImage and BitmapImage 接口,Windows DIB 接口也可以随着PythonWin一起使用。而对了X 和Mac系统的显示,您可以使用Jack Jansen的图像库。
调试版本(可能指非release版本)中,于Unix版本也提供show方法调用xv来显示图像。
图像处理
图像库包含一些基本的图像处理函数,包括像素操作,一系列内置convolution kernel的滤镜和颜色空间变换。
同时也提供图像缩放,旋转和任意几何变换的支持。
提供histogram方法使您可以输出对某个图像的一些统计信息。这可以用于自动对比增强和全局统计分析。
PIL目录 下一页



