python头像怎么弄_如何用 Python 把朋友头像变表情包?!!
转自: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 把朋友头像变表情包?!!相关推荐
- python交互界面数据分析_如何用 Python 和 Streamlit 做交互式数据分析产品?
「本文参与少数派 2019 年度征文 + 效率有心得」 不用学前端编程,你就能用 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户. 痛点 从我开始折腾数据 ...
- python程序写蛇_如何用Python画一条蛇
先上效果图 最近又打算重新学习Python了, 之前也入门过Python, 但是弄完Python的开发环境后, 停留在print("hello world")阶段 非科班出身, 没 ...
- python 矩阵运算 for循环_如何用 Python 科学计算中的矩阵替代循环
展开全部 因为在Mathematica中使用循环确实是低效的.32313133353236313431303231363533e78988e69d8331333361313961..... 深层次的原 ...
- python搭建自动化测试平台_如何用python语言搭建自动化测试环境
原标题:如何用python语言搭建自动化测试环境 技术分享:基于Python语言的Web自动化测试环境搭建 近期发现很多初学者在学习自动化的过程当中,在环境安装环节总是出现问题,所以详细的出一篇环境搭 ...
- 如何制作python检查小软件_如何用Python制作整蛊小程序
原标题:如何用Python制作整蛊小程序 下面的整蛊程序,千万不要发代码,否则就实现不了你整蛊的目的了.完成后一定要打包成一个exe程序,再发给朋友使用 . 1. 使用 pip install pyi ...
- python rest api 测试_如何用Python编写REST API的单元测试
在过去的几个月中,正在从事一个名为B的项目.它是带有简单Web UI的徽章生成器,用于添加数据并生成PDF可打印徽章.B后端现在已转移到REST-API并测试REST-API中使用的功能,我们需要一些 ...
- python的out模式_如何用python中的DataFrame列的模式替换NA值?
我对Python(和本网站)完全陌生,目前正试图用它们的模式替换特定数据帧列中的NA值.我试过了各种不起作用的方法.请帮我看看我做错了什么:如何用python中的DataFrame列的模式替换NA值? ...
- 用python做一张图片_如何用python下载一张图片
如何用python下载一张图片 这里要用到的主要工具是requests这个工具,需要先安装这个库才能使用,该库衍生自urllib这个库,但是要比它更好用.多数人在做爬虫的时候选择它,是个不错的选择. ...
- 用python处理excel表格_如何用python处理excel数据 | 用python处理excel表格数据类型
python 读取EXCEL文件中的数据格式 扩展库 xlrd 读excle xlwt 写excle 直上搜就能下载 下载后使用 import xlrd 就可以读excle了 打开文件: xls = ...
最新文章
- windows下redis 和 hiredis的编译与使用
- html服务器端运行python,如何通过点击网页在远程服务器上运行python脚本?
- 【lua学习】4.表
- Matlab看跌期权二叉树,欧式期权二叉树MATLAB程序
- Javascript学习笔记一 之 数据类型
- win10mysql卸载与重装_win10下完全卸载+重装MySQL步骤详解
- Java实现计算器的基本功能
- mysql 文本处理函数,MySQL常用的文本处理函数
- Mac 安装 MySQL 教程
- 2022-2028全球汽车后置摄像头模组行业调研及趋势分析报告
- 软件开发量评估法之一---德尔菲评估法
- 使用浏览器访问服务器shell(ssh方式)
- Android 9.0 Wifi连接AP过程
- 游戏中的亚洲后现代电影
- 微信小程序解密手机号码异常
- 活动星投票国潮大秀东方网络评选投票怎么做的免费微信投票活动
- BIG ENDIAN V.S. LITTER ENDIAN
- Linux下安装GPU显卡驱动
- 可以在浏览器中在线编辑office文件的扩展程序汇总
- 【Android开发】自定义圆角button样式
热门文章
- 数据查询(3)-复杂查询
- Cannot resolve symbol XXX
- odyssey ios13.6 a12 iphone xr越狱相关
- NATO Phonetic Alphabet Western Union Phonetic Alphabet (标准电话用字母表)
- 网站怎么配置服务器地址,如何给网站配置服务器地址
- Git版本控制 从入门到精通
- SnapGene 5.2.4 for Win中英文版 附安装教程
- 使用递归算法计算1~n的自然数之和
- 循环矩阵的创建python
- 【精荐一】山地车变速器调整;变速异响(变速不到位)调节方法