“表情包”是现在非常流行的交流方式,通过一张图片就能把文字不能表达或不便于表达的情感给表示出来,表情包一经诞生,就统治了中国人的社交圈

你还在为聊天的时候没有表情包而发愁吗

还在为没法恶整哥们机友而苦恼吗?

还在因为表情不够多、不够搞笑而烦恼吗?

在日常生活中,我们经常会存取一些朋友们的丑照,现在我们把这些丑照制作成表情包,在聊天时稳居上风

效果如下图所示:

二、实现步骤

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

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

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

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

  5. 在表情包下面添加文字。

三、Python 实现

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、将一些不需要的黑色区域删除掉

在这里我们使用 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))

四、完整代码

import cv2
import numpy as mp
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFontdef plt_show(img):imageRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)plt.imshow(imageRGB)plt.show()image = cv2.imread('SXC.jpg', 0)  # 导入前景图片image_resize = cv2.resize(image, None, fx=0.3, fy=0.3, interpolation = cv2.INTER_CUBIC)  # 缩放ret, image_binary = cv2.threshold(image_resize, 80, 255, cv2.THRESH_BINARY)  # 图片二值化image_roi = image_binary[74: 185, 0: 150]  # 感兴趣区域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))
# 填充不需要的区域
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))foreground_roi = foreground[0: 93, 0: 125]
foreground_roi_resize = cv2.resize(foreground_roi, None, fx=2.5, fy=2.5, interpolation = cv2.INTER_CUBIC)background = cv2.imread('back.jpg', 0)  # 导入背景图片
# 拼接两张图片
h_f, w_f = foreground_roi_resize.shape
h_b, w_b = background.shape
left = (w_b - w_f)//2
right = left + w_f
top = 80
bottom = top + h_f
emoji = background
emoji[top: bottom, left: right] = foreground_roi_resizePilImg = 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 转回 cv2cv2.imwrite('./emoji.png', np.array(emoji_text))  # 保存表情包
 

比“带薪抑郁”更开心是把朋友丑照做成表情包相关推荐

  1. 【Win11尝鲜】Win 11 打开输入法自带GIF表情包、颜文字等

    Win 11 打开输入法表情包 在输入法输入文字时,可以看到win11在明显提示一个表情包按钮 (win10也有这个功能,但win11更完善) 点击按钮可以打开表情包部分 按windows+句号(是字 ...

  2. 员工每天带薪拉屎3至6小时,对谁更不利?

    #员工每天带薪拉屎3至6小时被解雇# 事件摘要: 据劳动报报道,2015年7月开始,某公司员工王某每天在厕所停留的时间为3至6个小时.记录显示,自2015年9月7日至17日(9月13日除外)王某每天分 ...

  3. 带薪玩一周游戏,还要涨工资

    带薪玩游戏,是多么开心的事情,我就找到了. 前段时间,公司接到一个模拟业务场景的项目,需要在图形界面上模拟业务场景,比如人跑动,拖拽物体等,从而获取不太业务场景的模拟数据. 由于商务限制,无法展示模拟 ...

  4. 365天带薪休假 VS 折现,当事人这么选...

    来源:OfferShow 今天,我们来看看近期一则很火的新闻,年终奖跟年会,想必不少公司都会春节前安排一波,今天这位"网红年终奖"的当事人,做出的选择,给大家分享一下, 年前,广东 ...

  5. 华为:将在员工绩效考核中增加“伙伴满意度”选项;谷歌研究员“走火入魔”,被罚带薪休假;魅族回应被吉利收购 | EA周报...

    EA周报 2022年6月17日 每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事.掌握IT核心技术. 周报看点 1.腾讯宣布自研业务实现全面上云 2.比尔·盖茨调侃微软IE浏览器关停:&qu ...

  6. 调查显示我国4成人每周休闲不足10小时-休闲-带薪休假-上网

    调查显示我国4成人每周休闲不足10小时|休闲|带薪休假|上网 国人们的休闲时间已经连续三年下滑 国人们的休闲时间已经连续三年下滑,每周花在休闲上的时间为10小时以下的占了受访者总数的四成,此外还有3 ...

  7. 放假前的最后一次带薪摸鱼

    十一假期写的文章,竟然忘记发了.现在补上,还晚吗? 明天就是假期了,给小伙伴们聊聊我的一些心里话. 我在苏州的时候,国庆假期通常会选择回洛阳,坐上需要 15 个小时左右的绿皮火车,到了洛阳后再坐俩小时 ...

  8. 谷歌研究员走火入魔事件曝光:认为AI已具备人格,被罚带薪休假,聊天记录让网友San值狂掉...

    梦晨 发自 凹非寺 量子位 | 公众号 QbitAI 谷歌研究员被AI说服,认为它产生了意识. 他写了一篇长达21页的调查报告上交公司,试图让高层认可AI的人格. 领导驳回了他的请求,并给他安排了&q ...

  9. 国务院拟出台职工带薪年休假规定

    <script src='Http://code.xrss.cn/AdJs/csdntitle.Js'></script>核心提示:国务院法制办5日公布职工带薪年休假征求意见稿 ...

最新文章

  1. flutter ios启动白屏_Flutter技术架构概览
  2. 14岁清华本科新生免试直博!高校新生大数据陆续曝光,男女比例、年龄差距各异......
  3. 微信小程序直播如何接入?开源代码接入案例分享
  4. 【有美女看】提升用户体验,你不得不知道的事儿——巧用全屏与沉浸式体验,让用户更舒心~...
  5. 算法与数据结构(插入排序)
  6. Vue.js-Day04-PM【axios(安装、使用)】
  7. php找不到gearmanClent类,centos 使用docker搭建Gearman任务分发系统 ,Gearman的安装和使用...
  8. 《软件需求十步走》阅读笔记一
  9. [svc]证书学习索引
  10. 安防巨头们集体造车 跳出安防已成常态
  11. 数据库学习一站式入门资料(纯干货)
  12. win10计算机桌面路径,win10桌面路径是什么?如何修改win10桌面文件路径?
  13. 信号完整性(SI)电源完整性(PI)学习笔记(一)信号完整性分析概论
  14. 在idea中一键部署项目到Docker及CA认证
  15. php漂浮广告代码,JS随机漂浮广告代码具体实例
  16. 10个问题帮你瞬间化解面试中的尴尬,赢得面试官好感
  17. 企业建网站力求大气上档次!
  18. R语言(五) Plotly绘图基本命令介绍
  19. 计算机二级考MS office还是WPS office?
  20. 适配器模式实战场景和本质

热门文章

  1. 翻译—使用Python分析离散心率信号–第1部分
  2. CSS垂直居中的常用方法
  3. 《逃离100层》攻略13、19关
  4. 图片上下浮动(类似蚂蚁森林能量)
  5. 《Android 应用案例开发大全(第3版)》——第2.8节壁纸中的着色器开发
  6. android 拉取traces.txt分析ANR
  7. SDUT 2809 Goldbach
  8. PowerBI 1. 系统技术整体架构
  9. gitcode 卡片弹窗测试
  10. 微信小程序(1)---button的开放能力