Python 处理图像文件的实用姿势
那些人人称道的美丽,里面都有PS的痕迹。
人是视觉型动物,每个人都有自己的审美标准,那些共同的准则形成了社会潮流。
随着计算机技术升级,我们现在可以用手机随时拍出漂亮的照片。
“PS”技术不再局限于“电脑”,而且计算机慢慢开始拥有了自己的“视觉”能力。
计算机视觉,就是让计算机读懂图像内容,是人工智能的一部分。
所以,用Python处理图像的场景,有两大类:
批量自动化处理图像,如裁剪、滤镜、旋转等效果叠加。
智能识别图像内容,如人脸识别、人物识别等,用“PS”术语可以叫“自动抠图”。
处理图像,其实就是处理色彩的数据,最常见的比如RGB格式
。
当图像要保存到磁盘时,人们会用压缩算法缩小数据占用空间,再次读取和显示时就解压缩还原。
Python处理图像的模块主要有3类:
Pillow
,即PIL
最活跃分支,普及度高,提供多种图像格式处理能力。还有不少依赖于它的项目应用,如之前介绍的openpyxl
和python-pptx
,以及图像增强工具 Augmentor。scikit-image
,是科学计算生态scipy
的图像能力补充。OpenCV
,Intel发起的计算机视觉库,用C++
实现后提供Python接口封装。
从性能角度看OpenCV
最强,但Pillow
和scikit-image
的接口更简单,尤其是Pillow
,不需要直接面对numpy.ndarray
的矩阵数据。当然了,图像处理到深处,那就都是数学,尤其是线性代数。
好在图像研究已经很多年,我们从应用角度看,重点是掌握如何用Python解决日常工作中的问题。
选择哪一类模块,需要从实际应用需求和知识背景2个角度出发:
只做一些简单图片处理,比如大小、基本滤镜等,
pillow
足够。需要灵活自定义高级滤镜,或研究图像算法,
scikit-image
和opencv
更适合,有不少三方模块底层使用了opencv
,所以根据具体应用情况可以穿插使用。只不过需要注意opencv
内部数据不是RGB
顺序,而是BGR
顺序。绘制图表,比如折线图、饼图等,不需要以上模块,用
matplotlib
更适合。
对于初学者,建议先用pillow
,不够用时再从scikit-image
和opencv
中寻找解决算法。
此外,虽然三者内部图像数据存储方式不同,但可以互相转换。
本文重点介绍pillow
模块用法,部分兼用opencv
和scikit-image
。
模块安装:
pip install pillow
pip install scikit-image
pip install opencv
本文包含如下常见应用场景:
基本使用:打开、显示、保存,灰度化、锐化
数据互转:三个类库中图像数据互相转换
基本图像处理:调整大小、旋转、翻转、裁剪
图像滤镜:换底色、各类风格,如漫画、油画、漫画头像、复古、黑白
实战应用:屏幕截图、抠图、批量加水印
智能应用:人脸识别,如带口罩、情绪
基本使用
先来分别感受下pillow
、scikit-image
和opencv
三个模块的基本使用方式。
包括:读写文件、灰度化和锐化图像。
Pillow基本使用
###### scikit-image基本使用
opencv基本使用
可以看到,pillow
的使用门槛最低,代码也最容易读懂;scikit-image
和numpy
无缝结合,图片读取出来的就是一个numpy.ndarray
对象;opencv
读取出的也是numpy.ndarray
,但色彩模式是BGR
模式,需要用cvtColor
函数进行模式转化。
三个模块间数据互转
当我们用pillow
处理图像到一半时,如果需要用到opencv
内置的算法,怎么办?
不用重新用opencv
再处理一遍,直接把pillow
数据转为opencv
的即可。
基本图像处理
基本图像处理,pillow
足够应付,它通过文件头确定基本信息,如文件格式、大小、模式等。
Image
是pillow
最基础也是最核心的类,提供了读写文件、显示、格式转换、裁剪、合并、变形等一系列的功能。
比如最常见的使用场景:调整大小、旋转、翻转、裁剪、混合。
图像滤镜
图像色彩是个专业领域,为表达人眼看到的颜色,专家们建立了不同的数学模型。
其中和设备相关的模型如RGB
、CMYK
、YCbCr
。
RGB
常用于显示器,用红(Red)、绿(Green)、蓝(Blue)三色组合出色彩。CMYK
常用于打印机,青(Cyan)、品红(Magenta)、黄(Yellow)和黑(blacK,避免与Blue混淆)。YCbCr
常用于视频,Y为颜色亮度比例,Cb和Cr表示蓝色和红色浓度偏移量比例。
图像的色彩处理,其实就是对其颜色数据的处理。
实际工作生活中,我们经常会看到一些滤镜效果,比如:轮廓图、浮雕图、模糊、铅笔画、平滑、撒盐效果、相片底片效果、手绘效果、抖音效果等等。
这些效果背后,都是对色彩数据调整处理。pillow
的ImageFilter
提供了一些常用滤镜,此外也可以用Image.point
遍历像素点,自定义处理方式。
此外,pillow
从3.4版本开始支持创建GIF图像,比如下面的:
下面代码演示了上面提到的一些效果
实战应用
实战中最常遇到的场景,如:屏幕截图、加水印、朋友圈九宫格切图、抠图、证件照换背景。
加水印和九宫格切图
用pillow
处理很方便:
其中,加水印,其实就是把图片合并,关键是Image.composite()
方法;九宫格切图,就是把图片9等分,然后用Image.crop()
方法截取内容。
关于去水印:图像水印并不是那么容易解决,关键是找出特征颜色数据再对图像数据处理。
如果有原图,就可以通过反向使用透明通道尝试消除,但也未必能做到100%消除,反复尝试调整透明度,有时候可以做到肉眼看不清,但仔细观察依旧可以发现“蛛丝马迹”(不可能每个像素都完美消除)。
此外,当前也有项目基于机器学习算法来解决这类问题。如deep_image_prior
,除了去水印,还有消除马赛克、提高分辨率、缺失图像修复等功能。但此类算法对硬件要求较高,如需要特殊显卡支持CUDA
算法框架。
自动抠图
用过"PS"的人对抠图应该不会陌生,可以很神奇地把图片里的元素单独提取出来,和其他的背景合并。
最常见的应用场景就是证件照,每次去拍照,都要用个纯色的幕布,而且要求衣服不能太浅。
其实背后是有原因的:为了管理部门更准确识别出人像。
抠图的原理,是找出目标物的边界范围,然后把其他地方变透明。
流程很简单,就2步:
计算出二值图像(即黑白图),每个像素点数据非0即1。
根据二值图像为原图设置透明度,如把非人像部分全透明,再融合其他背景,就实现了换背景效果。
所以,抠图效果好坏,关键在于识别的精准度。
常见做法有3种:
根据像素色彩范围,识别出背景。适合纯背景色场景,如证件照。
如果背景色彩复杂,就分块识别,在某小块中色彩相对集中。但需要单独设计切分算法。
机器学习算法,训练出识别物的特征模型。训练过程非常耗资源,但有了模型就可以快速应用,目前不少大平台也开放出了自己的训练模型,如百度的
paddlehub
项目。
篇幅有限,这里就只用pillow
做个简单演示,按像素点判断色彩范围:
全部的4种方式,可以参考源代码,对比后可以发现:
按每个像素点色彩判断范围,需要手动指定背景色彩值范围,且用Python数组迭代效率低。
用
opencv
的inRange
函数生成二值数据,也要手动指定范围,但它支持位运算,效率高。用灰度图,手动指定某个值来生成二值图,速度快,但精度差,效果当然也差。
使用
paddlehub
的人像模型识别,全自动,效果凑合,但资源损耗大,运算效率低。
关于自动抠图,有一些在线API已经可以很好去除背景,比如remove.bg
,这类API也提供PythonSDK,效果比以上方式都好,但下载处理后图像的高清版本需要付费。
智能应用
上面提到的paddlehub
,除了可以识别人像,还有更多公开的训练模型。
模块安装:pip install paddlepaddle paddlehub
比如人脸、口罩、文字等,使用方法都类似:
引入模型:比如人像训练模型
deeplabv3p_xception65_humanseg
加载图片:指定文件路径
算法执行:比如上面的图像切分
segmentation
输出结果
训练模型在调用时会自动从网上下载,也可以提前调用命令下载:hub install 模型名
。
通过hub list
可以查看当前已下载了哪些训练模型。
看一个官方的人脸识别的案例:检测口罩佩戴。
可以发现接口非常简单,图像会在本地处理,然后返回json
格式的数据,数据中会标出相关图像信息,比如案例中的人脸和口罩佩戴概率值。
总结
本文介绍了Python中图像处理的3个模块,重点介绍了pillow
的用法。
现实生活中,我们可以通过各类美图软件随时随地修图,但当我们需要批量处理时,可以采用Python自动化形式。此外,也可以试验一些独创的自定义玩法,这些滤镜可能现有软件还未能提供。
比如实际工作中,运营等岗位经常需要批量制作一些朋友圈海报图,方便用户传播。
目前也有一些在线网站提供半免费半付费的海报制作工具,但如果一次要做上百张海报,工作量也是非常可观的。这种情况非常适合用Python批量处理。
最后,我们也尝试了现有的训练模型来识别人像、人脸的场景。当然应用不仅于此,后面章节中我还会介绍其他好玩的训练模型来处理图像。
想了解的可以入群获取,前100名免费。
版权声明: 本文为 InfoQ 作者【程一初】的原创文章。
原文链接:【http://xie.infoq.cn/article/ed778a3ba030e2ac5fd8c0866】。文章转载请联系作者。
评论