论坛首页 编程语言技术论坛

Python图形图像处理库的介绍之Image模块

浏览 15109 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-01-12  

Image模块的介绍

创建一个新的图片

Image.new(mode, size)
Image.new(mode, size, color)

 


层叠图片
层叠两个图片,img2和img2,alpha是一个介于[0,1]的浮点数,如果为0,效果为img1,如果为1.0,效果为img2。当然img1和img2的尺寸和模式必须相同。这个函数可以做出很漂亮的效果来,而图形的算术加减后边会说到。

Image.blend(img1, img2, alpha)



 
composite可以使用另外一个图片作为蒙板(mask),所有的这三张图片必须具备相同的尺寸,mask图片的模式可以为“1”,“L”,“RGBA”(关于模式请参看前一篇)

Image.composite(img1, img2, mask)



 

转换图形模式
下面看一个比较牛的方法convert,这个方法可以将图片在不同的模式间进行转换,在将灰度图转换成二值图时,所有的非零值被设置为255(白色)。灰度图的转换方式采用的是这个算法:

写道
L = R*299/1000 + G*587/1000 + B*114/1000
 

(此为ITU-R 610-2 亮度转换方程)

 



 




 
点操作
img.point(function),这个function接受一个参数,且对图片中的每一个点执行这个函数,这个函数是一个匿名函数,在python之类的函数式编程语言中,可以使用
lambda表达式来完成,如

out = img.point(lambda i : i*1.2)#对每个点进行20%的加强


如果图片是“I”或者“F”模式,那么这个lambda必须使用这样的形式

 

argument * scale + offset

e.g
out = img.point(lambda i: i*1.2 + 10)
 



透明通道的使用
putalpha(alpha)
这个方法是一个神奇的方法,你可以将一个图片(与原图尺寸相同)写入到原图片的透明通道中,而不影响原图片的正常显示,可以用于信息隐藏哦。当然,前提是原
始图片有透明通道。不过就算不是也没有多大关系,因为有PIL提供的convert功能,可以把一个图片先转换成RGBA模式,然后把要隐藏的信息文件转成“L”或者“1”模
式,最后使用这个putalpha将其叠加。而在图片的使用方,只需要简单的抽取其中的透明通道就可以看到隐藏信息了,哈哈。

def hideInfoInImage(img, info):
    if img.mode != "RGBA":
        img = img.convert("RGBA")
    if info.mode != "L" and info.mode != "1":
        info = info.convert("L")
    img.putalpha(info)

    return img

 


测试之

if __name__ == "__main__":
    img = Image.open("green.png")
    band = Image.open("antelope_inhalf.jpg")

    img = hideInfoInImage(img, band)
    img.show()#可以看到,原图片没有显式变化
    img.split()[3].show()#抽取出透明通道中的图片并显示



 

 

在windows系统中,默认的图片浏览器会把透明通道附加,可能会影响效果,可以用别的图片浏览器查看。

def randomPalette(length, min, max):
    return [ randint(min, max) for x in xrange(length)]


调色板的使用

putpalette(palette)
    img = Image.open("green.png").convert("L")
    #img.show()
    l = randomPalette(768, 0, 255)
    img.putpalette(l)
    img.show()



 
现将green.png转成灰度图,然后自定义一个随机调色板着色,可以看到这个效果。可能有人在想这个图形处理的作用,其实作用还是比较大的,做模式识别,人脸检
测等等操作事,真彩的图片往往很难处理,一个解决方案就是处理成灰度图或者二值图,一来可以去掉部分干扰,二来可以减少需要处理的数据量(提高效率)。

图片转换(扭曲,映射)
transform()方法的使用

transform(size, method, data)


method参数:

 

EXTENT 剪一个矩形出来(用以剪切,拉伸,压缩等操作)
AFFINE 几何防射转换
QUAD 将一个四边形映射到一个矩形
MESH 将多个四边形映射到一个操作



在EXTENT参数的情况下,data是一个四元组(x0,y0,x1,y1),表示输入图片中需要处理的区域,size为新图片的尺寸,是一个二元组(width, height)
用途:剪贴,拉伸,压缩等操作

 



 
在AFFINE参数的情况下,data是一个六元组(a,b,c, d,e,f),其中包含affine转置矩阵的前两行。对于输出图片的每个像素(x,y),会被新值(ax+by+c, dx+ey+f)替换。
用途:反转,旋转,剪切等

 



 

在QUAD参数的情况下,data是一个八元组(x0,y0,x1,y1,x2,y2,x3,y3)表示源四边形的四个定点的坐标值.MESH方式跟QUAD的效果相当,不过是对多个四边形进行映射操作.

 


 

transpose

im.transpose(method)

method参数:

 

FLIP_LEFT_RIGHT 左右倒置
FLIP_TOP_BOTTOM 上下倒置
ROTATE_90 旋转90度(逆时针)
ROTATE_180 旋转180度(逆时针)
ROTATE_270 旋转270度(逆时针)


(360度?这个就不用转了吧,呵呵)

 

关于Image模块就介绍到这里,还有一部分属性,函数和方法没有在此做分析,这部分比较简单,如果想了解更多,可以参看pil的handbook。

  • 大小: 143.7 KB
  • 大小: 19.9 KB
  • 大小: 27.1 KB
  • 大小: 206.7 KB
  • 大小: 61.3 KB
  • 大小: 32.6 KB
  • 大小: 61.3 KB
  • 大小: 17.2 KB
  • 大小: 298.6 KB
  • 大小: 142.3 KB
  • 大小: 102.5 KB
  • 大小: 106.4 KB
  • 大小: 8.7 KB
  • 大小: 77.5 KB
  • 大小: 61.3 KB
   发表时间:2009-01-12  
PIL的文章还会继续吗? 
0 请登录后投票
   发表时间:2009-01-12  
内容很有趣,也很实用。
0 请登录后投票
   发表时间:2009-01-13  
rockjava 写道
PIL的文章还会继续吗? 

一定的,关于这个超级牛的图形库我也正在学习阶段,所以更新可能会慢一些,但是我一定会把学习中的心得贴出来。谢谢关注。
0 请登录后投票
   发表时间:2009-01-14  
真的很不错。
用动态语言处理处理图像的点操作之类简直太方便、太合适了,如果不考虑效率的话。效率是个致命问题,所以PS永远不可能用Python或Ruby写。
0 请登录后投票
   发表时间:2009-01-14  
xuby 写道
真的很不错。
用动态语言处理处理图像的点操作之类简直太方便、太合适了,如果不考虑效率的话。效率是个致命问题,所以PS永远不可能用Python或Ruby写。


效率未必低吧。pil只是入口,内部还是C。
0 请登录后投票
   发表时间:2009-01-14  
MountLion 写道
xuby 写道
真的很不错。
用动态语言处理处理图像的点操作之类简直太方便、太合适了,如果不考虑效率的话。效率是个致命问题,所以PS永远不可能用Python或Ruby写。


效率未必低吧。pil只是入口,内部还是C。

是的,这个包使用C开发的,处理效率还过得去,不过脚本语言嘛,主要用于定制或者扩展已有的应用,效率方面要求是不那么高的。PS肯定不会被脚本语言代替。不过,借助PIL,很可能自己做一个python版的PS,呵呵
0 请登录后投票
   发表时间:2009-01-15   最后修改:2009-01-15
MountLion 写道
xuby 写道
真的很不错。
用动态语言处理处理图像的点操作之类简直太方便、太合适了,如果不考虑效率的话。效率是个致命问题,所以PS永远不可能用Python或Ruby写。


效率未必低吧。pil只是入口,内部还是C。

比如点操作,主要的处理部分还是那个 Python 的 lambda 函数,再加上跨语言的时间消耗,效率肯定会低不少。
另外还有内存问题。图像处理以消耗内存而著称,像我们处理的图像经常会超过1G,自动内存收集的静态语言(C#,Java)都不好使,更不要说动态语言了。
但是用c/c++实现类似的点操作功能的话,要用函数指针或者虚基类,相当麻烦,代码远不如Python这么清爽。
0 请登录后投票
   发表时间:2009-01-20  
文明谁玩过?他的界面就是用python写的
0 请登录后投票
   发表时间:2009-02-25  
java 能处理得这么清晰就好了
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics