当前位置:

首页 > 图像处理 > 编程开发 > 用 Python 给你一个圣诞帽

用 Python 给你一个圣诞帽

圣诞将至,虽然咱不过这洋节,但是热闹还是要凑一下的,相信已经有很多圣诞帽相关的周边在流传了,今天咱们就自己动手,给头像增加一个圣诞帽基础知识准备在计算机中,图像是以矩阵的形式保存的,先行后列。所以,一张宽×高×颜色通道=480×256×3的图片会保存在一个256×480×3的三维张量中。图像处理时也是按照这种思想进行计算的(其中就包括OpenCV下的图像处理),即高×宽×颜色通道。数字图像对于一幅的数字图像,我们看到的是肉眼可见的一幅真正的图片,但是计算机看来,这副图像只是一堆亮度各异的点。一副尺

本文目录

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

    基础知识准备

    在计算机中,图像是以矩阵的形式保存的,先行后列。所以,一张宽×高×颜色通道=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-opencv
    
    pip install dlib

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

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

    用 Python 给你一个圣诞帽

    代码处理

    帽子处理

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

    用 Python 给你一个圣诞帽

    先提取帽子图片的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图

    用 Python 给你一个圣诞帽

    alpha图

    用 Python 给你一个圣诞帽

    对于的打印出的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 - 1
    hat_newsize = cv2.resize(rgb_hat, (hat_w, hat_h))
    mask = cv2.resize(a, (hat_w, hat_h))
    mask_inv = cv2.bitwise_not(mask)
    dh = 0
    dw = 0
    
    bg_roi = img[y+dh-hat_h:y+dh,(eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)]

    ROI 提取

    进行 ROI 提取

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

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

    用 Python 给你一个圣诞帽

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

    用 Python 给你一个圣诞帽

    接下来在人脸图片中取出安装帽子的区域(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类型进行运算,最后又转换回来。

    合成的图片

    用 Python 给你一个圣诞帽

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

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

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

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

    用 Python 给你一个圣诞帽

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

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

    合成图片

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

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

    效果如下:

    用 Python 给你一个圣诞帽

    刚刚好,完美叠加图片。

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

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

    用 Python 给你一个圣诞帽

    美美的图片就出来啦!

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

    用 Python 给你一个圣诞帽

    用 Python 给你一个圣诞帽

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

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    图像处理 编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    Windows 安装 Python:从官方入口到虚拟环境的可复现实践
    Windows 安装 Python:从官方入口到虚拟环境的可复现实践

    面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。