转自:Python学习与数据挖掘

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

实现步骤

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

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

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

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

在表情包下面添加文字。

1、导入需要的库

importcv2

import numpyasmp

import matplotlib.pyplotasplt

from PILimportImage, 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 和 Streamlit 做交互式数据分析产品?

    「本文参与少数派 2019 年度征文 + 效率有心得」 不用学前端编程,你就能用 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户. 痛点 从我开始折腾数据 ...

  2. python程序写蛇_如何用Python画一条蛇

    先上效果图 最近又打算重新学习Python了, 之前也入门过Python, 但是弄完Python的开发环境后, 停留在print("hello world")阶段 非科班出身, 没 ...

  3. python 矩阵运算 for循环_如何用 Python 科学计算中的矩阵替代循环

    展开全部 因为在Mathematica中使用循环确实是低效的.32313133353236313431303231363533e78988e69d8331333361313961..... 深层次的原 ...

  4. python搭建自动化测试平台_如何用python语言搭建自动化测试环境

    原标题:如何用python语言搭建自动化测试环境 技术分享:基于Python语言的Web自动化测试环境搭建 近期发现很多初学者在学习自动化的过程当中,在环境安装环节总是出现问题,所以详细的出一篇环境搭 ...

  5. 如何制作python检查小软件_如何用Python制作整蛊小程序

    原标题:如何用Python制作整蛊小程序 下面的整蛊程序,千万不要发代码,否则就实现不了你整蛊的目的了.完成后一定要打包成一个exe程序,再发给朋友使用 . 1. 使用 pip install pyi ...

  6. python rest api 测试_如何用Python编写REST API的单元测试

    在过去的几个月中,正在从事一个名为B的项目.它是带有简单Web UI的徽章生成器,用于添加数据并生成PDF可打印徽章.B后端现在已转移到REST-API并测试REST-API中使用的功能,我们需要一些 ...

  7. python的out模式_如何用python中的DataFrame列的模式替换NA值?

    我对Python(和本网站)完全陌生,目前正试图用它们的模式替换特定数据帧列中的NA值.我试过了各种不起作用的方法.请帮我看看我做错了什么:如何用python中的DataFrame列的模式替换NA值? ...

  8. 用python做一张图片_如何用python下载一张图片

    如何用python下载一张图片 这里要用到的主要工具是requests这个工具,需要先安装这个库才能使用,该库衍生自urllib这个库,但是要比它更好用.多数人在做爬虫的时候选择它,是个不错的选择. ...

  9. 用python处理excel表格_如何用python处理excel数据 | 用python处理excel表格数据类型

    python 读取EXCEL文件中的数据格式 扩展库 xlrd 读excle xlwt 写excle 直上搜就能下载 下载后使用 import xlrd 就可以读excle了 打开文件: xls = ...

最新文章

  1. windows下redis 和 hiredis的编译与使用
  2. html服务器端运行python,如何通过点击网页在远程服务器上运行python脚本?
  3. 【lua学习】4.表
  4. Matlab看跌期权二叉树,欧式期权二叉树MATLAB程序
  5. Javascript学习笔记一 之 数据类型
  6. win10mysql卸载与重装_win10下完全卸载+重装MySQL步骤详解
  7. Java实现计算器的基本功能
  8. mysql 文本处理函数,MySQL常用的文本处理函数
  9. Mac 安装 MySQL 教程
  10. 2022-2028全球汽车后置摄像头模组行业调研及趋势分析报告
  11. 软件开发量评估法之一---德尔菲评估法
  12. 使用浏览器访问服务器shell(ssh方式)
  13. Android 9.0 Wifi连接AP过程
  14. 游戏中的亚洲后现代电影
  15. 微信小程序解密手机号码异常
  16. 活动星投票国潮大秀东方网络评选投票怎么做的免费微信投票活动
  17. BIG ENDIAN V.S. LITTER ENDIAN
  18. Linux下安装GPU显卡驱动
  19. 可以在浏览器中在线编辑office文件的扩展程序汇总
  20. 【Android开发】自定义圆角button样式

热门文章

  1. 数据查询(3)-复杂查询
  2. Cannot resolve symbol XXX
  3. odyssey ios13.6 a12 iphone xr越狱相关
  4. NATO Phonetic Alphabet Western Union Phonetic Alphabet (标准电话用字母表)
  5. 网站怎么配置服务器地址,如何给网站配置服务器地址
  6. Git版本控制 从入门到精通
  7. SnapGene 5.2.4 for Win中英文版 附安装教程
  8. 使用递归算法计算1~n的自然数之和
  9. 循环矩阵的创建python
  10. 【精荐一】山地车变速器调整;变速异响(变速不到位)调节方法