不用@微信官方了,Python20行自动戴帽!

这两天被朋友圈里@微信官方要求戴帽的消息刷屏了,会玩的都悄咪咪地用美图秀秀一类的app给自己头像p一顶然后可高兴地表示“哎呀好神奇hhhh”,呆萌的当然就一直等啊等。作为一名坚信“用技术解决需求”的萌新,在这个无聊的周末尝试用python来搞一波事情。

主要思路

准备两张图,一张头像,一张帽子。先祭出人脸识别定位头像中的人脸,给出人脸像素坐标;再根据这个坐标确定帽子放置的坐标;最后将两张图片拼接后输出。(需要注意的是,帽子是不规则图像,除了主体外背景应该是透明的,因此必须是四通道png格式)。gakki酱亲自演示如下:

问题展开

人脸识别怎么搞定?(重新造轮子?不存在的,这辈子都不可能造轮子的)。Github上一个开源的python人脸识别库face_recognition双手奉上,据说识别率99.38%(顶瓜瓜啊!)。通过安装这个库就可以调用人脸检测器。

确定了帽子的放置位置,怎么拼接图层?这个属于基本的图像操作,python提供了PIL(Python Image Lib)这么一个库来进行图像处理,具体操作请看后面的代码。

库的安装

我的环境是Ubuntu 16.04+Python2.7.12。使用Window,Mac OS和Python3的同学也可以参考,都是类似的。

face_recognition这个库比较事儿,安装前需要依次安装boost(boost_python),cmake,dlib这几个依赖和库,中间出现任何问题都可以通过Google解决(懒得写 -.. -)。安装完所有的依赖后,使用命令:

pip install face_recognition

pip install pillow#PIL库

完成后就可以在你的python脚本里import face_recognition和PIL了。

代码分析

Talk is cheap, show me the code。直接上代码:

1. from PIL import Image

2. import face_recognition

3 img_path = raw_input("image path:")

4. image = face_recognition.load_image_file(img_path)

5. face_locations = face_recognition.face_locations(image)

6. print("Found {} face(s) in this photograph.".format(len(face_locations)))

第1、2行导入PIL库中的Image模块和face_recognition库。第3行,等待用户输入头像图片的路径。第4行,把路径所指的图像数据读入image中。第5行,调用face_locations处理image中的图像数据,对图片中的人脸进行识别定位,定位后的得到的像素坐标数据放在face_locations里。第6行在shell里输出图片里识别到的人脸的个数。

7. human_img = Image.open(img_path)

8. human_img = human_img.convert("RGBA")

9. hat_img = Image.open("./hat.png")

10. hat_img = hat_img.convert("RGBA")

第7、8行,把路径所指的图像数据读入human_img中,并转换为四通道RGBA模式。9、10行读入帽子图像并做相同处理。

11. for face_location in face_locations:

12. top, right, bottom, left = face_location

13. top -= 10

14. print("A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))

15. head_h = bottom-top#hight of head

16. head_l = right-left#length of head

17. hat_img = hat_img.resize( (head_l,head_h) )#convert size of hat

18. hat_region = hat_img

19. human_region = ( left, top-head_h, right, top )

20. human_img.paste(hat_region, human_region,mask=hat_img)

21. human_img.show()

如果一张图里有多张人脸,face_recognition.face_locations(image)会返回每张人脸的位置信息,存放在一个list里。

因此第11行是遍历face_locations里的每张人脸的数据。第12行解包一个人脸像素坐标数据,得到top,right,bottom,left分别为示意图中的y1,x2,y2,x1。第13行,为啥y1要减10个像素?因为人脸识别得到的y1最多到你额头的位置,所以再把这个坐标往上提一提帽子才戴得更自然。第14行输出坐标数据方便调试。第15、16行计算人脸的高度和宽度。第17行使用resize()根据人脸的大小调整帽子的大小,因为图像中的人脸有大有小,调整后看起来更和谐。第18行,将帽子图像作为顶部图层图像。第19行,确定底部图层(头像图片)被覆盖的区域(就是帽子放置区域)。第20行,把顶部图层与底部图层拼接(不太明白的看下图)。

然后一个循环结束,亦即完成图片中一个人的戴帽操作,接着进行下个人的戴帽,直到所有人都戴上了帽子。最后21行,完成输出~

更多测试结果~

本文来自企鹅号 - Embark有方博雅媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员宝库

Python验证码识别:利用pytesser识别简单图形验证码

来源: j_hao104 my.oschina.net/jhao104/blog/647326 一、探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图...

61410
来自专栏phodal

【工具推荐】图像界的魔术师 ImageMagick

如果说 Pandoc 里文档界的瑞士军刀,那么 ImageMagick 就是图形界的瑞士军刀。 上周在为 Growth 制作插图的时候,需要:1. 合并不同的图...

3016
来自专栏生信小驿站

Python数据处理从零开始----第四章(可视化)(4)目录正文

有时候需要展示连续变量的误差,matplotlib通过plt.plot和plt.fill_between来实现。下面通过Scikit-Learn程序库的API里...

831
来自专栏人工智能

使用10几行Python代码,快速建立视觉模型识别图像

视觉 进化的作用,让人类对图像的处理非常高效。 这里,我给你展示一张照片。 ? 如果我这样问你: 你能否分辨出图片中哪个是猫,哪个是狗? 你可能立即会觉得自己遭...

3569
来自专栏奇点大数据

阿里巴巴最新实践:TVM+TensorFlow优化GPU上的神经机器翻译

本文是阿里巴巴 PAI-Blade 团队发表于 TVM 的最新博文,文中阐述了如何将 TVM 引入 TensorFlow,使 TensorFlow 中的 bat...

4865
来自专栏从流域到海域

A Gentle Introduction to Autocorrelation and Partial Autocorrelation (译文)

A Gentle Introduction to Autocorrelation and Partial Autocorrelation 自相关和偏自相关的简单...

3016
来自专栏大数据挖掘DT机器学习

Python机器学习库scikit-learn实践

一、概述 以最广泛的分类算法为例,大致可以分为线性和非线性两大派别。线性算法有著名的逻辑回归、朴素贝叶斯、最大熵等,非线性算法有随机森林、决策树、神经网络、核...

3675
来自专栏大数据杂谈

【Excel系列】Excel数据分析:数据整理

1. 直方图的功能 “直方图”分析工具可计算数据单元格区域和数据接收区间的单个和累积频率。此工具可用于统计数据集中某个数值出现的次数,其功能基本上相当于函数FR...

2617
来自专栏机器学习算法与理论

调用Dlib库进行人脸关键点标记

       昨天调试了人脸识别(classifier_webcam)这个程序,效果不错,响应速度也挺快。按照http://blog.csdn.net/u011...

4409
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

图像柔光效果(SoftGlow)的原理及其实现。

图像柔光效果在很多商业软件中都有实现,比如美图秀秀,光影魔术手等。其能针对原始图像产生一副新的比较平滑感觉光线比较柔和的效果,给人一种朦胧美,如下面几幅图所示...

24210

扫码关注云+社区

领取腾讯云代金券