设为首页 加入收藏

TOP

Python PIL库图像处理操作详解
2019-09-14 00:51:18 】 浏览:98
Tags:Python PIL 图像处理 操作 详解

Python PIL库图像处理操作详解


>>> from PIL import Image
>>> Image.open("niuniu.jpg","r")
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=450x600 at 0x7F715DC61320>
>>> im = Image.open("niuniu.jpg","r")
>>> print(im.size,im.format,im.mode)
(450, 600) JPEG RGB


 Python PIL库图像处理操作详解


Image.open返回一个Image对象,该对象有size,format,mode等属性,其中size表示图像的宽度和高度(像素表示);format表示图像的格式,常见的包括JPEG,PNG等格式;mode表示图像的模式,定义了像素类型还有图像深度等,常见的有RGB,HSV等。一般来说'L'(luminance)表示灰度图像,'RGB'表示真彩图像,'CMYK'表示预先压缩的图像。一旦你得到了打开的Image对象之后,就可以使用其众多的方法对图像进行处理了,比如使用im.show()可以展示上面得到的图像。


上面的代码将图像重新保存成png格式。


上面的代码可以创建一个指定大小(size)的缩略图,需要注意的是,thumbnail方法是原地操作,返回值是None。第一个参数是指定的缩略图的大小,第二个是采样的,有Image.BICUBICPIL.Image.LANCZOSPIL.Image.BILINEARPIL.Image.NEAREST这四种采样方法。默认是Image.BICUBIC


Python PIL库图像处理操作详解


上面的代码在im图像上裁剪了一个box矩形区域,然后显示出来。box是一个有四个数字的元组(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分别表示裁剪矩形区域的左上角x,y坐标,右下角的x,y坐标,规定图像的最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴,每一个像素代表一个坐标单位。crop()返回的仍然是一个Image对象。


Python PIL库图像处理操作详解


上面的代码将im逆时针旋转180°,然后显示出来,method是transpose的参数,表示选择什么样的翻转或者旋转方式,可以选择的值有:
    - Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
    - Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
    - Image.ROTATE_90,表示将图像逆时针旋转90°
    - Image.ROTATE_180,表示将图像逆时针旋转180°
    - Image.ROTATE_270,表示将图像逆时针旋转270°
    - Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
    - Image.TRANSVERSE,表示将图像进行转置,再水平翻转


上面的代码将region图像粘贴到左上角为(100,100)的位置。region是要粘贴的Image对象,box是要粘贴的位置,可以是一个两个元素的元组,表示粘贴区域的左上角坐标,也可以是一个四个元素的元组,表示左上角和右下角的坐标。如果是四个元素元组的话,box的size必须要和region的size保持一致,否则将会被convert成和region一样的size。


Python PIL库图像处理操作详解


split()方法可以原来图像的各个通道分离,比如对于RGB图像,可以将其R,G,B三个颜色通道分离。


Python PIL库图像处理操作详解


merge方法和split方法是相对的,其将多个单一通道的序列合并起来,组成一个多通道的图像,mode是合并之后图像的模式,比如"RGB",channels是多个单一通道组成的序列。


>>> im_resize = im.resize((200,200))
>>> im_resize
<PIL.Image.Image image mode=RGB size=200x200 at 0x7F715B19CCF8>
>>> im_resize.show()
>>> im_resize_box = im.resize((100,100),box = (0,0,50,50))
>>> im_resize_box.show()


Python PIL库图像处理操作详解


resize方法可以将原始的图像转换大小,size是转换之后的大小,resample是重新采样使用的方法,仍然有Image.BICUBICPIL.Image.LANCZOSPIL.Image.BILINEARPIL.Image.NEAREST这四种采样方法,默认是PIL.Image.NEAREST,box是指定的要resize的图像区域,是一个用四个元组指定的区域(含义和上面所述box一致)。


Python PIL库图像处理操作详解


convert方法可以改变图像的mode,一般是在'RGB'(真彩图)、'L'(灰度图)、'CMYK'(压缩图)之间转换。上面的代码就是首先将图像转化为灰度图,再从灰度图转化为真彩图。值得注意的是,从灰度图转换为真彩图,虽然理论上确实转换成功了,但是实际上是很难恢复成原来的真彩模式的(不唯一)。


filter方法可以将一些过滤器操作应用于原始图像,比如模糊操作,查找边、角点操作等。filter是过滤器函数,在PIL.ImageFilter函数中定义了大量内置的filter函数,比如BLUR(模糊操作),GaussianBlur(高斯模糊),MedianFilter(中值过滤器),FIND_EDGES(查找边)等。如下图1所示:


Python PIL库图像处理操作详解


图1


point方法可以对图像进行单个像素的操作,上面的代码对point方法传入了一个匿名函数,表示将图像的每个像素点大小都乘以1.5,mode是返回的图像的模式,默认是和原来图像的mode是一样的。图2是原来的dog.jpg和point操作之后的im_point.jpg之间的对比。


Python PIL库图像处理操作详解


图2 niuniu.jpg和point操作之后的linuxidc.jpg


下面是一个结合了point函数,split函数,paste函数以及merge函数的小例子。


ImageEnhance是PIL下的一个子类,主要用于图像增强,比如增加亮度(Brightness),增加对比度(Contrast)等。上面的代码将原来图像的亮度增加50%,将对比度也增加了50%。


除了上面使用迭代器的方式以外,还可以一帧一帧读取gif,比如下面的代码:


上面的代码在读取到gif的最后一帧之后,会throw 一个 EOFError,所以我们只要捕获这个异常就可以了。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python模块列表字典 下一篇wxPython制作跑monkey工具(Python..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目