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

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

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

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

实现步骤

导入朋友的照片(前景照片);

处理前景照片(缩放、旋转,填充);

导入熊猫头照片(背景照片);

将前景和背景拼接起来形成表情包;

在表情包下面添加文字。

1、导入需要的库

importcv2importnumpy as mpimportmatplotlib.pyplot as pltfrom PIL import Image, ImageDraw, ImageFont

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

2、绘图函数

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

defplt_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.shape

image_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.shape

left= (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制作恶搞_Python:恶搞,将你朋友照片做成熊猫人表情包相关推荐

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

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

  2. Python:恶搞,将你朋友照片做成熊猫人表情包

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

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

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

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

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

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

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

  6. python 制作抽奖_python制作抽奖程序代码详解

    实现制作抽奖程序,需要认知到我们可以看到一般抽奖程序界面上是有很多按钮的,比如中奖区域,按键开始区域等等,所以我们先要设置界面,然后把这些按钮添加到界面中去,想必这对于学过tkinter的同学应该不难 ...

  7. python制作五子棋_python制作简单五子棋游戏

    python制作简单五子棋游戏 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python制作简单五子棋游戏.txt ] (友情提示:右键点上行txt文档名->目标另存 ...

  8. python制作剪刀石头布_Python制作简单的剪刀石头布游戏

    关于程序相关的 您可以反复玩游戏,直到选择停止为止. 该程序跟踪获胜情况. 大小写无关紧要(即rock与rock相同). 如果您输入的内容无效,程序会一直提示您,直到您输入有效的内容. 对项目进行编码 ...

  9. python制作字典_python如何制作英文字典

    本文实例为大家分享了python制作英文字典的具体代码,供大家参考,具体内容如下 功能有添加单词,多次添加单词的意思,查询,退出,建立单词文件. keys=[] dic={} def rdic(): ...

  10. python制作图画_Python也能绘制艺术画?这里有一个完整教程

    介绍 我们知道Python作为一个程序语言,讲究的是严谨和逻辑:而艺术画似乎处于另一个维度,更多是无规则和随心所欲.然而我们却可以找到两者的交汇点.今天我们将学习如何用Python制作艺术图.一旦我们 ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第12期)
  2. Linux之编辑器 vim
  3. git cherry-pick 详解 —— Git 学习笔记 18
  4. 5.6 Column Attribute
  5. C# Select SelectMany 区别
  6. 系列 | 高性能存储-MySQL数据库之存储过程揭秘
  7. 小强的HTML5移动开发之路(14)——Video标签详解
  8. 手动修改Icon图标的颜色深度(张佩)
  9. 测试类写法以及几种常用方式
  10. 大学多宗持续灵异事件
  11. My Fifty-Ninth 全排列Ⅱ - By Nicolas
  12. Android图片轮播控件
  13. 那些优美的英文句子一
  14. 数学笔记——导数2(求导法则和高阶导数)
  15. 《响应式网页设计》系列分享专栏
  16. cacheable更新_Spring之缓存注解@Cacheable
  17. opencv05:图像的基本操作
  18. 二极管在LDO电路中的几种常见用法
  19. ★Oracle imp/impdp 导入dmp文件到数据库
  20. 蛇形矩阵之逆时针矩阵

热门文章

  1. 如何取消计算机限制连接,怎样解除网络连接限制?
  2. 如何创建表以及设计表需要注意什么,oracle五种限制
  3. 【游戏开发进阶】玩转贝塞尔曲线,教你在Unity中画Bezier贝塞尔曲线(二阶、三阶),手把手教你推导公式
  4. 输入圆半径 计算 直径 周长 面积
  5. Android Q Data Setup for Short Connection
  6. 基于JavaWeb的新闻发布管理系统设计与实现 毕业论文+任务书+开题报告+答辩PPT+项目源码及数据库文件
  7. JVM之 永久代与元空间
  8. 机器学习中的多分类任务详解
  9. 两行命令开启QQ音乐服务,或者官方文档完整过程
  10. 理工专业单身男终极把妹大法