用 Python 给你一个圣诞帽

圣诞将至,虽然咱不过这洋节,但是热闹还是要凑一下的,相信已经有很多圣诞帽相关的周边在流传了,今天咱们就自己动手,给头像增加一个圣诞帽

基础知识准备

在计算机中,图像是以矩阵的形式保存的,先行后列。所以,一张宽×高×颜色通道=480×256×3的图片会保存在一个256×480×3的三维张量中。图像处理时也是按照这种思想进行计算的(其中就包括 OpenCV 下的图像处理),即 高×宽×颜色通道。

数字图像

对于一幅的数字图像,我们看到的是 肉眼可见的一幅真正的图片,但是计算机看来,这副图像只是一堆亮度各异的点。一副尺寸为 M × N 的图像可以用一个 M × N 的矩阵来表示,矩阵元素的值表示这个位置上的像素的亮度,一般来说像素值越大表示该点越亮。

一般来说,灰度图用 2 维矩阵表示,彩色(多通道)图像用 3 维矩阵(M× N × 3)表示。

图像通道

描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。如果一个像素点,有RGB三种颜色来描述它,就是三通道。而四通道图像,就是R、G、B加上一个A通道,表示透明度。一般叫做alpha通道,表示透明度。

ROI和mask

Setting Region of Interest (ROI),翻译成白话为,设置感兴趣的区域。mask是做图像掩膜处理,相当于把我们不关心的部位覆盖住,留下ROI部分。上面说的alpha就可以作为mask。

矩阵(Numpy)知识

矩阵索引、切片等,这里我自己掌握的也不好,就不多说了,小伙伴儿们可以自行学习。

环境准备

有了基础知识后,我们来简单看下代码。

首先安装需要要用到的 OpenCV​ 和 dlib 库,使用pip分别安装之

pip install python-opencvpip install dlib

登录后复制

然后手工在网上下载数据模型文件 shape_predictor_5_face_landmarks.dat,地址如下:http://dlib.net/files/,下载后放到项目目录下。

有兴趣的同学可以玩玩那个 shape_predictor_68_face_landmarks.dat,识别出的人脸关键点有68个之多呢。

图片

代码处理

帽子处理

我们首先要做的就是处理帽子,我们使用的图片如下

图片

先提取帽子图片的rgb和alpha值

# 帽子图片hat_img3 = cv2.imread("hat.png", -1)r, g, b, a = cv2.split(hat_img3)rgb_hat = cv2.merge((r, g, b))cv2.imwrite("rgb_hat.jpg", rgb_hat)cv2.imwrite("alpha.jpg", a)print(a)print(hat_img3.shape)print(rgb_hat.shape)

登录后复制

我们得到的效果如下:

rgb图

图片

alpha图

图片

对于的打印出的a数值如下:

[[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] ... [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]]

登录后复制

人脸检测

下面进行人脸检测,使用dlib处理。

# 人脸检测dets = self.detector(img, 1)x, y, w, h = dets[0].left(), dets[0].top(), dets[0].right() - dets[0].left(), dets[0].bottom() - dets[0].top()# 关键点检测shape = self.predictor(img, dets[0])point1 = shape.parts()[0]point2 = shape.parts(2)# 求两点中心eyes_center = ((point1.x + point2.x) // 2, (point1.y + point2.y) // 2)

登录后复制

接下来是按照比例缩小帽子的图片

# 帽子和人脸转换比例hat_w = int(round(dets[0].right()/1.5))hat_h = int(round(dets[0].bottom() / 2))if hat_h > y:hat_h = y - 1hat_newsize = cv2.resize(rgb_hat, (hat_w, hat_h))mask = cv2.resize(a, (hat_w, hat_h))mask_inv = cv2.bitwise_not(mask)dh = 0dw = 0bg_roi = img[y+dh-hat_h:y+dh,(eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)]

登录后复制

ROI 提取

进行 ROI 提取

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

登录后复制

mask 变量,取出了帽子的区域。

图片

mask_inv 变量,用来取出人脸图片中安装帽子的区域。

图片

接下来在人脸图片中取出安装帽子的区域(ROI)

# 原图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')

登录后复制

这里是把图片默认的uint8​类型转换成了float类型进行运算,最后又转换回来。

合成的图片

图片

黑黑的部分就是我们要放置帽子的地方。

在帽子图片中提取帽子部分。

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

登录后复制

使用刚刚调整大小的帽子图片来提取。

图片

可以看到,除了帽子部分,其他区域已经掩模处理了。

以上就是提取ROI的过程,比较难懂,需要好好琢磨,尤其是矩阵的切片、mask处理部分。

合成图片

最后一步就是把人脸图片与帽子合成到一起了,也就是把人脸空余帽子部分的图片区域和帽子只展示帽子区域的图片区域(有点拗口)合并在一起。

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

登录后复制

效果如下:

图片

刚刚好,完美叠加图片。

最后把这个片段放回人脸原图中,展示图片

img[y+dh-hat_h:y+dh, (eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)] = add_hat

登录后复制

图片

美美的图片就出来啦!

我们再尝试几张不同的图片。

图片

图片

整体效果还不错哦,需要注意的是,在测试的时候,我们尽量选择人脸占比比较大的图片来合成,效果要好很多哦~

以上就是用 Python 给你一个圣诞帽的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2241925.html

(0)
上一篇 2025年2月26日 20:46:15
下一篇 2025年2月23日 08:40:56

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python编程:如何实现类装饰器及应用?要点要掌握

    示例 Python中的装饰器既可以是函数也可以是类。在前几节中,我们使用的是函数装饰器。现在,我们将学习如何定义类装饰器。 我们将定义充当装饰器的自定义类。当用类装饰/修饰函数时,该函数就成为该类的实例。让我们来一探究竟: 如上所示,我们创…

    2025年2月26日 编程技术
    200
  • 五分钟菜鸟学会Python玩转SQL的神器!

    背景 其实一开始用的是pymysql,但是发现维护比较麻烦,还存在代码注入的风险,所以就干脆直接用ORM框架。 ORM即Object Relational Mapper,可以简单理解为数据库表和Python类之间的映射,通过操作Python…

    2025年2月26日
    200
  • 时间序列特征提取的Python和Pandas代码示例

    使用Pandas和Python从时间序列数据中提取有意义的特征,包括移动平均,自相关和傅里叶变换。 前言 时间序列分析是理解和预测各个行业(如金融、经济、医疗保健等)趋势的强大工具。特征提取是这一过程中的关键步骤,它涉及将原始数据转换为有意…

    2025年2月26日 编程技术
    200
  • 小白必读!十大被低估的Python自带库!

    大 大家在学习python的过程中,都会了解到python的一个强大的功能在于各种强大的第三方库函数,大家只需要通过pip install 即可安装我们需要的库函数。 家往往只是关注自己安装的python库,却忽略了python自带的库函数…

    2025年2月26日 编程技术
    200
  • 用于清理数据的五个简单有效 Python 脚本

    将 PDF 转换为 CSV 在机器学习中,我们应该少一些“数据清理”,多一些“数据准备”。当我们需要从白皮书、电子书或其他PDF文档中抓取数据时,这个脚本为我节省了很多时间。 import tabula#获取文件pdf_filename =…

    2025年2月26日
    200
  • Python爬取天气数据及可视化分析

    正文  大家好,我是Python人工智能技术 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物、安排出行,每天的气温、风速风向、相对湿度、空气质量等成为关注的焦点。得到温湿度度变化曲线、空气质量图、风向雷达图等结果,为获得未来天气信…

    2025年2月26日 编程技术
    200
  • Python 批量加水印只需一行命令!

    工作的时候,尤其是自媒体工作者,必备水印添加工具以保护知识产权图片,网上有许多的在线/下载的水印添加工具,但他们或多或少都存在以下问题: 1. 在线工具需要将图片上传到对方服务器,信息不安全。 2. 很多工具不具备批量处理功能。 3. 很多…

    2025年2月26日 编程技术
    200
  • 一行 Python 代码实现并行

    Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏”重”。而且往往隔靴搔痒,没有深入探讨…

    2025年2月26日
    200
  • Python 字符串总结,建议收藏!

    什么是 Python 字符串 字符串是包含一系列字符的对象。字符是长度为 1 的字符串。在 Python 中,单个字符也是字符串。但是比较有意思的是,Python 编程语言中是没有字符数据类型的,不过在 C、Kotlin 和 Java 等其…

    2025年2月26日
    200
  • Python使用Dash开发网页应用

    Python Dash开发Web应用的控件基础 本文主要是通过Dash的Checklist组件,简单介绍使用Dash开发的Web应用 展示效果如下: python dash简单基础 Dash应用程序由两部分组成: 第一部分是应用程序的布局(…

    2025年2月26日
    200

发表回复

登录后才能评论