您的位置:首页 > 编程语言 > Python开发

PIL(Python Image Library) 1.1.16中对像素操作的加速

2007-12-10 12:44 525 查看


近来在学习用Python作些图像处理的工作,不断被Python开发的高效率所震撼,而且也感觉到了开发者对运行期效率的重视,不仅在我使用2.5版本时明显感到比原来的2.4版本效率高,就连PIL的新版本中也针对图像的像素操作效率进行了很大的改善。
PIL中效率的改善主要来自于Image模块中的load函数,这个函数是在PIL 1.1.6版本中新增加的,相比于原来的getpixel与putpixel函数,主要的目的就是通过提供图像的缓存操作对象,提高对图像数据读写操作的效率。
这里可以通过一个简单的示例对比两种操作方式的差异,首先打开一个图片文件,同时创建一个相同大小的图片,然后将原始图片的数据逐像素的拷贝到新的图片中,代码如下。该代码在我的机器上运行,对于图像分辨率为2048*1536的图片,只需要5秒钟,而如果采用getpixel与putpixel函数实现(循环体中注释掉的代码),则需要25秒钟,可见load函数对于效率改善非常明显。


import Image


import ImageFilter




ima = Image.open('test.jpg')


size = ima.size


imb = Image.new('RGB', size)




pima = ima.load()


pimb = imb.load()




for i in range(size[0]):


for j in range(size[1]):


pimb[i,j] = pima[i,j] #primb.putpixel((i,j), pima.getpixel((i,j)))




imb.save('test.bmp')

此外,需要提到的是,通过load函数实现的对数据读写加速的办法,已经在PIL的内部非常普遍的使用,比如在Image模块算是比较耗时的filter函数,就已经利用数据缓存对象来提高效率。Image.filter函数的定义如下:


def filter(self, filter):


"Apply environment filter to image"




self.load()




from ImageFilter import Filter


if not isinstance(filter, Filter):


filter = filter()




if self.im.bands == 1:


return self._new(filter.filter(self.im))


# fix to handle multiband images since _imaging doesn't


ims = []


for c in range(self.im.bands):


ims.append(self._new(filter.filter(self.im.getband(c))))


return merge(self.mode, ims)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: