Python给你的头像加上圣诞帽

引言

随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以做到。但是作为一个学习图像处理的技术人,还是觉得我们有必要写一个程序来做这件事情。而且这完全可以作为一个练手的小项目,工作量不大,而且很有意思。

用到的工具

OpenCV(毕竟我们主要的内容就是OpenCV…)

dlib(前一篇文章刚说过,dlib的人脸检测比OpenCV更好用,而且dlib有OpenCV没有的关键点检测。)

用到的语言为Python。但是完全可以改成C++版本,时间有限,就不写了。有兴趣的小伙伴可以拿来练手。

流程一、素材准备

首先我们需要准备一个圣诞帽的素材,格式最好为PNG,因为PNG的话我们可以直接用Alpha通道作为掩膜使用。我们用到的圣诞帽如下图:

我们通过通道分离可以得到圣诞帽图像的alpha通道。代码如下:

r,g,b,a = cv2.split(hat_img)
rgb_hat = cv2.merge((r,g,b))

cv2.imwrite("hat_alpha.jpg",a)

为了能够与rgb通道的头像图片进行运算,我们把rgb三通道合成一张rgb的彩色帽子图。Alpha通道的图像如下图所示。

二、人脸检测与人脸关键点检测

我们用下面这张图作为我们的测试图片。

下面我们用dlib的正脸检测器进行人脸检测,用dlib提供的模型提取人脸的五个关键点。代码如下:

  # dlib人脸关键点检测器
  predictor_path = "shape_predictor_5_face_landmarks.dat"
  predictor = dlib.shape_predictor(predictor_path) 

  # dlib正脸检测器
  detector = dlib.get_frontal_face_detector()

  # 正脸检测
  dets = detector(img, 1)

  # 如果检测到人脸
  if len(dets)>0:
    for d in dets:
      x,y,w,h = d.left(),d.top(), d.right()-d.left(), d.bottom()-d.top()
      # x,y,w,h = faceRect
      cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2,8,0)

      # 关键点检测,5个关键点
      shape = predictor(img, d)
      for point in shape.parts():
        cv2.circle(img,(point.x,point.y),3,color=(0,255,0))

      cv2.imshow("image",img)
      cv2.waitKey()

这部分效果如下图:

三、调整帽子大小

我们选取两个眼角的点,求中心作为放置帽子的x方向的参考坐标,y方向的坐标用人脸框上线的y坐标表示。然后我们根据人脸检测得到的人脸的大小调整帽子的大小,使得帽子大小合适。

# 选取左右眼眼角的点
  point1 = shape.part(0)
  point2 = shape.part(2)

  # 求两点中心
  eyes_center = ((point1.x+point2.x)//2,(point1.y+point2.y)//2)

  # cv2.circle(img,eyes_center,3,color=(0,255,0))
  # cv2.imshow("image",img)
  # cv2.waitKey()

  # 根据人脸大小调整帽子大小
  factor = 1.5
  resized_hat_h = int(round(rgb_hat.shape[0]*w/rgb_hat.shape[1]*factor))
  resized_hat_w = int(round(rgb_hat.shape[1]*w/rgb_hat.shape[1]*factor))

  if resized_hat_h > y:
    resized_hat_h = y-1

  # 根据人脸大小调整帽子大小
resized_hat = cv2.resize(rgb_hat,(resized_hat_w,resized_hat_h))

四、提取帽子和需要添加帽子的区域

按照之前所述,去Alpha通道作为mask。并求反。这两个mask一个用于把帽子图中的帽子区域取出来,一个用于把人物图中需要填帽子的区域空出来。后面你将会看到。

# 用alpha通道作为mask
mask = cv2.resize(a,(resized_hat_w,resized_hat_h))
mask_inv = cv2.bitwise_not(mask)

从原图中取出需要添加帽子的区域,这里我们用的是位运算操作。

 # 帽子相对与人脸框上线的偏移量
 dh = 0
 dw = 0
  # 原图ROI
  # bg_roi = img[y+dh-resized_hat_h:y+dh, x+dw:x+dw+resized_hat_w]
  bg_roi = img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)]

 # 原图ROI中提取放帽子的区域
  bg_roi = bg_roi.astype(float)
 mask_inv = cv2.merge((mask_inv,mask_inv,mask_inv))
 alpha = mask_inv.astype(float)/255

  # 相乘之前保证两者大小一致(可能会由于四舍五入原因不一致)
  alpha = cv2.resize(alpha,(bg_roi.shape[1],bg_roi.shape[0]))
  # print("alpha size: ",alpha.shape)
  # print("bg_roi size: ",bg_roi.shape)
  bg = cv2.multiply(alpha, bg_roi)
  bg = bg.astype('uint8')

这是的背景区域(bg)如下图所示。可以看到,刚好是需要填充帽子的区域缺失了。

然后我们提取帽子区域。

# 提取帽子区域
hat = cv2.bitwise_and(resized_hat,resized_hat,mask = mask)

提取得到的帽子区域如下图。帽子区域正好与上一个背景区域互补。

五、添加圣诞帽

最后我们把两个区域相加。再放回到原图中去,就可以得到我们想要的圣诞帽图了。这里需要注意的就是,相加之前resize一下保证两者大小一致,因为可能会由于四舍五入原因不一致。

# 相加之前保证两者大小一致(可能会由于四舍五入原因不一致)
   hat = cv2.resize(hat,(bg_roi.shape[1],bg_roi.shape[0]))
   # 两个ROI区域相加
   add_hat = cv2.add(bg,hat)
   # cv2.imshow("add_hat",add_hat) 

   # 把添加好帽子的区域放回原图
 img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)] = add_hat

最后我们得到的效果图如下所示。

下载:完整代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 今天 平安夜 Python 送你一顶圣诞帽 @微信官方

    还有多少耿直boy和我一样在等待微信官方送上一顶圣诞帽? 最后知道真相的我眼泪掉下来-- (还蒙在鼓里的同学请在微信最上方的搜索栏自行搜索『圣诞帽』) 好吧,你不给,咱自己来,不就是个帽子嘛. Python 在手,圣诞帽我有! OpenCV 库 加上几张圣诞帽图片,三四十行代码轻松搞定.只不过调试的时候要注意点,图像坐标和像素矩阵索引的维度别搞乱了. 大致步骤: 安装 OpenCV(网上搜下教程有很多): 用 OpenCV 提供的级联分类器做 人脸检测 ,定位出图片中的人脸位置: 根据找出的人脸

  • Python给你的头像加上圣诞帽

    引言 随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽.当然这种事情用很多P图软件都可以做到.但是作为一个学习图像处理的技术人,还是觉得我们有必要写一个程序来做这件事情.而且这完全可以作为一个练手的小项目,工作量不大,而且很有意思. 用到的工具 OpenCV(毕竟我们主要的内容就是OpenCV-) dlib(前一篇文章刚说过,dlib的人脸检测比OpenCV更好用,而且dlib有OpenCV没有的关键点检测.) 用到的语言为Python.但是完全可以改成C++版本,时间有限,就不写了

  • 使用Python给头像加上圣诞帽或圣诞老人小图标附源码

    随着圣诞的到来,想给给自己的头像加上一顶圣诞帽.如果不是头像,就加一个圣诞老人陪伴. 用Python给头像加上圣诞帽,看了下大概也都是来自2017年大神的文章:https://zhuanlan.zhihu.com/p/32283641 主要流程 素材准备 人脸检测与人脸关键点检测 调整大小,添加帽子 用dlib的正脸检测器进行人脸检测,用dlib提供的模型提取人脸的五个关键点 调整帽子大小,带帽 选取两个眼角的点,求中心作为放置帽子的x方向的参考坐标,y方向的坐标用人脸框上线的y坐标表示.然后我

  • 利用Python实现一键将头像转成动漫风

    目录 PyQt5框架 代码逻辑 最近在Github上面有看到将头像转化成动漫风的项目,但是对于不少没有技术背景的同学来说可能就不知道该怎么使用了,小编今天制作了一个UI界面,大家可以通过一键点击就实现头像照片转化成动漫风格的功能. PyQt5框架 用Python编程语言来制作UI界面的框架有很多哈,大家原则上哪种框架用的顺手就用哪种框架,小编这里使用的是PyQt的框架,因为它支持手动绘制控件,并且可以动态加载,我们在Pycharm当中添加上QtDesigner作为外部工具,来进行界面设置,生成u

  • Python实现好友全头像的拼接实例(推荐)

    微信好友全头像 话不多说,直接上代码 import itchat import math import PIL.Image as Image import os itchat.auto_login() friends = itchat.get_friends(update=True)[0:] user = friends[0]["UserName"] num = 0 for i in friends: img = itchat.get_head_img(userName=i["

  • Python 给屏幕打印信息加上颜色的实现方法

    语法 print('\033[显示方式;字体色;背景色m文本\033[0m') # 三种设置都可以忽略不写,都不写则为默认输出 配置如下 # 字体 背景 颜色 # --------------------------------------- # 30 40 黑色 # 31 41 红色 # 32 42 绿色 # 33 43 黄色 # 34 44 蓝色 # 35 45 紫红色 # 36 46 青蓝色 # 37 47 白色 # # 显示方式 # ------------------------- #

  • Python帮你微信头像任意添加装饰别再@微信官方了

    @微信官方 昨天朋友圈刷爆了@微信官方的梗,从起初的为头像添加国旗,到最后的各种Book思议的需求-而我呢?@了辣么辣么多的奥特曼,结果还是加班到12点多-最后想想,人还是得靠自己吧,@我自己吧- 昨天最近每晚加班回家都凌晨了,昨晚因为太累没更新,今天再不更新感觉有点太对不起大家,所以想想今天就学着@微信官方,用Python给我们的微信头像添加国旗吧! 说说上篇文章 上篇文章如何把图片变得炫酷多彩,Python教你这样实现!,其实也是讲关于图片拼接的内容,只是有些朋友私下微信和我说,分块加载的方

  • Python 将 QQ 好友头像生成祝福语的实现代码

    本文我们来看一下如何使用 Python 将 QQ 好友头像拼成"五一快乐"四个字.我们可以将整个实现过程分为两步:爬取 QQ 好友头像.利用好友头像生成文字. 爬取头像 爬取 QQ 好友头像我们需要借助于 QQ 邮箱,首先我们从浏览器上登录 QQ 邮箱,之后按 F12 键打开开发者工具并用鼠标选中 Network 选项,如下图所示: 再接着我们按 F5 键刷新一下网页,然后在 Filter 中输入 laddr_lastlist ,如下图所示: 我们再点 Name 下的链接,点击之后右侧

  • 如何利用Python给自己的头像加一个小国旗(小月饼)

    今年国庆节也是中秋节,首先祝大家节日快乐,本文我们使用 Python 来给自己的头像加一个小国旗或小月饼. 国旗 对于国旗,我们可以使用 Python 来画一个,用到的 Python 库是大家比较熟悉的 turtle,我们的五星红旗组成元素包括:红底.一颗黄的主星和四颗黄的副星. 首先画一个长方形的红底,代码实现如下: turtle.setup(600, 400, 0, 0) turtle.bgcolor("red") 效果如下: 接着画一颗主星,代码实现如下: turtle.fill

  • Python拼接微信好友头像大图的实现方法

    基于 itchat 库来获取微信好友头像并执行拼接操作,对微信上文字化好友列表数据进行可视化展示. 获取好友头像 def save_avatar(folder): """ 保存微信好友头像 :param folder: 保存的文件夹 """ itchat.auto_login(hotReload=True) users = itchat.get_friends() or [] print('%d friends found.' % len(use

  • 使用Python给头像戴上圣诞帽的图像操作过程解析

    前言 随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽.当然这种事情用很多P图软件都可以做到.但是作为一个学习图像处理的技术人,还是觉得我们有必要写一个程序来做这件事情.而且这完全可以作为一个练手的小项目,工作量不大,而且很有意思. 用到的工具 OpenCV(毕竟我们主要的内容就是OpenCV...) dlib(dlib的人脸检测比OpenCV更好用,而且dlib有OpenCV没有的关键点检测.) 用到的语言为Python.但是完全可以改成C++版本,时间有限,就不写了.有兴趣的小伙

随机推荐