本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于腾讯云 作者:龙哥

( 想要学习Python?Python学习交流群:1039649593,满足你的需求,资料都已经上传群文件流,可以自行下载!还有海量最新2020python学习资料。 )

在日常生活中,我们经常会存取一些朋友们的丑照,在这个项目中,我们以萌萌哒的熊猫头作为背景,然后试着在背景图上加入朋友们的照片。效果如下图所示。


实现步骤

  • 导入朋友的照片(前景照片);
  • 处理前景照片(缩放、旋转,填充);
  • 导入熊猫头照片(背景照片);
  • 将前景和背景拼接起来形成表情包;
  • 在表情包下面添加文字。

1、导入需要的库

import cv2
import numpy as mp
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont

这个项目主要是通过 opencv 完成,但如果要在表情包下面写中文的话,PIL(pillow)库是必不可少的。

2、绘图函数

这里写一个绘图函数,方便绘图操作。

def plt_show(img):imageRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)plt.imshow(imageRGB)plt.show()

3、导入前景照片

image = cv2.imread('SXC.jpg', 0)  # 导入灰度图即可
plt_show(image)

4、等比例缩放前景照片

因为我们发现前景照片的尺寸比背景尺寸还要大,这显然是不合适的,所以要先对其进行等比例(0.3)缩放。

image_resize = cv2.resize(image, None, fx=0.3, fy=0.3, interpolation = cv2.INTER_CUBIC)
plt_show(image_resize)

5、对前景照片进行二值化处理

在这里,我们将像素值大于 80 的区域设置为 255;小于 80 的区域设置成 0。

ret, image_binary = cv2.threshold(image_resize, 80, 255, cv2.THRESH_BINARY)
plt_show(image_binary)

6、提取出感兴趣区域

image_roi = image_binary[74: 185, 0: 150]
plt_show(image_roi)

7、旋转图片

因为我们的背景图片(熊猫头)是正的,而前景图片有些向右倾斜,所以要先对其进行旋转操作(大概逆时针旋转 15 度即可)。

rows, cols = image_roi.shape
M = cv2.getRotationMatrix2D(((cols-1)/2.0, (rows-1)/2.0), 15, 1)  # (旋转中心,逆时针旋转角度,各个方向同等扩大比例)
image_rotate = cv2.warpAffine(image_roi, M, (140, 130))  # (140, 130) 是指旋转后的画布大小
plt_show(image_rotate)

8、将一些不需要的黑色区域删除掉

在这里我们使用 cv2.fillPoly 函数对不需要的区域用白色进行填充。

h, w = image_rotate.shapeimage_rotate_copy = image_rotate.copy()
pts1 = np.array([[0, 20],  [64, 0], [0, 0]], np.int32)
pts2 = np.array([[0, 18],  [0, h], [80, h]], np.int32)
pts3 = np.array([[0, 100],  [0, h], [w, h], [w, 100]], np.int32)
pts4 = np.array([[111, 0],  [w, 0], [w, 30]], np.int32)
pts5 = np.array([[124, 0],  [115, h], [w, h]], np.int32)
pts6 = np.array([[120, 40],  [95, 100], [120, 100]], np.int32)
foreground = cv2.fillPoly(image_rotate_copy, [pts1], (255, 255, 255))  # (图片,填充区域,填充颜色)
foreground = cv2.fillPoly(image_rotate_copy, [pts2], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts3], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts4], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts5], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts6], (255, 255, 255))plt_show(foreground)

9、再次提取感兴趣区域并缩放

foreground_roi = foreground[0: 93, 0: 125]
plt_show(foreground_roi)foreground_roi_resize = cv2.resize(foreground_roi, None, fx=2.5, fy=2.5, interpolation = cv2.INTER_CUBIC)
plt_show(foreground_roi_resize)


10、导入背景图片

background = cv2.imread('back.jpg', 0)
plt_show(background)

11、组合两张图片成表情包

h_f, w_f = foreground.shape
h_b, w_b = background.shapeleft = (w_b - w_f)//2  # 前景图片在背景图片中的左边的横坐标
right = left + w_f  # 前景图片在背景图片中的右边的横坐标
top = 100  # 前景图片在背景图片中的上边的纵坐标
bottom = top + h_f  # 前景图片在背景图片中的下边的纵坐标emoji = background
emoji[top: bottom, left: right] = foreground
plt_show(emoji)

12、在表情包下面添加文本

12.1 添加英文文本
如果只是要添加英文文本,用 opencv 就可以解决:

emoji_copy = emoji.copy()
# (图片,文本,位置,字体,文本大小,文本颜色,文本粗细)
cv2.putText(emoji_copy, "FXXK!!", (210, 500), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 0), 5)
plt_show(emoji_copy)


12.2 添加中文文本
如果要添加中文文本,我们需要借助 PIL 库来实现。

PilImg = Image.fromarray(emoji)  # cv2 转 PIL
draw = ImageDraw.Draw(PilImg)  # 创建画笔
ttfront = ImageFont.truetype('simhei.ttf', 34)  # 设置字体
draw.text((210, 450),"你瞅啥!!",fill=0, font=ttfront)  # (位置,文本,文本颜色,字体)
emoji_text = cv2.cvtColor(np.array(PilImg),cv2.COLOR_RGB2BGR)  # PIL 转回 cv2
plt_show(emoji_text)

13、保存表情包

cv2.imwrite('./emoji.png', np.array(emoji_text))

Python:恶搞,将你朋友照片做成熊猫人表情包相关推荐

  1. python恶搞表情包下载大全_Python:恶搞,将你朋友照片做成熊猫人表情包

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:龙哥 ( 想要学习Python?Python学习交流群 ...

  2. python实现人脸识别抓取人脸并做成熊猫头表情包(2)之优化

    上次做完python实现人脸识别抓取人脸并做成熊猫头表情包之后就放了一下,因为还要好好学习Springboot毕竟这才是找工作的硬实力.但是优化这个代码心里面一直很想,借用<clean code ...

  3. 教大家把同事做成暴走表情包

    你还在为聊天的时候没有表情包而发愁吗?你还在为没法恶整同事基友而苦恼吗?今天就教你一个简单粗暴的photoshop教程,轻松把你的同事做成一个表情包! 首先,你要有一个photoshop和表情图,可以 ...

  4. 微信iOS7.0.9更新!除了朋友圈可以评论表情包,还有这些你可能不知道的功能!

    微信又㕛叒叕更新了~这次是iOS更新~ 本次更新版本号为7.0.9,官方更新日志只是简单提及"发消息时,可引用之前的内容",并未说明其他的更新! 接下来,我们一起看看有哪些重大更新 ...

  5. 每天一个PS技巧(原理+实践)——制作熊猫人表情包

    每天一个PS技巧(原理+实践)见: 每天一个PS技巧(原理+实践)_Dezeming的博客-CSDN博客PS是由Adobe Systems开发和发行的图像处理软件.本文的特色在于快速上手和制作一些生活 ...

  6. 熊猫人表情包python 代码_用Python爬取斗图网表情包

    一.介绍 用python处理二进制文件的事情做的比较少,虽然之前有写过分析Ajax抓取今日头条街拍美图,但那个爬虫重在分析Ajax,并没有提到文件路径和文件命名,所以就有了这个爬虫 二.流程 流程一般 ...

  7. 熊猫人表情包python 代码_Python实现表情包的代码实例

    本文主要介绍了使用Python进行简单图像处理的方法以及Python自动生产表情包的实例,具有很好的参考价值,下面跟着小编一起来看下吧 作为一个数据分析师,应该信奉一句话--"一图胜千言&q ...

  8. GAN生成“照片级” emoji!有人将扎克伯格做成了表情包

    编译来源:Reddit 编辑:大明.小芹 来源:新智元(ID:unity007) [导读]把扎克伯格的脸放到emoji表情包上是一番怎样的体验?这个恶搞话题今天在Reddit上引起了热议!作者声称使用 ...

  9. IOS版微信新功能!朋友圈评论支持表情包

    12月23日消息,新版微信支持使用表情包来评论朋友圈内容. 为了查看消息真伪去微博搜索了一下,对此,腾讯公关总监张军在微博予以确认. 朋友圈的斗图大赛已经悄然开始了,目前iOS版微信更新到7.0.9后 ...

最新文章

  1. Spring MVC-03循序渐进之Spring MVC
  2. 安卓下载保存到本地(二)
  3. 【Spring】Spring DataSourceTransactionManager
  4. 【服务器】Cloudreve绑定七牛云免费对象存储
  5. 你不能忽视的HTML语言
  6. timesten mysql_TimesTen进程种类详解
  7. 首个步态识别框架开源了
  8. 彻底搞懂js中的this指向
  9. RUOK的完整形式是什么?
  10. Qt利用avilib实现录屏功能_利用CE修改LOL实现各种功能(无限视距、锁定视距、攻击距离、炮塔范围、人物大小等)...
  11. 2020厦大计算机专硕分数,2020考研初试,你得考多少分才能上厦大?
  12. 登陆远程kvm_KVM远程VMM管理
  13. ajax 报错 Content-Type is not allowed by Access-Control-Allow-Headers in preflight respon
  14. 2022最新软件测试学习路线图
  15. matlab画图RGB调色
  16. 【项目笔记】布局文件报错Suspicious size: this will make the view invisible, probably intended for layout_width
  17. etcc oracle ebs,Oracle EBS日志 log
  18. 2013年阿里巴巴实习生招聘笔试题目及解答
  19. 2019-2020,互联网的十六个趋势
  20. 区块链:Casper 机制的历史起源-第四篇

热门文章

  1. 泄密事件不断 如何保证信息安全?
  2. 根据应用场景画出UML类图并代码实现
  3. HDU 5037 Frog
  4. QBC (Query By Criteria)
  5. Oracle——存储过程 procedure 的创建
  6. 手机短视频设置背景文字工具
  7. Spring5学习(二):Spring 配置、依赖注入
  8. 前端:一篇彻底搞懂vuex (mapState、mapGetters、mapMutations、mapActions)
  9. redis监控系统redis-stat应用
  10. 桌面清理向导”丢失或不能启动的解决方法