图像处理实战--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实现人像迁移完整实验报告,需要的同学自行取走~
源工程文件
关注此公众号:人生苦短我用Pythons
,回复 数字图像处理
获取源码,快点击我吧
🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~
最后,有任何问题,欢迎关注下面的公众号,获取第一时间消息、作者联系方式及每周抽奖等多重好礼! ↓↓↓
相关文章:

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

OnlyOffice验证(二)在Centos7上部署OnlyOffice编译结果
在Centos7上部署OnlyOffice编译结果 此处将尝试将OnlyOffice验证(一)DocumentServer编译验证的结果部署到Centos7上。并且使用其它服务器现有的RabbitMq和Mysql。 安装Nginx 先安装Nginx需要的依赖环境: yum install openssl* -y yum insta…...
6.补充和总结【Java面试第三季】
6.补充和总结【Java面试第三季】前言推荐6.补充和总结69_总结闲聊回顾和总结继续学习最后前言 2023-2-4 19:08:01 以下内容源自 【尚硅谷Java大厂面试题第3季,跳槽必刷题目必扫技术盲点(周阳主讲)-哔哩哔哩】 仅供学习交流使用 推荐 Jav…...

基于ssm框架大学生社团管理系统(源码+数据库+文档)
一、项目简介 本项目是一套基于ssm框架大学生社团管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,确保可…...

vulnhub靶场NAPPING: 1.0.1教程
靶场搭建靶机下载地址:Napping: 1.0.1 ~ VulnHub直接解压双击ova文件即可使用软件:靶机VirtualBox,攻击机VMware攻击机:kali信息收集arp-scan -l上帝之眼直接来看看网站可以注册账号,那就先试试。注册完后登入哦。要输…...

Docker基本介绍
最近需要将项目做成一个web应用并部署到多台服务器上,于是就简单学习了一下docker,做一下小小的记录。 1、简单介绍一下docker 我们经常遇到这样一个问题,自己写的代码在自己的电脑上运行的很流畅,在其他人电脑上就各种bug&…...

可用于标记蛋白质216699-36-4,6-ROX,SE,6-羧基-X-罗丹明琥珀酰亚胺酯
一.6-ROX,SE产品描述:6-羧基-X-罗丹明琥珀酰亚胺酯(6-ROX,SE)是一种用于寡核苷酸标记和自动DNA测序的荧光染料,可用于标记蛋白质,寡核苷酸和其他含胺分子的伯胺(-NH2)。西…...

高数:极限的定义
目录 极限的定义: 数列极限的几何意义: 由极限的定义得出的极限的两个结论: 编辑 极限的第三个结论: 例题 方法1: 编辑 方法2: 编辑 方法3: 编辑 极限的定义: 如何理…...

大数据技术之Hadoop
第1章 Hadoop概述1.1 Hadoop是什么1.2 Hadoop发展历史(了解)1.3 Hadoop三大发行版本(了解)Hadoop三大发行版本:Apache、Cloudera、Hortonworks。Apache版本最原始(最基础)的版本,对于…...
一文带你搞懂Go语言函数选项模式,Go函数一等公民。
前言 通过这篇文章《为什么说Go的函数是”一等公民“》,我们了解到了什么是“一等公民”,以及都具备哪些特性,同时对函数的基本使用也更加深入。 本文重点介绍下Go设计模式之函数选项模式,它得益于Go的函数是“一等公民”&#…...

Window.location 详细介绍
如果你需要获取网站的 URL 信息,那么 window.location 对象就是为你准备的。使用它提供的属性来获取当前页面地址的信息,或使用其方法进行某些页面的重定向或刷新。 https://www.samanthaming.com/tidbits/?filterJS#2 window.location.origin → htt…...

js侧滑显示删除按钮
效果图: <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno"><title>js侧滑显示删…...

Python - DIY - 使用dump取json某些键值对合成新的json文件
Python - Json处理前言:应用场景:基本工具:文件操作:打开文件:写文件:读文件:关闭文件并刷新缓冲区:Json字符串和字典转换:json.loads():json.dumps():Json文…...

深度剖析指针(中)——“C”
各位CSDN的uu们你们好呀,今天小雅兰的内容仍旧是深度剖析指针噢,在上一篇博客中,我已经写过了字符指针、数组指针、指针数组、数组传参和指针传参的知识点,那么这篇博客小雅兰会讲解一下函数指针、函数指针数组 、指向函数指针数组…...

论文阅读 | Video Frame Synthesis using Deep Voxel Flow
前言: 视频帧生成方法(视频插帧/视频预测)ICCV2017 oral Video Frame Synthesis using Deep Voxel Flow 引言 当下进行视频帧合成的方法分为两种,第一种是光流法,光流准确的话效果好,光流不准确的话则生…...
我所理解的生活
诞生 人真正意义上的诞生应该是社会学意义上的,是一种意识到自我、自我与社会关系的存在,只有这种诞生,才是完整人生的基点,大千世界中,唯有人类以生活作为自己的存在方式,除人类以外,从无机界…...

debian 部署nginx https
我是flask 处理请求单进程, 差点意思 , 考虑先flask 在往下走 一:安装nginx 因为我是debian 系统,所以我的建议是直接 sudo apt-get install nginx 你也可以选择在官网下载, 但是我搭建ssl 的时候安装openssl非常的麻…...

SQL 层功能改进 - lookupJoin 的优化
一、传统 join 算法lookupJoin 是 join 查询的一种,传统 join 算法为:1. 遍历 A 表,读取一条数据 r2. 遍历 B 表,对于每条数据,与 r 进行 join 操作3. 重复 1、2 操作,直到 A 表遍历完所有数据二、lookupJo…...
动态规划:鸣人的影分身
在火影忍者的世界里,令敌人捉摸不透是非常关键的。我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制造出的影分身越强。针对不同的作战情况…...

如何为三星active2手表安装自己DIY的表盘
一、步骤介绍 Step 1. 下载Galaxy watch studio; Step 2. 按照up主“隔壁张师傅2022”的文章进行安装。 二、安装流程简单说明: ① 电脑端官网下载并安装Galaxy Watch Designer或者Galaxy Watch Studio程序。 ② 关闭手表蓝牙连接,并打开调…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...