Image模块
1、创建一个新的图片
Image.new(mode,size)
Image.new(mode,size,color)
2、层叠图片
层叠两个图片,img1和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)
3、转换图形模式
convert可以将图片在不同的模式间在不同的模式间进行转换,在将灰度图转换成二值图时,所有的非零值被设置为255(白色)。灰度图的转换方式采用的是这个算法:
L= R*299/1000+G*587/1000+B*114/1000
点操作
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。
Image模块的更多相关文章
- npm 私有模块的管理使用
你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- ES6模块import细节
写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...
- Python标准模块--ContextManager
1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...
- Python标准模块--Unicode
1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...
- Python标准模块--Iterators和Generators
1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...
- 自己实现一个javascript事件模块
nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...
- 理解nodejs模块的scope
描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有ur ...
- nodejs模块发布及命令行程序开发
前置技能 npm工具为nodejs提供了一个模块和管理程序模块依赖的机制,当我们希望把模块贡献出去给他人使用时,可以把我们的程序发布到npm提供的公共仓库中,为了方便模块的管理,npm规定要使用一个叫 ...
- 开始学nodejs——net模块
net模块的组成部分 详见 http://nodejs.cn/api/net.html 下面整理出了整个net模块的知识结构,和各个事件.方法.属性的用法 net.Server类 net.Socket ...
随机推荐
- 调整 ANTD 组件菜单的字体大小。
调整 ANTD 组件菜单的字体大小:经过多次试验,原有字体太小,只有12px,通过下列CSS 强制加大. 1.分组子菜单(标题) .ant-menu-inline > .ant-menu-sub ...
- Droidbox恶意软件动态分析环境搭建
@author : Dlive 0x01 DroidBox简介 DroidBox是一款,可以获得以下信息 1.APK包hash值 2.网络通信数据 3.文件读写操作 4.网络通信,文件读写,SMS中的 ...
- C Primer Plus_第5章_运算符、表达式和语句_编程练习
Practice 1. 输入分钟输出对应的小时和分钟. #include #define MIN_PER_H 60 int main(void) { int mins, hours, minutes; ...
- .NET 程序集与命名空间
程序集 程序集(assembly)是一个或多个托管模块,以及一些资源文件的逻辑组合. 组成部分 Windows文件首部 CLR文件首部 程序集清单 类型元数据 MSIL(CIL)代码 嵌入资源集 作用 ...
- eclipse远程连接hive
创建项目,添加jar包,hive的s上,所以也需要hadoop的一些jar 这个图片是从网上找的,我直接使用的以前hadoop的项目 创建测试类,写测试代码 //获取jdbc链接 private ...
- Jmeter连接Mysql
1.下载连接mysql数据库jar包,地址:http://files.cnblogs.com/files/xiaoxitest/mysql-connector-java-5.1.28.zip(因不支持 ...
- php页面编码与字符操作
我们可以用header来定义一个php页面为utf编码或GBK编码,也可以在html中用meta标签来指定编码 例如:php页面为utf编码 header("Content-type: ...
- rhel5.8安装oracle 10g ASM
1.所有的配置和文件系统一样 2.规划: 加了8块小盘,ASM为了实验使用asmlib驱动(rhel6不再支持asmlib驱动),裸设备的2种方法(rowdevice和udev) 三块盘使用asmli ...
- Logistic回归的使用
Logistic回归的使用和缺失值的处理 从疝气病预测病马的死亡率 数据集: UCI上的数据,368个样本,28个特征 测试方法: 交叉测试 实现细节: 1.数据中因为存在缺失值所以要进行预处理,这点 ...
- Could not open Selected VM debug port (8700) (转)
Could not open Selected VM debug port (8700) 2014年11月14日 ⁄ 综合 ⁄ 共 446字 ⁄ 字号 小 中 大 ⁄ 评论关闭 在运行项目的时候, ...