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)
相关文章推荐
- python--PIL操作像素例子
- PIL(Python Image Library)常用操作简介
- python中利用PIL(Python Image Library) 将矩阵转换为图片
- python-PIL 图像基本操作
- python PIL图像操作
- Python学习03_图片像素操作
- PIL(Python Image Library)生成验证码
- Python-OpenCV 处理图像(三):图像像素点操作
- Python PIL(Python Image Library)使用体会
- Python-OpenCV图像像素点操作
- python PIL 图像处理操作
- python 示例:始用PIL库图片操作实例 缩放与模糊
- PIL(Python Image Library)生成验证码
- opencv3.4+python3.6 中文教程6之像素操作
- python 操作某个超像素
- python PIL 操作图片
- 学习笔记(番外篇)——python的PIL模块操作图文黏贴操作
- python图形处理库PIL(Python Image Library)
- 【从零学习Python】PIL安装与基本图像操作
- python图形处理库PIL(Python Image Library)的基本概念