使用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在数据分析、机器学习和可视化等方面的核心工具和技术。本资源包含该手册的中文版和英文版,为学习者提供了双语阅读的选择,同时附带了...
Agisoft Metashape 2.0.1 Python 用户手册 Agisoft Metashape 2.0.1 Python 用户手册是 Agisoft 公司发布的一份基于 Python 的用户手册,旨在帮助用户快速上手使用 Metashape 专业版中的 Python脚本功能。该手册...
Python Imaging Library (PIL) 是Python中用于图像处理的一个重要库,它提供了丰富的图像处理功能,包括读取、创建、修改和保存各种图像文件格式。PIL的中文手册是学习和理解该库的关键资源。 **第一部分:介绍** 1...
Agisoft Metashape 1.8 Python 用户手册 Agisoft Metashape 1.8 Python 用户手册是 Agisoft 公司为 Metashape Professional 编辑器开发的一份详细的 Python 脚本手册。该手册详细介绍了如何在 Metashape 中使用 ...