用Python来完成简单图像处理
摘要:本文简单介绍了用Python来完成简单图像处理任务的方法。虽然图像处理的最佳工具是MATLAB的图像处理工具箱,但是在进行一些“简单的”图像处理任务或者大批量的简单图像处理任务的时候,Python更有优势。
关键词:图像处理 图像增强 Python
Abstract:This context introduces some methods used to fullfill simply image processing task in python programming language.Although the best image processing toolkit is the Image Processing Toolbox of MATLAB,python is superior to this toolkit when your staff is somewhat “simple” or simple but boring and exhausting image processing commitment.
Keywords:Image Processing Image Enhancement Python
1.引言:
提到图像处理,人们通常想到的工具是MATLAB。诚然,MATLAB提供了一个强大的图像处
理工具箱。但是,对于简单的图像处理任务而言,采用一种高级的语言将起到事半功倍的效果。Python无疑就是实现这一功能的理想选择。Python的面向对象、弱数据类型等等特性都使得用它来进行简单的图像处理的时候非常的简洁方便。
2.简介:
PythonWare公司提供了免费的图像处理工具包PIL(Python Image Library),该软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,场空间转换,图像增强,直方图处理,插值和滤波等等。虽然在这个软件包上要实现类似MATLAB中的复杂的图像处理算法并不太适合,但是Python的快速开发能力以及面向对象等等诸多特点使得它非常适合用来进行原型开发。
在PIL中,任何一副图像都是用一个Image对象表示,而这个类由和它同名的模块导出,因此,要加载一副图像,最简单的形式是这样的:
import Image
img = Image.open(“dip.jpg”)
注意:第一行的Image是模块名;第二行的img是一个Image对象; Image类是在Image模块中定义的。关于Image模块和Image类,切记不要混淆了。现在,我们就可以对img进行各种操作了,所有对img的操作最终都会反映到到dip.img图像上。
PIL提供了丰富的功能模块:Image,ImageDraw,ImageEnhance,ImageFile等等。最常用到的模块是Image,ImageDraw,ImageEnhance这三个模块。下面我对此分别做一介绍。关于其它模块的使用请参见说明文档.有关PIL软件包和相关的说明文档可在PythonWare的站点www.pythonware上获得。
3.Image模块:
Image模块是PIL最基本的模块,其中导出了Image类,一个Image类实例对象就对应了一副图像。同时,Image模块还提供了很多有用的函数。
(1)打开一副图像文件:
import Image
img = Image.open(“dip.jpg”)
这将返回一个Image类实例对象,后面的所有的操作都是在img上完成的。在这里,我们读入的图像是:
(2)调整图像大小:
import Image
img = Image.open("img.jpg")
new_img = size((128,128),Image.BILINEAR)
new_img.save("new_img.jpg")
原来的图像大小是256x256,现在,保存的new_img.jpg的大小是128x128:
就是这么简单,需要说明的是Image.BILINEAR指定采用双线性法对像素点插值。
(3)旋转图像:
现在我们把刚才调整过大小的图像旋转45度:
import Image
img = Image.open("img.jpg")
new_img = size((128,128),Image.BILINEAR)
rot_img = ate(45)
rot_img.save("rot_img.jpg")
于是我们保存到rot_img.jpg的图像看起来像下面这样:
(4)格式转换:
假设我们要把上面生成的rot_img.jpg转换成bmp图像,要做到这一点这太简单了:只需要在上面的代码后面添加下面这样一行即可:
rot_img.save("con_img.bmp")
如果不指定保存格式,PIL将自动根据文件名后缀完成格式之间的转换,是不是很简单呢?
(5)直方图统计:
Image类实例的histogram()方法能够对直方图数据进行统计,并将结果做为一个列表(list)返回。比如,我们对上面的旋转后生成的图像进行直方图统计:
import Image
img = Image.open("img.jpg")
new_img = size((128,128),Image.BILINEAR)
rot_img = ate(45)
print rot_img.histogram()
运行之后将打印出所有256个灰度级像素点个数的统计值:
[2819, 22, 82, 119, 186, 204, 212, 218, 223, 200, 151, 103, 129, 74, 80, 83, 110, 70, 59, 64, 59, 58, 35, 45, 42, 38, 32, 39, 33, 19, 24, 26, 32, 17, 33, 24, 34, 19, 18, 15, 11, 23, 16,
15, 21, 13, 20, 22, 27, 10, 29, 26, 18, 16, 28, 18, 26, 37, 36, 25, 28, 36, 28, 31, 22, 20, 15, 13, 15, 18, 12, 15, 21, 21, 12, 18, 17, 12, 11, 18, 16, 14, 21, 20, 18, 19, 15, 20, 22, 16, 22, 15, 23, 26, 16, 8, 13, 19, 30, 16, 15, 11, 22, 12, 14, 8, 10, 14, 13, 8, 12, 22, 11, 13, 18, 16, 21, 21, 14, 14, 11, 14, 15, 9, 23, 19, 15, 17, 9, 10, 11, 12, 14, 16, 9, 17, 15, 20, 14, 18, 18, 32, 34, 55, 54, 51, 72, 78, 83, 99, 118, 171, 138, 177, 191, 158, 159, 123, 106, 136, 121, 121, 148, 137, 118, 145, 150, 150, 133, 98, 111, 118, 111, 104, 129, 124, 104, 144, 126, 118, 133, 124, 108, 87, 87, 83, 85, 75, 76, 75, 62, 84, 46, 61, 54, 54, 63, 45, 54, 66, 46, 52, 51, 49, 51, 52, 62, 50, 67, 72, 53, 53, 83, 54, 39, 57, 31, 53, 31, 38, 38, 42, 31, 29, 38, 39, 39, 26, 43, 36, 45, 68, 57, 60, 42, 39, 41, 38, 46, 44, 40, 47, 57, 45, 59, 53, 59, 81, 78, 75, 95, 46, 62, 1, 0, 0]
小结:以上介绍了Image模块最基本的功能,作为对PIL库初步的认识已经足够了,值得说明的是,这里提到只是Image一部分功能而已,要对整个Image模块的功能有一个全面的了解和掌握,请参见PIL-handbook.pdf。
4.ImageDraw模块:
ImageDraw模块提供了基本的图形能力,这里的图形能力指的主要是图形的绘制能力。PIL库提供了比较丰富的图形绘制函数,可以绘制直线、弧线、矩形、多边形、椭圆、扇形等等。ImageDraw实现了一个Draw类,所有的图形绘制功能都是在Draw类实例的方法中实现的。实例化一个Draw类实例很简单:
import Image,ImageDraw
img = Image.open("img.jpg")
draw = ImageDraw.Draw(img)
首先要导入ImageDraw模块。然后,因为绘图操作是在图像上进行的,因此实例化Draw类的时候要把Image对象img通过参数传递给Draw类的构造函数。现在,你就可以调用draw的各种方法在img上绘制图形了。
(1)绘制直线:
import Image,ImageDraw
img = Image.open("img.jpg")
draw = ImageDraw.Draw(img)
python新手适合的软件width,height = img.size
draw.line(((0,0),(width-1,height-1)),fill=255)
draw.line(((0,height-1),(width-1,0)),fill=255)
img.save("cross_line.jpg")
解释一下上面这段代码:
前面三行这里就不解释了。width,height = img.size是得到img的大小,得到这两个属性的主要目的是要在下面的两行代码中使用:
draw.line(((0,0),(width-1,height-1)),fill=255)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。