图像处理实战--Opencv实现人像迁移

news/2024/4/25 9:15:06/文章来源:https://blog.csdn.net/weixin_51390582/article/details/128978920

在这里插入图片描述

前言: 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,回复 数字图像处理获取源码,快点击我吧

🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~
在这里插入图片描述
在这里插入图片描述

最后,有任何问题,欢迎关注下面的公众号,获取第一时间消息、作者联系方式及每周抽奖等多重好礼! ↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_75393.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day21【元宇宙的实践构想07】—— 元宇宙与人工智能

💃🏼 本人简介:男 👶🏼 年龄:18 🤞 作者:那就叫我亮亮叭 📕 专栏:元宇宙 0.0 写在前面 “元宇宙”在2021年成为时髦的概念。元宇宙到底是什么?元宇…

【论文笔记】Decoupling Representation and Classifier for Long-Tailed Recognition

这一篇其实并不是提出什么新的东西,而且是做了点类似综述的技术调用实验。省流:T-normalization最好用 摘要 现状:Existing solutions usually involve class-balancing strategies, e.g. by loss re-weighting, data re-sampling, or tran…

高燃!GitHub上标星75k+超牛的Java面试突击版

前言不论是校招还是社招都避免不了各种面试。笔试,如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的,我这个有章可循‘说的意思只是说应对技术面试是可以提前准备。运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大…

扒系统CR8记录

目录 终极改造目标 过程记录 参考 为了将一套在线安装的系统,在不了解其架构、各模块细节的基础上,进行扒弄清楚,作以下记录。 终极改造目标 最终的目标,就是只通过CreMedia8_20230207.tar.gz解压 install 就把业务包安装了&…

安装VMWare虚拟机之后,发现网络贼卡,打开网页很慢

事情描述: 最近忙一个项目,需要到虚拟机中部署环境,安装完之后,就开整自己的项目了。 可以过几天,发现本地网络贼卡,打开各网页慢的一批,一开始还以为是路由器的问题,反复折腾之后排…

[12]云计算概念、技术与架构Thomas Erl-第5章 云使能技术

目录 第五章 云使能技术 5.1宽带网络和Internet架构 5.1.1Internet服务提供者(ISP) 5.1.2无连接分组(数据报网络) 5.1.3基于路由器的互联 5.1.4技术和商业考量 总结 5.2数据中心技术 5.2.1虚拟化 5.2.2标准化与模块化 …

微服务实战01-maven聚合工程

接下来的一段时间,我们将要来学习微服务,本着重实战的原则,你不需要去深究一些相关的原理,只要能跟着教程一步一步做下来,就可以快速地掌握Java微服务开发技巧。 我们学习微服务的第一步,就是要知道怎么创…

VMware安装FreeBSD虚拟机

1. 下载FreeBSD镜像地址 国内阿里云下载地址: freebsd-releases-ISO-IMAGES安装包下载_开源镜像站-阿里云 选择自己需要的版本下载。 2. 创建FreeBSD虚拟机 2.1. 选择操作系统类型 2.2. 导入FreeBSD镜像 3. 安装FreeBSD 第1步:保持默认让其自动进入…

基于vscode开发vue项目的详细步骤教程

1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 目录 五、vscode集成npm开发vue项目 1、vscode安装所需要的插件: 2、搭建一个vue小页面(入门vue) 3、大致理解…

【音视频开发】 ffmpeg解码API

1.版本迭代ffmpeg解码API经过了好几个版本的迭代,上一个版本的API是解码视频:avcodec_decode_video2解码音频:avcodec_decode_audio4我们现在能看到的很多解码例子用的都是这两个,不过现在ffmpeg更推荐用新一代的API向解码器输送数…

优秀的IC/FPGA开源项目(六)-手语字母翻译器

《优秀的IC/FPGA开源项目》是新开的系列,旨在介绍单一项目,会比《优秀的 Verilog/FPGA开源项目》内容介绍更加详细,包括但不限于综合、上板测试等。两者相辅相成,互补互充~一种智能手套,可将手语字母翻译成带显示器的书…

Studio One6最新版免费的电脑DAW宿主音乐软件

Studio One 6是一款非常专业的音乐创作编辑软件。为用户提供了所有一切你所需要创作的功能,包括所有的歌曲、项目、仪表板等动能,而且还自定义添加配置文件,良好的界面交互和丰富的功能板块。Studio One是一款DAW宿主音乐软件。用于创建&…

数字IC笔试题---千题解,量大管饱,图文并茂

前言出笔试题汇总,是为了总结秋招可能遇到的问题,做题不是目的,在做题的过程中发现自己的漏洞,巩固基础才是目的。所有题目结果和解释由笔者给出,答案主观性较强,若有错误欢迎评论区指出,资料整…

【MySQL之SQL语法篇】系统学习MySQL,从应用SQL语法到底层知识讲解,这将是你见过最完成的知识体系

文章目录一、数据管理技术的三个阶段二、SQL语句学习1. DCL数据控制语言1.1 创建用户1.2 修改用户名1.3 修改密码1.4 删除用户1.5 授权1.6 查看权限1.7 回收权限2. DDL数据定义语言2.1 操作数据库2.2 操作数据表2.3 操作数据3. DQL数据查询语言基本语法3.1 单表查询3.1.1选择表…

Qt::QOpenGLWidget 渲染天空壳

在qt窗口中嵌入opengl渲染天空壳和各种立方体一 学前知识天空壳的渲染学前小知识1 立方体贴图 天空壳的渲染就是利用立方体贴图来实现渲染流程2 基础光照 光照模型3 opengl帧缓冲 如何自定义帧缓冲实现后期特效4 glsl常见的shader内置函数 glsl编程常用的内置函数二 shader代码…

某建筑设计研究院“综合布线管理软件”应用实践

某建筑设计研究院有限公司(简称“某院”)隶属于国务院国资委直属的大型骨干科技型中央企业。“某院”前身为中央直属设计公司,创建于1952年。成立近70年来,始终秉承优良传统,致力于推进国内勘察设计产业的创新发展&…

02-MyBatis查询-

文章目录Mybatis查询1,配置文件实现CRUD1.1 环境准备Debug01: 别名mybatisx报错1.2 查询所有数据1.2.1 编写接口方法1.2.2 编写SQL语句1.2.3 编写测试方法1.2.4 起别名解决上述问题1.2.5 使用resultMap解决上述问题1.2.6 小结1.3 查询详情1.3.1 编写接口方法1.3.2 编…

专题:一看就会的C++类模板讲解 (1)

目录 一.类模板的作用 二.类模板的定义: 三.类模板的声明格式: 四.类模板对象 五.再举一个例子 一.类模板的作用 面向对象的程序设计编程实践中,我们可能会面临这样的问题:要实现比较两个数的大小。明明比较两个数的方法都一样…

JS - js中常用的深拷贝和浅拷贝理解

文章目录1,JS数据类型2,深浅拷贝概念3,浅拷贝实现4,深拷贝实现1,JS数据类型 基本数据类型: Number、Boolean、String、undefined、Null。变量是直接按值存放的,存放在栈内存中的简单数据段&am…

BAT测开8年工作总结,这些都看懂了,Linux就没问题了

一、文件目录操作 1. ls 命令 ls 命令不仅可以查看 linux 文件夹包含的文件而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。 命令格式 ls [选项][目录名] 常用参数 -l :列出长数据串,包含文件的属性与权限数据等-a &#xff…