我们可以看一下下面一张图片

可以看到有很多斑点,女生都想让图片的皮肤好看一点,那我们可以做什么操作呢?
1.PS磨皮
2.图像处理磨皮

我们可以想象一下,我们对图像磨皮是怎么做的?最简单的我们对整张图片进行一个卷积操作

import cv2
import matplotlib.pyplot as plt//函数是,opencv使用的是BGR格式,屏幕显示的是RGB,显示到屏幕需要进行转换
def t2s(img):return cv2.cvtColor(img,cv2.COLOR_BGR2RGB)img = cv2.imread("girlpng")import numpy as np
//制作一个归一化的3*3卷积核
kernel = np.ones((3,3),np.float32)
kernel = kernel/9.
print(kernel)
print(img.shape)
//使用cv2对图片进行卷积
result = cv2.filter2D(img,-1,kernel)
plt.figure(figsize=(20,20))
//显示处理后的图片并排和原图片显示
plt.imshow(t2s(cv2.hconcat([img,result])))
plt.show()


可以看到斑点不是很淡了一点,我们可以进一步采用更大的卷积核来做处理。

kernel_size=17
kernel = np.ones((kernel_size,kernel_size),np.float32)/(kernel_size*kernel_size)
img1 = cv2.filter2D(img,-1,kernel)
result = cv2.filter2D(img1,-1,kernel)
plt.figure(figsize=(20,20))
plt.imshow(t2s(cv2.hconcat([img,result])))
plt.show()


这样做磨皮更加明显了,但是也同时会对整张图片有一定精度会有损失。
那有没办法只对皮肤进行磨皮呢?
我们需要先对皮肤区分出来,而我们人眼对HSV格式的参数更加敏感,通过HSV参数可以判断出人皮肤的色值区域,从而隔离出人脸皮肤的位置。

result_show=result.copy()
# 肤色检测
# 来源 https://www.cnblogs.com/demodashi/p/9437559.html
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 把图像转换到HSV色域
(_h, _s, _v) = cv2.split(hsv) # 图像分割, 分别获取h, s, v 通道分量图像
skin3 = np.zeros(_h.shape, dtype=np.float32)  # 根据源图像的大小创建一个全0的矩阵,用于保存图像数据(height,width) = _h.shape # 获取源图像数据的长和宽# 遍历图像, 判断HSV通道的数值, 如果在指定范围中, 则置把新图像的点设为255,否则设为0
for i in  range(0, height):for j in  range(0, width)://这是黄种人皮肤色域if (_h[i][j] >  5) and (_h[i][j] <  120) and (_s[i][j] >  18) and (_s[i][j] <  255) and (_v[i][j] >  50) and (_v[i][j] <  255):skin3[i][j] =  1.0else:skin3[i][j] =  0.0result_show[i][j]=img[i][j]
plt.figure(figsize=(20,20))
plt.imshow(t2s(cv2.hconcat([img,result_show,result])))
plt.show()


中间的是皮肤磨皮以及皮肤外区域不处理叠加的图
skin矩阵记录的是人脸色值检测的图,我们可以看到白色的区域为人脸区域

plt.figure(figsize=(10,10))
plt.imshow(t2s(skin3))
plt.show()


关于皮肤识别可以看皮肤区域检测
里面有基于HSV和RGB色值检测,以及opencv提供的适应器

以上使用灰度图来查看人面皮肤区域(白人和黑人的皮肤范围呢?)
这里可以采用中值滤波等各种滤波方式来处理图像
python各种常见滤波实现
参考了其他方案,有人使用了双边滤波的方案进行滤波

result_bila = cv2.bilateralFilter(img,25,83,83)
plt.figure(figsize=(20,20))
plt.imshow(t2s(cv2.hconcat([img,result_show,result_bila,result])))
plt.show()


使用双边滤波并替换人脸区域的方案,可以看出一些细致的细节还是被卷积掉了。

result_fb = result_bila.copy()
# 遍历图像, 判断HSV通道的数值, 如果在指定范围中, 则置把新图像的点设为255,否则设为0
for i in  range(0, height):for j in  range(0, width):if (_h[i][j] >  5) and (_h[i][j] <  120) and (_s[i][j] >  18) and (_s[i][j] <  255) and (_v[i][j] >  50) and (_v[i][j] <  255):1.0else:result_fb[i][j]=img[i][j]
plt.figure(figsize=(20,20))
plt.imshow(t2s(cv2.hconcat([img,result_show,result_fb,result_bila,result])))
plt.show()


第三张是使用人脸区域替换加双边滤波的图像,对比第四张,很明显眼神会更加发亮。
下面有一种经验使用的opencv使用的磨平算法,可以参照磨皮检测和算法

import numpy as np
#Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;
def filter_gaussian(img, v1, v2):dst = np.zeros_like(img)dx = v1*5fc = v1*12.5p = 0.1#双边滤波temp1 = cv2.bilateralFilter(img,dx,fc,fc)#图像矩阵相减,得到人脸轮廓temp2 = cv2.subtract(temp1,img)temp2 = cv2.add(temp2,(10,10,10,128))#高斯模糊temp3 = cv2.GaussianBlur(temp2,(2*v2-1,2*v2-1),0)#原图叠加temp4 = cv2.add(img,temp3)#按权重混合dst1 = cv2.addWeighted(img,p,temp4,1-p,0.0)dst = cv2.add(dst1,(10,10,10,255))plt.figure(figsize=(20,20))plt.imshow(t2s(cv2.hconcat([img,dst,result_fb])))
#     plt.imshow(t2s(cv2.hconcat([img,temp1,temp2,temp3,temp4,dst1,dst])))plt.show()return dst
dst = filter_gaussian(img,7,4)

中间是算法的效果图

[Opencv基础]人脸磨皮相关推荐

  1. 【零基础跑项目】20代码教你基于opencv的人脸检测

    20代码教你基于opencv的人脸检测

  2. 基于 OpenCV 的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  3. opencv 训练人脸对比_【项目案例python与人脸识别】基于OpenCV开源计算机视觉库的人脸识别之python实现...

    " 本项目是一个基于OpenCV开源库使用python语言程序实现人脸检测的项目,该项目将从[项目基础知识](即人脸识别的基本原理).[项目实践](人脸识别所需要的具体步骤及其python程 ...

  4. 【计算机视觉】基于OpenCV的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  5. python视频图片识别算法_python利用Opencv进行人脸识别(视频流+图片)

    首先:需要在在自己本地安装opencv具体步骤可以问度娘 如果从事于开发中的话建议用第三方的人脸识别(推荐阿里) 1.视频流中进行人脸识别 # -*- coding: utf-8 -*- import ...

  6. OpenCV基础入门【C++及python语言】

    OpenCV基础入门[C++语言] OpenCV-Python 中文教程 OpenCV官方教程中文版(For Python) OpenCV2-Python-Tutorials 部分文件参考: http ...

  7. OpenCV基础(基于Opencv4.4+VS2019)

    OpenCV基础(基于Opencv4.4+VS2019) 1.OpenCV介绍 OpenCV是计算机视觉开源库,主要算法涉及图像处理和机器学习相关方法. 是Intel公司贡献出来的,俄罗斯工程师贡献大 ...

  8. opencv + face_recognition —— 人脸识别案例

    文章目录 opencv + face_recognition -- 人脸识别案例 0. 版本信息 1. 导包 2. 识别图片中的面部 3. 实现摄像头中的面部追踪 4. 人脸追踪+识别,分析出不同的人 ...

  9. 基于OpenCV的人脸识别自助商店(源码&部署视频)

    1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...

最新文章

  1. 网页制作遵循四大原则让网站建设更加优质
  2. python爬虫如何从一个页面进入另一个页面-Python爬虫 (一):爬取一个简单的静态网页...
  3. c语言常量的正确表示const,C语言中的const和free用法详解
  4. vue中config/index.js:配置的详细理解
  5. js对象数组中的某属性值 拼接成字符串
  6. 去掉前后空格_mysql批量去掉某个字段字符中的空格
  7. python受欢迎的原因是什么?
  8. 【原创】RPM安装软件时解决依赖性问题(自动解决依赖型)
  9. 王道机试指南读后总结-3
  10. 【CCCC】L2-029 特立独行的幸福 (25分),模拟题,set用法
  11. 是否允许此网站打开你计算机上的程序
  12. LVS调度算法权威讲解——官方文档翻译
  13. 基于大数据技术的全国高速公路通行数据 动态监测平台建设
  14. NTT科学家武居博士:用光去开拓和改变世界
  15. 反客为主?00 后大学生 “反向背调” 雇主,Z 世代要重塑职场
  16. bootstrap 垂直居中 布局_Bootstrap 4 栅格系统垂直布局
  17. windows下强大的系统监视工具Procmon(Process Monitor)
  18. 购物车js代码_JS实现购物车商品列表结算功能代码
  19. 比KEEP更好,运动健身、塑形瘦身的小程序新选择
  20. 国家计算机报名730,730分学霸杨晨煜被清华智班录取!学习的专业是......

热门文章

  1. PHP7常用新特性介绍
  2. 3.1、立项管理内容
  3. Python爬虫:抓取手机APP的数据
  4. Java程序设计基础——简单Java程序
  5. 计算机二级word真题书娟,计算机二级word试题.docx
  6. 与或非逻辑运算符用法详解
  7. sshpass报错Host key verification failed
  8. MongoDB芒果数据库学习笔记一
  9. 初识Mongdb之数据查询篇(二)
  10. 深度学习的常见模型CNN