参考:http://justcoding.iteye.com/blog/901605

      http://www.iteye.com/topic/314790

     PythonWare公司提供了免费的Python图像处理工具包PIL(Python Image Library),该软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等 等。虽然在这个软件包上要实现类似MATLAB中的复杂的图像处理算法并不太适合,但是Python的快速开发能力以及面向对象等等诸多特点使得它非常适 合用来进行原型开发。

    默认安装python的时候没有安装PIL库,需要安装(只在windows下测试)。

    download: http://www.pythonware.com/products/pil/index.htm

 

下载后默认安装即可。

打开图片

1.导入pil的Image模块


2.使用open(filename)打开文件,返回一个p_w_picpath对象

Python代码   收藏代码
  1. im = Image.open('filename')  


此后,一切关于图片的操作均基于这个对象。



 

打 开后,我们可以查看一些图片信息,如im.format, im.size, im.mode等。调用im.show()会在图片查看工具中显示当前操作的p_w_picpath对象,这个跟个人的系统有关系,我系统中默认是用Windows Picture and Fax Viewer打开的。这个方法用来查看临时的图片效果。

读写图片
pil 中转换图片格式非常简单(转换图片模式是另一个概念,不要混淆),只需要调用img.save(filename)即可比如有一个bmp(位图)图片,使 用img = Image.open('file.bmp')打开后,只需要img.save('file.jpg')即可转换。不过一般情况 下,save(filename)是不用做这个用途的,通常,save用以保存一个临时的p_w_picpath对象到硬盘。而转换工作由一个功能更为强大的 convert()方法来完成。


拷贝,粘贴,合并

Python代码   收藏代码
  1. box = (100,100,500,500)#设置要拷贝的区域  
  2.   
  3. #将im表示的图片对象拷贝到region中,大小为(400*400)像素。这个region可以用来后续的操作(region其实就是一个Image对象),box变量是一个四元组(左,上,右,下)。  
  4. region = im.crop(box)  
  5.   
  6. region = region.transpose(Image.ROTATE_180)#从字面上就可以看出,先把region中的Image反转180度,然后再放回到region中。  
  7. im.paste(region, box)#粘贴box大小的region到原先的图片对象中。  

 

前面说过,每一个RGB都是由三个通道的灰度图叠加的,所以pil提供了将这三个通道分离的方法

Python代码   收藏代码
  1. r,g,b = im.split()#分割成三个通道  
  2. r.show()  
  3. g.show()  
  4. b.show()  
  5. im = Image.merge("RGB", (b, g, r))#将b,r两个通道进行翻转。  

 

红色通道的灰度图



 绿色通道的灰度图



 蓝色通道的灰度图

 



 
 互换红蓝通道后的合成图

 

几何转变
几何转变提供resize,rotate等方法,用以重定义图片大小,对图片进行旋转等操作,在实际应用中比较广泛。

Python代码   收藏代码
  1. out = img.resize((128128))#resize成128*128像素大小。  
  2. out = img.rotate(45)#逆时针旋转45度  


逆时针45度



 
 镜面效果,左右翻转

transpose()方法预定义了一些旋转方式,如
左右反转,上下翻转,逆时针旋转(90,180,270)度等,非常方便,rotate()和transpose()方法在表现上没有任何不同。

图片加强


滤镜
ImageFilter模块提供了很多预定义的图片加强滤镜。
比如一个常用的滤镜,细节(detail滤镜)

Python代码   收藏代码
  1. import ImageFilter  
  2. out = im.filter(ImageFilter.DETAIL)  



 

直接操作像素点
不但可以对每个像素点进行操作,而且,每一个通道都可以独立的进行操作。比如,将每个像素点的亮度(不知道有没有更专业的词)增大20%

Python代码   收藏代码
  1. out = img.point(lambda i : i * 1.2)#注意这里用到一个匿名函数(那个可以把i的1.2倍返回的函数)  



对每个点都做20%的增强

 

如上边的那个例子,我们可以将一个RGB模式的图分离成三个通道的层

Python代码   收藏代码
  1. r,g,b = img.split()#神奇而又强大的python语法  



然后对一个通道进行加强或减弱操作,完成后我们又可以使用Merge将通道合并,从而改变图片的色调(冷暖色调的互换)等。

更高级的图片加强,可以使用ImageEnhance模块,其中包含了大量的预定义的图片加强方式。

Python代码   收藏代码
  1. import ImageEnhance  
  2. enh = ImageEnhance.Contrast(im)  
  3. enh.ehhance(1.5).show("50% more contrast")  


 

读写图片的更多方式
通常,我们使用open方法进行图片的打开操作。但是这不是唯一的方式。完全可以跟python的IO整合起来。如

Python代码   收藏代码
  1. fp = open("file.jpg""rb")  
  2. im = Image.open(fp)  

 

甚至,你可以从一个字符串中读出图片数据来(python真是神奇啊)。

Python代码   收藏代码
  1. import StringIO  
  2. img = Image.open(StringIO.StringIO(buffer))  

下面是另一个参考:

Image模块是PIL最基本的模块,其中导出了Image类,一个Image类实例对象就对应了一副图像。同时,Image模块还提供了很多有用的函数。

(1)打开一副图像文件:

Python代码   收藏代码
  1. from PIL import Image   
  2. img = Image.open("img.jpg")  

这将返回一个Image类实例对象,后面的所有的操作都是在img上完成的。

(2)调整图像大小:

Python代码   收藏代码
  1. from PIL import Image   
  2. img = Image.open("img.jpg")     
  3. new_img = img.resize((128,128),Image.BILINEAR)     
  4. new_img.save("new_img.jpg"

原来的图像大小是256x256,现在,保存的new_img.jpg的大小是128x128。

就是这么简单,需要说明的是Image.BILINEAR指定采用双线性法对像素点插值。

(3)旋转图像:

现在我们把刚才调整过大小的图像旋转45度:

Python代码   收藏代码
  1. from PIL import Image   
  2. img = Image.open("img.jpg")     
  3. new_img = img.resize((128,128),Image.BILINEAR)     
  4. rot_img = new_img.rotate(45)     
  5. rot_img.save("rot_img.jpg")