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

来源:互联网 发布:sql isnull函数 编辑:程序博客网 时间:2024/05/14 11:00
    近来在学习用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)



原创粉丝点击