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

news2024/11/22 19:19:45

在这里插入图片描述

前言: 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 img

IMG = 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,其余部分置为0
            img[i][j] = 255
        else:
            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.coloradmin.cn/o/378410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 实现pcm 转wav

输入音PCM 属性&#xff1a; 16k采样率 16位深 单声道 #include <iostream> #include <vector> #include <fstream> using namespace std; /* wav音频头部格式 */ typedef struct _wave_pcm_hdr { char riff[4]; // "RIFF&…

接口测试神器——Apifox从安装到使用的详细教程

目录 Apifox简介 安装 API文档导入 接口管理 接口设计 接口调试 使用脚本 Mock数据 测试管理 主题设置 总结 重点&#xff1a;配套学习资料和视频教学 Apifox简介 Apifox 的定位是Postman Swagger Mock JMeter&#xff0c;具有API文档管理、API调试、API Mock、…

2022年“网络安全”赛项山东省菏泽市选拔赛任务书

2022年“网络安全”赛项山东省菏泽市选拔赛任务书 任务书 一、竞赛时间 共计3小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一&#xff1a;Apache安全配置 任务二&#xff1a;数据分析-A 任务三&#xff1a;Windows操作系…

四信5G智慧灯杆落地厦门软件园 赋能园区实现智慧升级

2023年初&#xff0c;四信5G智慧灯杆项目落地厦门市集美软件园三期&#xff0c;实现一杆多能、多杆合一&#xff0c;为园区智慧管理和产业经济数字化高效赋能&#xff0c;打造智慧园区5G智慧灯杆项目标杆。 5G智慧灯杆赋能园区实现智慧升级 园区是城市发展的重要组成部分&#…

Xiou的个人说明

小幽&#xff08;Xiou&#xff09;的个人说明书 V1.0 小幽是谁? 周六读书吧推广大使&#xff0c;终身学习爱好者、终身阅读爱好者、硬件工程师、学习成长陪伴伙伴、大学生职业规划答疑解惑者。 拥有【结构化思维】、【执行力】、【超强学习力】、【前瞻】等核心能力。 过往…

serdes理解

serdes概念 serdes是一种TX并行转串行传输&#xff0c;RX串行转并行的接收的串并转换协议。而且在传输过程中不传输时钟信号&#xff0c;通过从数据信号中恢复时钟。serdes和PHY不是等效的概念。满足serdes协议的有很多不同种类的PHY。Serial RapidlO、FiberChannel (FC)、PCI-…

Python代码使用PyQt5制作界面并封装

目录参考链接续&#xff1a;https://blog.csdn.net/yulinxx/article/details/93344163 若要对此程序进行封装&#xff0c;加个界面&#xff0c;然后制作成 EXE&#xff0c; 使用 PyQt5 制作界面&#xff0c;PyInstaller 进行封装成 EXE 可参考&#xff1a; Python制作小软件…

RabbitMQ简介及安装

RabbitMQ简介及安装 1.RabbitMQ概述 官网&#xff1a;https://www.rabbitmq.com/ 基本介绍 RabbitMQ 是一个流行的开源消息中间件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c;为 分布式应用程序提供了可靠的、异步的消息传递机制。Rabbi…

【Nacos】@NacosValue的使用与原理

在SpringCloud工程中&#xff0c;可以使用RefreshScopeValue实现配置文件内容变更后的动态刷新。 在SpringBoot工程中&#xff0c;可以使用NacosValue来实现配置文件内容变更后的动态刷新。 NacosValue的使用 引入依赖&#xff1a; <dependency><groupId>com.a…

网页打印与导出word实现在A4纸上相同效果

在工作中遇到这样一个需求&#xff0c;客户要求&#xff1a; 1、实现在浏览器中打印和导出到word中&#xff0c;要求浏览器打印出来的效果和word中打印的效果基本一致。2、打印的内容要自动分页&#xff0c;第一页的顶部有文件头&#xff0c;最后一页的底部有页尾。 这里记录一…

GitHub 下载超过 28W 次的 Java 面试题库来袭,面面俱到太全了

“金三银四”、“金九银十” 一直被称为是跳槽的旺季&#xff0c;最近也有不少小伙伴找我咨询一些面试相关的问题。刚好小编最近获得一份收费 Java 面试题库&#xff01; 这些面试题都是互联网大厂真实流出的面试内容&#xff0c;每个问题都附带完整详细的答案&#xff0c;不像…

React(三):脚手架、组件化、生命周期、父子组件通信、插槽

React&#xff08;三&#xff09;一、脚手架安装和创建1.安装脚手架2.创建脚手架3.看看脚手架目录4.运行脚手架二、脚手架下从0开始写代码三、组件化1.类组件2.函数组件四、React的生命周期1.认识生命周期2.图解生命周期&#xff08;1&#xff09;Constructor&#xff08;2&…

SpringMvc+Spring+JPA+Hibernate实现的增删改查

SpringMvcSpringJPAHibernate实现的增删改查 基于SSJ 12.1目录图 完整项目目录 12.2创建步骤 1.选择目录 2.选择基于的包结构 3.设置坐标。不能和已有的重复。 4.创建出来的包结构 5.自己配置tomcat&#xff0c;设置构建路径 下面进行依赖坐标导入。 12.3pom依赖 可以全设置5.3…

自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第一部分

我是去年9月22日才正式学习Java的&#xff0c;因为在国营单位工作了4年&#xff0c;在天津一个月工资只有5000块&#xff0c;而且看不到任何晋升的希望&#xff0c;如果想要往上走&#xff0c;那背后就一定要有关系才行。而且国营单位的气氛是你干的多了&#xff0c;领导觉得你…

java基础之线程池

线程池1.线程池1.1 线程状态介绍1.2 线程池-基本原理1.3 线程池-Executors默认线程池1.4 线程池-Executors创建指定上限的线程池1.5 线程池-ThreadPoolExecutor1.6 线程池-参数详解1.7 线程池-非默认任务拒绝策略2. 原子性2.1 volatile-问题2.2 volatile解决2.3 synchronized解…

你真的懂动态库吗?一文详解动态库的方方面

这里写目录标题创建动态库创建静态库动态库与静态库的区别动态链接与静态链接的区别动态库的加载过程dll的创建以及应用程序隐式链接到dll的过程dll的创建以及应用程序显示链接到dll的过程动态库的二进制兼容性创建动态库 1.【新建】-》【项目】-》【动态链接库】 新建的动态…

Elasticsearch入门之Http操作(高级查询)

Elasticsearch 基本操作 Http操作&#xff1a; 高级查询&#xff1a; 高级查询&#xff1a;Elasticsearch 提供了基于 JSON 提供完整的查询 DSL 来定义查询 初始化数据&#xff1a; 查询所有文档&#xff1a; 在 Postman 中&#xff0c;向 ES 服务器发 GET 请求 &#xff1a…

docker的逃逸复现(CVE-2020-15257-host模式容器逃逸漏洞)

host模式下的docker逃逸的概述因为docker所使用的是隔离技术&#xff0c;就导致了容器内的进程无法看到外面的进程&#xff0c;但外面的进程可以看到里面&#xff0c;所以如果一个 Docker 容器内部可以操作该容器的外部资源&#xff0c;一般理解为操作宿主机的行为。叫做docker…

【组织架构】中国铁路太原局集团有限公司

1 公司简介 中国铁路太原局集团有限公司&#xff0c;是中国国家铁路集团有限公司管理的18个铁路局集团有限公司之一&#xff0c;简称“太局”。成立于2005年3月18日&#xff0c;共有职工11.5万人。 管辖南同蒲铁路、北同蒲铁路、大秦铁路、侯月铁路、石太铁路、侯西&#xff08…

Confluence 安装

Confluence 安装 一、购买一台服务器 推荐使用 Ubuntu 版本服务器。 二、安装宝塔面板 官方安装地址 安装地址 Centos 安装脚本 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec…