利用Opencv实现人像迁移
前言:
Hello大家好,我是Dream。 今天来学习一下如何使用Opencv实现人像迁移,欢迎大家一起参与探讨交流~
本文目录:
- 一、实验要求
- 二、实验环境
- 三、实验原理及操作
- 1.照片准备
- 2.图像增强
- 3.实现美颜功能
- 4.背景虚化
- 5.图像二值化处理
- 6.人像迁移
- 四、实验结果
- 1.原图、空间直方图均衡化后图像
- 2.美颜后的人物图像与更改后的风景图像
- 3.人像二值图
- 4.人像迁移图
- 五、结果分析
- 六、附录代码
- 七、实验报告
一、实验要求
利用Python和Opencv算法,实现下述功能:
- 从网上下载一张纯色背景前的老人面部照片,并且要求背景颜色与皮肤、衣服的颜色区别较大。
- 准备一张风景图片。
- 利用图像增强算法处理人像照片,以提升照片的品质。
- 利用图像处理算法去除老人面部的皱纹或色斑,实现美颜功能。
- 利用图像处理算法处理风景图片,使风景图片变得模糊,实现背景虚化。
- 利用图像处理算法将步骤4得到的人像图像进行二值化处理,人像部分为0,背景部分为1。
- 利用步骤6得到的二值图像将步骤5得到的风景图像中用于合成人像区域的像素置为黑色后,与步骤4得到的人像图像进行合成,实现人像迁移。
撰写实验报告,将上述处理的原理与处理流程进行介绍;保存上述每一步的结果图像,并附加在实验报告中;最终对处理结果进行分析,并附加程序。
二、实验环境
解释器:Python3.9、开发环境:PyCharm
三、实验原理及操作
1.照片准备
老人照片(上)、风景照片(下)
2.图像增强
图像增强使用自适应直方图均衡化操作。
因为原始图像为RGB
彩色图像,直接使用直方图均衡化操作后会使颜色失真,故先将原始图像转化到HSI
空间,对其中I通道(亮度)进行直方图均衡化,再转回RGB空间,这就实现了彩色图像的直方图均衡化,图像的亮度直方图会分布的更加均衡。如果在 RGB
彩色空间内完成直方图均衡化的,虽然的确有将原图中的阴暗部分变得明亮起来,但是颜色的失真也是比较严重的。在均衡化过程中不仅改变了亮度,也改变了彩色,产生了不正确的彩色。
在 HSI 彩色空间均衡化方法得到的结果图像效果是比较好的,整个图像都有效的加亮了,而彩色本身(色调)是不变的。这里使用的是自适应直方图均衡化,能够降低图像的全局依赖性,更多的保留图像的局部特征。
3.实现美颜功能
磨皮算法的功能就是消除脸部的斑点、瑕疵或者杂色,使得人物脸部更加细腻,轮廓更加清晰。 在实际的人脸磨皮中,一般还包含不同程度的预处理。我们使用传统的方法先对人脸中的脸部皮肤区域进行提取。基于皮肤的颜色特性,我们将图像转换到HSV色域,然后对逐像素点阈值判断,分离出了人脸面部皮肤像素点集合。在代码运行中,我们先对整张图片进行了双边滤波,然后将双边滤波结果和原图片输入原函数,使用皮肤像素点判断的方法,将原图中皮肤的像素替换成了对应的双边滤波后的像素。使用双边滤波,能够使滤波算法在处理人脸皮肤时,不对其它器官,如嘴唇,眼睛,眉毛等造成影响,同时不会干扰到背景。
注意滑动窗口的大小和双边方差的参数不宜设置的过大,否则会造成磨皮效果模糊或者过于磨皮。 同时设置过小,磨皮效果不明显,我们使用的是参数是:15*3,这样可以很好的实现我们想要的效果。
4.背景虚化
利用图像处理算法中的均值滤波处理风景图片,使风景图片变得模糊,实现背景虚化。然后再利用cv2.resize
方法将风景图片尺寸调整为与人像图片一致,便于之后进行人像迁移。
5.图像二值化处理
获取纯色背景的RGB
值,遍历整张图片,颜色接近背景颜色的像素点置为1,其余部分置为0。
同时我也想到了第二种方法,就是额外准备一张没有人像的纯色背景的图片,将原始图片与背景图片做减法并取绝对值,背景部分两张图片RGB值相似相减后趋近于0,其余部分不为0。这里注意的是由于设备原因,使用手机拍摄的背景图会因人像的离开而自动补光改变亮度,故在这里额外使用了亮度增强算法
,将转化为HSI空间的背景图I通道乘系数1.25,再转回RGB空间,实现亮度补足。相减后将近似于0的像素点置为1,其余部分置为0,实现图片二值化操作。
6.人像迁移
首先将上述二值化图片进行中值滤波处理,去除一些可能存在的噪声点(黑色区域中的白色点或白色区域中的黑色点),然后进行腐蚀操作,去毛刺儿,腐蚀边界,一定的腐蚀膨胀操作使人像更加贴合。将二值化图片中人像部分置为1,其余部分置为0,与原始图片相乘后即可得到背景为黑色,人像部分正常的图片。
将虚化后的风景图片与人像部分为0、背景部分为1的二值图相乘,即可得到人像区域置为黑色的风景图。再将该图与上一步得到的背景为黑、人像不变的图片相加,即可得到人像迁移后的图片。
四、实验结果
1.原图、空间直方图均衡化后图像
图1 原图(左)、I空间直方图均衡化后图像(右)对比图
2.美颜后的人物图像与更改后的风景图像
图2、图3美颜后的人物图像(左)与更改尺寸并虚化后的风景图像(右)
3.人像二值图
图4、图5 经过图像处理的人像二值图
4.人像迁移图
图6、图7 人像部分为黑风景图(左)与人像迁移图(右)
五、结果分析
对亮度空间进行直方图均衡化操作后,人脸部分亮度明显增强,一些特征更加清晰可辨,说明图像增强效果良好。人像图片的二值化处理,但相较于法二,法一只能够对单一纯色背景进行操作,若背景中有噪声点(如白墙上的黑色污渍等)效果就会变差。但对于本次实验而言,我们采用的是方法一,因为我们的背景完全是白色,我们便可以十分准确地得到我们想要的效果。人像迁移的过程中可能存在白边,这时使用腐蚀膨胀操作将人像收缩,可实现消除白边的操作。最后人像迁移效果良好。
六、附录代码
# @Time : 2022/10/31 16:18
# @Author : 是Dream呀
# @File : 图像增强与合成.py
import cv2
import numpy as np# 图片展示函数
def show(name, img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()# 1.自适应直方图均衡化进行图像增强
def hist(image):img = image.copy()# 先转换到 HSI 色彩空间,再将处理后的结果转换到 RGB 色彩空间。img = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)I = img[:, :, 1]clahe = cv2.createCLAHE(clipLimit=1) # 自适应直方图均衡化img[:, :, 1] = clahe.apply(img[:, :, 1]) # 将cv2.createCLAHE()应用到每个通道上。show('Equalization', np.hstack((I, img[:, :, 1])))img = cv2.cvtColor(img, cv2.COLOR_HLS2BGR)return imgIMG = cv2.imread('1.png')
IMG = cv2.resize(IMG, (422,496))
show('Original image', IMG)
IMG_new = hist(IMG) # 自适应直方图均衡化进行图像增强
show('Contrast', np.hstack((IMG, IMG_new)))
cv2.imwrite('img1.jpg', np.hstack((IMG, IMG_new)))# 2.图像美化
# 双边滤波
dst = cv2.bilateralFilter(IMG_new, 15, 35, 35)
show('Beauty', dst)
cv2.imwrite('img2.jpg', dst)# 3.利用图像处理算法处理风景图片,使风景图片变得模糊,实现背景虚化
test = cv2.imread('2.png')
test = cv2.blur(test, (9, 9)) # 使用均值滤波处理
test = cv2.resize(test, (422,496)) # 将风景图片尺寸调整为与人像图片一致
show('Falsification', test)
cv2.imwrite('img3.jpg', test)# 4.对图像进行二值化处理
img = IMG.copy()
print(len(img))
print(len(img[0]))
print(len(img[1]))
for i in range(len(img)): # 获取纯色背景的RGB值,遍历整张图片for j in range(len(img[1])):if 255 == IMG[i][j][0] and 255 == IMG[i][j][1] and 255 == IMG[i][j][2]: # 颜色接近背景颜色的像素点置为1,其余部分置为0img[i][j] = 255else:img[i][j] = 0# 5.人像迁移
# 中值滤波处理
img = cv2.medianBlur(img, 3)
# 先进行腐蚀操作,再做膨胀操作
kernel = np.ones((3, 3), np.uint8) # 腐蚀操作,去毛刺儿,腐蚀边界
img = cv2.dilate(img, kernel, iterations=1)
show('Handle', img)
cv2.imwrite('img4.jpg', img)img_t = np.where(img == 0, 1, 0) # 人像部分置为1,其余部分置为0
img = np.uint8(img_t * IMG_new) # 与原始图片相乘
show('Opposite Handle', img)
cv2.imwrite('img5.jpg', img) # 背景为黑、人像不变的图片# 像素值0和1交换 等价于img_t = np.where(img_t == 0, 1, 0)
img_t = np.where(img_t == 1, 2, img_t)
img_t = np.where(img_t == 0, 1, img_t)
img_t = np.where(img_t == 2, 0, img_t)
test = np.uint8(test * img_t) # 得到人像区域置为黑色的风景图
show('Processed landscape map',test)
cv2.imwrite('img6.jpg',test)# 相加得到迁移后的图像
test = test + img
show('Transfer', test)
cv2.imwrite('img7.jpg', test)
七、实验报告
这里是完整的实验报告–图像处理实战–Opencv实现人像迁移完整实验报告,需要的同学自行取走~
🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~
相关文章:

利用Opencv实现人像迁移
前言: Hello大家好,我是Dream。 今天来学习一下如何使用Opencv实现人像迁移,欢迎大家一起参与探讨交流~ 本文目录: 一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…...

Lnton羚通算法算力云平台在环境配置时 OpenCV 无法显示图像是什么原因?
问题: cv2.imshow 显示图像时报错,无法显示图像 0%| | 0/1 [00:00<…...

【JavaEE进阶】MyBatis的创建及使用
文章目录 一. MyBatis简介二. MyBatis 使用1. 数据库和数据表的创建2. 创建Mybatis项目2.1 添加MyBatis框架支持2.2 设置MyBatis配置信息 3. MyBatis开发流程4. MyBatis查询数据库测试 三. MyBatis 流程1. MyBatis 查询数据库流程2. MyBatis 框架交互流程图 一. MyBatis简介 M…...

职业学院物联网实训室建设方案
一、概述 1.1专业背景 物联网(Internet of Things)被称为继计算机、互联网之后世界信息产业第三次浪潮,它并非一个全新的技术领域,而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升,是随着传感网、通…...

3 个 ChatGPT 插件您需要立即下载3 ChatGPT Extensions You need to Download Immediately
在16世纪,西班牙探险家皮萨罗带领约200名西班牙士兵和37匹马进入了印加帝国。尽管印加帝国的军队数量达到了数万,其中包括5,000名精锐步兵和3,000名弓箭手,他们装备有大刀、长矛和弓箭等传统武器。但皮萨罗的军队中有100名火枪手,…...

屏蔽socket 实例化时,握手阶段报错信息WebSocket connection to ‘***‘ failed
事情起因是这样的: 我们网站是需要socket链接实行实时推送服务,有恶意竞争对手通过抓包或者断网,获取到了我们的socket链接地址,那么他就可以通过java写一个脚本无限链接这个socket地址。形成dos攻击。使socket服务器资源耗尽&…...

单发多框检测(SSD)【动手学深度学习】
单发多框检测模型主要由一个基础网络块和若干多尺度特征块串联而成。基本网络用于从输入图像中提取特征,可以使用深度卷积神经网络,原论文中选用了在分类层之前阶段的VGG,现在也常用ResNet替代。 我们可以设计基础网络,使它输出的高和宽较大,这样基于该特征图生成的锚框数…...

“RFID与光伏板的完美融合:探索能源科技的新时代!“
随着科技的不断发展,人类创造出了许多令人惊叹的发明。其中,RFID(Radio Frequency Identification)技术的应用在各个领域日益广泛。最近的研究表明,将RFID技术应用于光伏板领域,不仅可以提高光伏板的效率&a…...
算法leetcode|71. 简化路径(rust重拳出击)
文章目录 71. 简化路径:样例 1:样例 2:样例 3:样例 4:提示: 分析:题解:rust:go:c:python:java: 71. 简化路径:…...

网络技术Vlan技术STP(第一课)
一 Vlan技术的学习 对命令的增删改查 #### 1)创建vlan[SW1]vlan 2 [2-4094] 创建vlan[SW1]vlan batch 10 20 30 创建多个不连续的vlan[SW1]display vlan 查看vlan信息[SW1]vlan batch 50 to 60创建多个连续的vlan[SW1]vlan2[SW1-vlan2]description caiwu添加描述信…...

SpringBoo t+ Vue 微人事 (十一)
职位修改操作 在对话框里面做编辑的操作 添加对话框 <el-dialogtitle"修改职位":visible.sync"dialogVisible"width"30%"><div><el-tag>职位名称</el-tag><el-input size"small" class"updatePosIn…...

自动驾驶卡车量产-第一章-用户需求
1、中国干线物流行业现状 万亿级市场,规模巨大。由中重卡承运的干线运输占到整体公路货运市场的82%,全国中重卡保有量约730 万台1,市场规模达4.6 万亿元1,体量全球第一,超过同城物流及乘用出租市场规模之和。同样&…...

Nginx 配置文件的完整指南 (一)
文章目录 一、简介1.1 配置文件一览 二、全局配置2.0 user2.1 worker_processes2.2 events模块2.3 http模块 三、server模块3.1 listen3.2 server_name3.3 location:请求处理位置 Nginx 配置文件的完整指南 (二) 一、简介 Nginx是一款高性能的Web服务器和反向代理服…...
css3+js 画出爱心特效
要使用CSS3和JavaScript绘制爱心特效,可以使用CSS3的动画和过渡效果来创建爱心的形状,并使用JavaScript来控制动画的触发和交互。以下是一个简单的示例代码: HTML: <div class"heart"></div> <button onclick&quo…...

蔚来李斌卖手机:安卓系统,苹果售价,一年一发
作者 | Amy 编辑 | 德新 车圈大佬的玩法真让人寻不着套路! 苹果的库克和小米的雷布斯,甚至是FF贾老板准备许久,都想分一块新能源车的蛋糕,蔚来李斌却反手进军手机界,从宣布造手机到手机入网仅仅隔了一年。 近期&a…...
0008__浏览器层面缓存 Etag If-None-Match等详解
浏览器层面缓存 Etag & If-None-Match等详解_if-none-match:_shadow_zed的博客-CSDN博客...

Idea 快捷键整理
Idea快捷键和自动代码补全汇总 idea快捷键汇总 Ctrl 快捷键说明Ctrl F在当前文件进行文本查找 (必备)Ctrl R在当前文件进行文本替换 (必备)Ctrl Z撤销 (必备)Ctrl Y删除光标所在行 或 删除选中的行 &am…...
管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——假言——第一节 充分条件
文章目录 第一节 充分条件假言命题-那么,就,则真题(2013-29)-假言-充分假言-那么,就,则-变形推理真题(2014-44)-假言-充分假言-那么,就,则-(1)建模-“那么/就/则”-前推后真题(2018-37)-假言-充分假言-那么,就,则-(1)建模-“那么/就/则”-前推后;-(2)A→…...

LSTM模型
目录 LSTM模型 LSTM结构图 LSTM的核心思想 细胞状态 遗忘门 输入门 输出门 RNN模型 LRNN LSTM模型 什么是LSTM模型 LSTM (Long Short-Term Memory)也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比能够有效捕捉长序列之间的语义关联,缓解梯度消失或爆炸现象.同时LS…...
抢红包小程序
抢红包小程序 红包大战 # urls.pyfrom django.urls import pathfrom . import viewsurlpatterns [ path(login/, views.login, namelogin), path(create_red_packet/, views.create_red_packet, namecreate_red_packet), path(join_red_packet/<int:red_packet_id…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...