使用Image类
Python图像库中最重要的类是Image类,在与之同名的模块中定义。有几种方法可以创建Image类的实例;或者从文件载入一个图像,或者处理其它图像,或者凭空创建一个图像。
可以使用Image模块提供的open函数从文件载入一个图像。
>>> import Image
>>> im = Image.open("lena.ppm")
成功的话,这个函数返回一个Image对象。现在就可以使用实例属性来检查文件的内容了。
>>> print im.format, im.size, im.mode
PPM (512, 512) RGB
format属性确定文件的来源。如果图像不是从文件读入的,这个值设为None。size属性是一个包含图像高度和宽度(以像素为单位)的2元元组(tuple)。mode定义了图像的波段的值和名称,以及像素类型和深度。一般的模式有:“L”(luminance—亮度)代表灰度图像,“RGB”代表真彩色图像,和“CMYK”代表印前(pre-press)图像。
不能打开图像会引发(raised)一个IOError异常。
一旦有了一个Image类的实例,你就可以使用该类提供的方法处理和操作图像了。比如,让我们把刚刚导入(loaded)的图像显示出来:
>>> im.show()
(标准的show函数的效率不是很高,因为它首先要把图像保存到一个临时文件,然后调用xv程序显示图像。如果没有安装xv,这个函数甚至不工作,如果工作的话,这个函数对调试和测试很方便。)
接下来的部分提供了对这个图像库中定义的不同函数的一个概览。
读入和保存图像
Python图像库支持大量的图像文件格式。使用Image模块中的open函数可以从磁盘读入文件。打开文件的时候,你不需要知道文件的格式。图像库根据文件的内容自动决定文件的格式。
要保存文件,可以使用Image类的save方法。保存文件的时候,名称很重要。因为除非你指定了文件的格式,图像库会根据文件的扩展名来决定保存文件使用的格式。
把图像转换为JPEG文件
import os, sys
import Image
for infile in sys.argv[1:]:
f, e = os.path.splitext(infile)
outfile = f + ".jpg"
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print "cannot convert", infile
(译注:似乎输入文件不能是GIF文件)
可以为save方法提供第二个参数来明确指定文件格式。如果使用了非标准的扩展名,必须像下面这样指定文件格式:
创建JPEG缩略图(Thunbnails)
import os, sys
import Image
size = 128, 128
for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + ".thumbnail"
if infile != outfile:
try:
im = Image.open(infile)
im.thumbnail(size)
im.save(outfile, "JPEG")
except IOError:
print "cannot create thumbnail for", infile
注意:除非必要,图像库不会解码或者载入栅格数据,这一点非常重要。打开文件时,文件头会被读入,以确定文件格式,并从中提取诸如模式,大小等内容,以及解码文件需要的其它属性,但是文件剩下的部分放在后面处理。
这意味着打开文件操作执行很快,因为它和文件的大小和压缩格式无关。下面是一个快速识别一组图像文件的脚本:
识别图像文件
import sys
import Image
for infile in sys.argv[1:]:
try:
im = Image.open(infile)
print infile, im.format, "%dx%d" % im.size, im.mode
except IOError:
pass
剪切,粘贴,合并图像
Image类包含了对图像中的部分区域(regions)进行操作的方法。crop方法可以提取图像中一个小矩形区域中的内容。
复制图像中一个小矩形部分
box = (100, 100, 400, 400)
region = im.crop(box)
矩形区域通过一个4元元组定义,对应的是(左,上,右,下)的坐标。Python图像库使用的坐标系统以左上角的坐标为(0,0)。同时注意,这里坐标指的是像素间的位置,所有上例中刚好指定了一块300x300的区域。
现在可以对这块区域进行各种处理,或者把它再粘贴到原来的图像上。
处理子矩形块,并粘贴回原图
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
在把区域贴回原图时,指定的大小必须与给定的区域匹配。另外,区域不能延伸到图像的外边。但是,原始图像的模式可以和区域的不同。如果它们的模式不一样的话,粘贴之前,区域的格式会自动转换(详见Colour Transforms节)。
下面是另一个例子:
滚动图像
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, (xsize-delta, 0, xsize, ysize))
return image
高级技巧,paste方法接受一个透明遮罩(transparency mask)的可选参数。对于这个参数,255表示粘贴的图像是不透明的(即,粘贴的图像和它原来一样)。如果这个参数的值是0,表示粘贴的图像是完全透明的。0-255之间的值表示不同的透明度。
Python还允许你处理多波段图像的某一个波段,比如RGB图像。split函数创建一组图像,每个图像包含了原图像的一个波段。merge函数接受一个模式和一个图像元组参数,并吧它们组成一个新图像。下面的例子交换了一个RGB图像的三个波段:
分离和合并波段
r, g, b = im.split()
im = Image.merge("RGB", (b, g, r))
几何变换
Image类包含了对图像进行缩放(resize)和旋转(rotate)的方法。前一个函数接受一个给出新大小的元组,对于后者,角的单位是度,方向是顺时针方向。
简单的几何变换
out = im.resize((128, 128))
out = im.rotate(45) # degrees counter-clockwise
如果是你90度为步长旋转图像,你即可以使用rotate方法,也可以使用transpose方法。transpose方法也可以在水平或垂直方向上翻转图像。
颠倒(Transposing)图像
out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)
transpose(ROTATE)和对应rotate操作的性能和结果没有任何区别。
更为一般的图像变换可以通过transform方法实现。详见其参考节。
颜色变换
Python图像库允许你使用convert函数在不同的像素表示(pixel representations)之间转换图像。
不同模式(modes)间的转换
im = Image.open("lena.ppm").convert("L")
图像库支持每种支持模式到“L”和“RGB”模式之间的转换。其它模式之间的转换,可能会需要中间图像(intermediate image)(一般是“RGB”图像)。
图像增强
Python提供了许多方法和模块用来增强图像。
滤波器
ImageFilter模块包含许多预先定义好的增强滤波器,可以与filter配合使用。
应用滤波器
import ImageFilter
out = im.filter(ImageFilter.DETAIL)
点操作
point方法可以用来改变(translate)一幅图像的像素点值(比如,图像的反色操作)。大多数情况下,带有一个参数的函数对象可以传递给这个函数。每个像素都会按照传入的函数对象被处理处理:
应用点变换
# multiply each pixel by 1.2
out = im.point(lambda i: i * 1.2)
使用上面的技术,你可以快速应用任何简单表达式(变换)到图像上。也可以组合point和paste方法来对图像进行有选择性的修改。
处理单个波段
# split the image into individual bands
source = im.split()
R, G, B = 0, 1, 2
# select regions where red is less than 100
mask = 100 and 255)
# process the green band
out = source[G].point(lambda i: i * 0.7)
# paste the processed band back, but only where red was < 100
source[G].paste(out, None, mask)
# build a new multiband image
im = Image.merge(im.mode, source)
注意创建遮罩层(mask)的语法:
imout = im.point(lambda i: expression and 255)
Python只计算决定一个逻辑表达式值所需的最少的部分表达式,并且返回检查的最后一个值作为表达式的值。所以如果上面表达式的值为false(0),Python不会再看第二个操作数,直接返回0。不然就返回255。
图像增强
实现更为高级的图像增强操作,可以使用ImageEnhance模块提供的类。一旦创建了一个图像,可以使用增强对象快速尝试不同的设置。
可以使用增强图像对象对象调整图像的对比度,亮度,颜色的平衡度和锐度。
增强图像
import ImageEnhance
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% more contrast")
图像序列
Python图像库包含一些对图像序列(所谓的动画(animation)格式)的基本支持。它支持的序列格式包括FLI/FLC,GIF,和一些还处于实验阶段的格式。TIFF也可以包含多个帧(frame)。
打开序列文件的时候,PIL自动加载序列的第一帧。可以使用seek和tell方法在不同的帧之间切换:
读取序列
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异常。
注意,当大部分前版本的图像库的驱动只支持查找(seek)下一帧(如上面的例子所示)。要返回前面的帧,可能需要重新打开文件。
下面的迭代器(iterator)类让你可以使用for语句在序列中循环。
一个序列列迭代器类
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打印
Python图像库包含了打印图像,文本和图像打印到Postscript打印机的函数。下面是一个例子:
绘制Postscript(没有成功)
import Image
import PSDraw
im = Image.open("lena.ppm")
title = "lena"
box = (1*72, 2*72, 7*72, 10*72) # in points
ps = PSDraw.PSDraw() # default is sys.stdout
ps.begin_document(title)
# draw the image (75 dpi)
ps.image(box, im, 75)
ps.rectangle(box)
# draw centered title
ps.setfont("HelveticaNarrow-Bold", 36)
w, h, b = ps.textsize(title)
ps.text((4*72-w/2, 1*72-h), title)
ps.end_document()
读入图像的更多内容
正如前面提到的,Image模块中的open函数被用来打开文件。很多时候,你只是把文件名作为参数传递给open函数:
im = Image.open("lena.ppm")如果一切正常的话,就返回一个Image对象。不然,就会引发一个IOError异常。
你也可以使用类文件(file-like)对象代替文件名。这个对象必须实现了read,seek和tell方法,并且以二进制模式打开。
从打开的文件中读入图像
fp = open("lena.ppm", "rb")
im = Image.open(fp)
可以使用StringIO类从字符串数据中读入图像。
从字符串中读入图像
import StringIO
im = Image.open(StringIO.StringIO(buffer))
注意,图像库会在读入图像头(image header)之前rewind文件(使用seek(0)函数)(注:就是把引用从新指向文件的开头)。另外,在读取图像数据的时候也会调用seek函数(通过load方法)。如果图像文件是嵌入在一个大文件中,比如tar文件,可以使用ContainerIO或者TarIO模块访问图像文件。
从tar存档文件中读取图像
import TarIO
fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")
im = Image.open(fp)
控制解码器(Decoder)
某些解码器允许你在从文件中读入图像的时候对它进行操作。这些通常被用来在创建缩略图(通常在这个时候速度比质量更重要)以及使用黑白激光打印机打印(这时只需要一个灰度图像)的时候加速解码。
draft方法处理一个打开但是还没有加载的图像,所以它会尽可能的与所给的模式和大小匹配。这些是通过从新配置(reconfiguring)图像解码器实现的。
以草稿(draft)模式打开图像(没有成功)
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函数代替draft。
分享到:
相关推荐
在这个“python Image库查询手册”中,我们可以期待找到关于如何使用`PIL`库进行图像操作的详细信息。以下是一些关键知识点的概述: 1. **图像打开与保存**: - `Image.open()`:这个函数用于打开一个图像文件,...
《Python库reportLab用户手册+API》是一份详细介绍如何使用reportLab库来创建和修改PDF文件的指南。reportLab是一个强大的Python库,它允许开发者通过编程方式生成PDF文档,包括图形、文本、字体、表格等多种元素,...
这份“Python中文版手册CHM”是为Python开发者量身定制的参考资料,它以中文的形式详细介绍了Python的各种概念、语法和库,使得中文使用者能够更方便地学习和查阅Python的相关知识。 CHM(Compiled Help Manual)是...
《Python数据科学手册》是数据科学领域的一本经典著作,由Jake VanderPlas撰写,它为使用Python进行数据处理、分析和可视化提供了全面而深入的指南。这本书涵盖了Python生态系统中的核心工具,包括NumPy、Pandas、...
本压缩包"python库用户手册.zip"包含了一些最常用且重要的Python库的手册,如Numpy、Pandas、Matplotlib和Scipy。以下是这些库的主要知识点: 1. Numpy:Numpy是Python中用于数值计算的基础库,提供高性能多维数组...
《Python数据科学手册》是为数据科学家和对数据科学感兴趣的Python程序员量身打造的一本权威指南。这本书深入探讨了Python在数据科学领域的应用,涵盖了从数据处理、统计分析到机器学习等多个关键领域。 Python作为...
《Python库参考手册》是Python开发者的重要资源,它详尽地涵盖了Python编程中广泛使用的各种库,这些库极大地扩展了Python的功能,使得开发者能够高效地完成数据处理、网络编程、科学计算、图形用户界面设计等多种...
Python-Imaging-Library中文手册、PIL中文手册、python图像处理
官方手册是学习和理解Python及其相关库的宝贵资源。本压缩包包含了多个与Python相关的官方手册,涵盖了Pandas、Numpy、Scipy和Scikit-learn等核心库。 1. Python 3.6.2手册 (python362.chm) 这个手册详细介绍了...
Python Imaging Library中文手册、PIL中文手册、python图像处理
深度学习和机器学习,python速查手册,GAN网络,MATLAB 点云拼接,MATLAB图像识别,数据分析 深度学习和机器学习,python速查手册,GAN网络,MATLAB 点云拼接,MATLAB图像识别,数据分析深度学习和机器学习,python速查手册,GAN...
它拥有大量的标准库和第三方库,涵盖了网络编程、数据库访问、Web框架、图形和图像处理、文本处理、加密等众多领域,使得Python开发者能够在很短的时间内使用这些库来完成复杂的任务。 本书的版权信息显示,它由O’...
ReportLab Python PDF编程手册 ReportLab Python PDF编程手册提供了关于ReportLab PDF Library的详细信息,该手册涵盖了ReportLab的基本概念、安装设置、图形和文本处理、PDF文档生成、ReportLab商业软件等方面的...
《Python数据科学手册》是数据科学领域的一本经典著作,主要在Jupyter Notebook环境中进行讲解。Jupyter Notebook是一种交互式计算环境,集成了代码、文本、数学公式、图像等多种元素,便于数据分析和可视化。这本书...
《Python数据科学手册》是图灵程序设计丛书中的一本重要著作,专注于介绍如何使用Python进行数据科学工作。这本书深入浅出地讲解了Python在数据处理、分析、可视化以及机器学习等多个领域的应用,旨在帮助读者掌握...
Python数据科学手册是数据科学家和Python开发者的重要参考资料,它涵盖了Python在数据分析、机器学习和可视化等方面的核心工具和技术。本资源包含该手册的中文版和英文版,为学习者提供了双语阅读的选择,同时附带了...
Python Imaging Library (PIL) 是Python中用于图像处理的一个重要库,它提供了丰富的图像处理功能,包括读取、创建、修改和保存各种图像文件格式。PIL的中文手册是学习和理解该库的关键资源。 **第一部分:介绍** 1...
Agisoft Metashape 2.0.1 Python 用户手册 Agisoft Metashape 2.0.1 Python 用户手册是 Agisoft 公司发布的一份基于 Python 的用户手册,旨在帮助用户快速上手使用 Metashape 专业版中的 Python脚本功能。该手册...
Agisoft Metashape 1.8 Python 用户手册 Agisoft Metashape 1.8 Python 用户手册是 Agisoft 公司为 Metashape Professional 编辑器开发的一份详细的 Python 脚本手册。该手册详细介绍了如何在 Metashape 中使用 ...