利用 Python 把小伙伴制作成表情包

目录
  • 一、项目说明
  • 二、实现步骤
  • 三、Python实现
    • 1、导入需要的库
    • 2、绘图函数
    • 3、导入前景照片
    • 4、等比例缩放前景照片
    • 5、对前景照片进行二值化处理
    • 6、提取出感兴趣区域
    • 7、旋转图片
    • 8、将一些不需要的黑色区域删除掉
    • 9、再次提取感兴趣区域并缩放
    • 10、导入背景图片
    • 11、组合两张图片成表情包
    • 12、在表情包下面添加文本
      • 12.1添加英文文本
      • 12.2添加中文文本
    • 13、保存表情包
  • 四、完整代码

一、项目说明

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

效果如下图所示:

二、实现步骤

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

三、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、旋转图片

因为我们的背景图片(熊猫头)是正的,而前景图片有些向右倾斜,所以要先对其进行旋转操作(大概逆时针旋转 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.copypts1 = 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 mpimport matplotlib.pyplot as pltfrom PIL import Image, ImageDraw, ImageFontdef plt_show(img):imageRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)plt.imshow(imageRGB)plt.showimage = 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.shapeimage_rotate_copy = image_rotate.copypts1 = 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.shapeh_b, w_b = background.shapeleft = (w_b - w_f)//2
right = left + w_ftop = 80
bottom = top + h_femoji = backgroundemoji[top: bottom, left: right] = foreground_roi_resizePilImg = Image.fromarray(emoji) # cv2 转 PILdraw = 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)) # 保存表情包

到此这篇关于利用 Python 把小伙伴变成表情包的文章就介绍到这了,更多相关用 Python 制作表情包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python实战之制作表情包游戏

    导语 大家好,我是木木子(๑╹◡╹)ノ" 今日迟来的游戏更新! 仅仅是因为最近练车一直没咋时间了~ 科二还挂科了23333~我emo了

  • 使用Python制作表情包实现换脸功能

    "表情包"是现在非常流行的交流方式,通过一张图片就能把文字不能表达或不便于表达的情感给表示出来,表情包一经诞生,就统治了中国人的社交圈,尤其是年轻人,他们的社交方式是所谓"天可不聊,图不可不斗",几乎任何对话都会出现表情包的身影,一言不合就斗图,自己也会在聊天中发几个表情包,可是总会造成一些小误会,比如下面的图 有好多朋友看到这个表情包之后误以为这也是我用Python做的,其实不然,这个图就是网上普通的表情包,但是今天我要用Python做几个表情包. 今天制作表情包

  • 利用 Python 把小伙伴制作成表情包

    目录 一.项目说明 二.实现步骤 三.Python实现 1.导入需要的库 2.绘图函数 3.导入前景照片 4.等比例缩放前景照片 5.对前景照片进行二值化处理 6.提取出感兴趣区域 7.旋转图片 8.将一些不需要的黑色区域删除掉 9.再次提取感兴趣区域并缩放 10.导入背景图片 11.组合两张图片成表情包 12.在表情包下面添加文本 12.1添加英文文本 12.2添加中文文本 13.保存表情包 四.完整代码 一.项目说明 在日常生活中,我们经常会存取一些朋友们的丑照,在这个项目中,我们以萌萌哒的

  • 基于PyQt5制作一个表情包下载器

    每次和朋友聊天苦于没有表情包,而别人的表情包似乎是取之不尽.用之不竭.作为一个程序员哪能甘愿认输,于是做了一个表情包下载器供大家斗图. 首先,还是介绍一下设计思路吧,和我们之前做的百度图片下载器2.0一样,使用pyqt5作为UI界面制作的框架,然后就是找一个表情包网站供我们可以下载很多的表情包. 表情包使用的网站是这个,大家也可以使用自己发现的表情包网站做下载. 话不多说,我们先说明一下使用到的python库有哪些. UI界面使用到的pyqt5模块是下面这几个,之前也是一直使用这几个库做UI界面

  • 利用python将图片转换成excel文档格式

    前言 本文主要介绍了关于利用python将图片转换成excel文档的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现步骤 读取图像,获取图像每个像素点的RGB值: 根据每个像素点的RGB值设置excel每个方格的颜色值: 根据像素点的坐标,写入excel文件: 保存退出: 示例代码 from PIL import Image import numpy as np import time import matplotlib.pyplot as plt import

  • Python基础进阶之海量表情包多线程爬虫功能的实现

    一.前言 在我们日常聊天的过程中会使用大量的表情包,那么如何去获取表情包资源呢?今天老师带领大家使用python中的爬虫去一键下载海量表情包资源 二.知识点 requests网络库 bs4选择器 文件操作 多线程 三.所用到得库 import os import requests from bs4 import BeautifulSoup 四. 功能 # 多线程程序需要用到的一些包 # 队列 from queue import Queue from threading import Thread

  • 利用Python为女神制作一个专属网站

    目录 数据准备 网站搭建 服务部署 先来看一下效果吧,只要有足够的照片素材,捕获女神的心就指日可待 怎么样,看起来还可以吧 下面就一起来完成吧 数据准备 首先是测试图片的获取,毕竟萝卜哥当前还没有那么多女神的照片 这里我使用如下网站的高清图片,嗯,各个都是大美女 抓取的代码比较简单 import requests import json def get_pic():     headers = {"Accept": "application/json, text/javasc

  • 利用Python代码制作过年春联

    目录 一.春联一 1.效果展示 2.代码展示 二.春联二 1.环境准备 2.效果展示 3.代码 一.春联一 1.效果展示 2.代码展示 index.html <!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <title>css3春联切换</title> <link rel="stylesheet&qu

  • 详解利用Python制作中文汉字雨效果

    直接上代码 import pygame import random def main(): # 初始化pygame pygame.init() # 默认不全屏 fullscreen = False # 窗口未全屏宽和高 WIDTH, HEIGHT = 1100, 600 init_width, init_height = WIDTH, HEIGHT # 字块大小,宽,高 suface_height = 18 # 字体大小 font_size = 20 # 创建一个窗口 screen = pyga

  • Nodejs 发布自己的npm包并制作成命令行工具的实例讲解

    <span style="font-family:Arial, Helvetica, sans-serif;background-color:rgb(255,255,255);">近日当我在使用npm上已经存在的一个包时,发现它有bug:于是决定自己实现这个功能,自己写一个npm包.</span> 下面我记录一下自己的实现过程. 1. npm init 选择一个文件夹,然后用命令行cd进去,然后执行npm init,这时会生成一长串表单,根据自己的实际情况填写内

随机推荐