首页 > 编程语言 >Python从0到100(七十):Python OpenCV-Opencv实现人像迁移

Python从0到100(七十):Python OpenCV-Opencv实现人像迁移

时间:2024-11-08 14:15:37浏览次数:3  
标签:人像 IMG img OpenCV Python 均衡化 cv2 Opencv test

在这里插入图片描述

前言: 零基础学Python:Python从0到100最新最全教程 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!

一、实验要求

利用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实现人像迁移完整实验报告,需要的同学自行取走~

标签:人像,IMG,img,OpenCV,Python,均衡化,cv2,Opencv,test
From: https://blog.csdn.net/weixin_51390582/article/details/143029335

相关文章

  • python3.5-IDLE中斐波那契数列程序实现
    斐波那契数列F(n)定义:F(0)=0,F(1)=1,……,F(n)=F(n-2)+F(n-1),其中n≥2(简单总结,从第3个数起,斐波那契数列中每个数都是前两个数之和)代码实现:1)采用迭代方式实现:deffibonacci_iterative(n):ifn<=0:return0elifn==1:return1......
  • Python数据分析NumPy和pandas(二十六、数据整理--连接、合并和重塑 之三:重塑和透视)
    对表格数据的重新排列操作,称为reshape或pivot。有很多种方法对表格数据进行重塑。一、使用分层索引进行reshape分层索引提供了一种在DataFrame中重新排列数据的方法。主要有两个函数方法:stack:将数据中的列旋转或透视到行。unstack:从行转为列。还是用代码示例来学习......
  • 洛谷P1157 组合的输出(Python)
    伤痕,是男子汉的勋章。——圣斗士星矢一、题目P1157组合的输出https://www.luogu.com.cn/problem/P1157二、代码defpri(L):foriinrange(len(L)):ifL[i]==True:print("{:3d}".format(i),end='')defdfs(n,r,cur,count):#n,r为题......
  • python球探数据分析
    Python球探数据分析入门指南作为一名刚入行的小白,你可能会对如何使用Python进行球探数据分析感到困惑。不用担心,这篇文章将为你提供一份详细的入门指南,帮助你逐步掌握这项技能。流程概览首先,让我们通过一个表格来了解整个数据分析的流程:步骤描述1获取数据2数据......
  • 最新毕设-SpringBoot-求职推荐系统-55000(免费领项目)可做计算机毕业设计JAVA、PHP、爬
    摘 要当前社会竞争激烈,求职市场信息众多,但信息不对称、筛选困难的问题依然存在。因此,设计开发一款求职推荐系统是顺应时代发展的必然选择。该求职推荐系统利用Java编程语言,使用springboot技术框架,采取MySQL数据库实现系统的各项功能,具有便捷高效、安全友好的特点,促进求职招聘......
  • python中多线程和多进程的应用
    选择指南总结I/O密集型任务:使用多线程(ThreadPoolExecutor)。例如,爬虫抓取数据、从数据库或API获取信息、读取/写入文件等。计算密集型任务:使用多进程(multiprocessing.Pool)。例如,进行大量数据计算、数值分析等。混合型任务:可以结合多线程和多进程。例如,先用线程处理I/O......
  • 毕业设计:python股票推荐系统 数据分析可视化 协同过滤推荐算法 Django框架(源码+论文)✅
    毕业设计:python股票推荐系统数据分析可视化协同过滤推荐算法Django框架(源码+论文)✅1、项目介绍技术栈:python、django框架、requests、BeautifulSoup、协同过滤算法、Echarts可视化、HTML登录注册界面:用户可以注册新账号并登录系统。个人信息修改:用户可以修改个人信......
  • 计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO......
  • 计算机毕业设计Python+图神经网络手机推荐系统 手机价格预测 手机可视化 手机数据分析
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO......
  • (附项目源码)python开发语言,基于python Web的高校毕业论文管理系统 51,计算机毕设程序开
    摘 要随着信息化技术的迅速发展,人类信息化文明的到来,为人类的日常生活以及日常生产活动提供了非常大的便利,有效地解决了很多曾经无法解决的问题。本次基于pythonWeb的高校毕业论文管理系统的开发是针对我国传统的高校毕业论文管理模式沟通成本高且容易造成管理混乱、导师......