点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:机器算法那些事

概述

本文中的人体肤色检测功能采用 OpenCV 库实现。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上. 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

本文主要使用了OpenCV的图像色域转换, 颜色通道分割, 高斯滤波, OSTU自动阈值等功能.

参考资料

OpenCV探索之路:皮肤检测技术

学习OpenCV—肤色检测

准备工作

安装 Python-OpenCV 库
pip install opencv-python -i https://mirrors.ustc.edu.cn/pypi/web/simple

利用 -i 为pip指令镜像源, 这里使用电子科技大学的源, 速度比官方源更快.

安装 Numpy 科学计算库
pip install numpy -i https://mirrors.ustc.edu.cn/pypi/web/simple

图像的基本操作

import numpy as npimport cv2imname =  "6358772.jpg"# 读入图像'''使用函数 cv2.imread() 读入图像。这幅图像应该在此程序的工作路径,或者给函数提供完整路径.警告:就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命令print(img)时得到的结果是None。'''img = cv2.imread(imname, cv2.IMREAD_COLOR)'''imread函数的第一个参数是要打开的图像的名称(带路径)第二个参数是告诉函数应该如何读取这幅图片. 其中    cv2.IMREAD_COLOR 表示读入一副彩色图像, alpha 通道被忽略, 默认值    cv2.IMREAD_ANYCOLOR 表示读入一副彩色图像    cv2.IMREAD_GRAYSCALE 表示读入一副灰度图像    cv2.IMREAD_UNCHANGED 表示读入一幅图像,并且包括图像的 alpha 通道'''# 显示图像'''使用函数 cv2.imshow() 显示图像。窗口会自动调整为图像大小。第一个参数是窗口的名字,其次才是我们的图像。你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字.'''cv2.imshow("image", img) # "image" 参数为图像显示窗口的标题, img是待显示的图像数据cv2.waitKey(0) #等待键盘输入,参数表示等待时间,单位毫秒.0表示无限期等待cv2.destroyAllWindows() # 销毁所有cv创建的窗口# 也可以销毁指定窗口:#cv2.destroyWindow("image") # 删除窗口标题为"image"的窗口# 保存图像'''使用函数 cv2.imwrite() 来保存一个图像。首先需要一个文件名,之后才是你要保存的图像。保存的图片的格式由后缀名决定.'''#cv2.imwrite(imname + "01.png", img) cv2.imwrite(imname + "01.jpg", img)
运行截图

皮肤检测算法

基于YCrCb颜色空间的Cr分量+Otsu法阈值分割算法

YCrCb 即 YUV ,其中 Y 表示明亮度 Luminance 或 Luma , 也就是灰阶值. 而 U 和 V 表示的则是色度 Chrominance 或 Chroma ,作用是描述影像色彩及饱和度, 用于指定像素的颜色. 亮度 是透过RGB输入信号来建立的, 方法是将RGB信号的特定部分叠加到一起. 色度 则定义了颜色的两个方面─色调与饱和度,分别用 Cr 和 Cb 来表示. 其中, Cr 反映了RGB输入信号红色部分与RGB信号亮度值之间的差异. 而 Cb 反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异.

该方法的原理也很简单:

  • 将RGB图像转换到 YCrCb 颜色空间,提取 Cr 分量图像

  • 对 Cr 分量进行高斯滤波

  • 对Cr做自二值化阈值分割处理 OSTU 法

关于高斯滤波

使用低通滤波器可以达到图像模糊的目的。这对与去除噪音很有帮助。其实就是去除图像中的高频成分(比如:噪音,边界)。所以边界也会被模糊一点。(当然,也有一些模糊技术不会模糊掉边界)。OpenCV 提供了四种模糊技术。高斯滤波就是其中一种。实现的函数是 cv2.GaussianBlur()。我们需要指定高斯滤波器的宽和高(必须是奇数)。以及高斯函数沿 X,Y 方向的标准差。如果我们只指定了 X 方向的的标准差,Y 方向也会取相同值。如果两个标准差都是 0,那么函数会根据核函数的大小自己计算。高斯滤波可以有效的从图像中去除高斯噪音。如果你愿意的话,你也可以使用函数 cv2.getGaussianKernel() 自己构建一个高斯滤波器。

# 肤色检测之一: YCrCb之Cr分量 + OTSU二值化img = cv2.imread(imname, cv2.IMREAD_COLOR)ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把图像转换到YUV色域(y, cr, cb) = cv2.split(ycrcb) # 图像分割, 分别获取y, cr, br通道图像# 高斯滤波, cr 是待滤波的源图像数据, (5,5)是值窗口大小, 0 是指根据窗口大小来计算高斯函数标准差cr1 = cv2.GaussianBlur(cr, (5, 5), 0) # 对cr通道分量进行高斯滤波# 根据OTSU算法求图像阈值, 对图像进行二值化_, skin1 = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) cv2.imshow("image CR", cr1)cv2.imshow("Skin Cr+OSTU", skin1 )
检测效果

基于YCrCb颜色空间Cr, Cb范围筛选法

这个方法跟法一其实大同小异,只是颜色空间不同而已。据资料显示,正常黄种人的Cr分量大约在140至175之间,Cb分量大约在100至120之间。大家可以根据自己项目需求放大或缩小这两个分量的范围,会有不同的效果。

# 肤色检测之二: YCrCb中 140<=Cr<=175 100<=Cb<=120img = cv2.imread(imname, cv2.IMREAD_COLOR)ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把图像转换到YUV色域(y, cr, cb) = cv2.split(ycrcb) # 图像分割, 分别获取y, cr, br通道分量图像
skin2 = np.zeros(cr.shape, dtype=np.uint8) # 根据源图像的大小创建一个全0的矩阵,用于保存图像数据(x, y) = cr.shape # 获取源图像数据的长和宽
# 遍历图像, 判断Cr和Br通道的数值, 如果在指定范围中, 则置把新图像的点设为255,否则设为0for i in  range(0, x): for j in  range(0, y):if (cr[i][j] >  140) and (cr[i][j] <  175) and (cb[i][j] >  100) and (cb[i][j] <  120):            skin2[i][j] =  255else:            skin2[i][j] =  0
cv2.imshow(imname, img)cv2.imshow(imname +  " Skin2 Cr+Cb", skin2)

检测效果

基于HSV颜色空间H,S,V范围筛选法

这个方法跟上一方法类似,只是颜色空间不同而已。据资料显示,正常黄种人的H分量大约在7至20之间,S分量大约在28至256之间,V分量大约在50至256之间。大家可以根据自己项目需求放大或缩小这两个分量的范围,会有不同的效果。

# 肤色检测之三: HSV中 7<H<20 28<S<256 50<V<256img = cv2.imread(imname, cv2.IMREAD_COLOR) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 把图像转换到HSV色域(_h, _s, _v) = cv2.split(hsv) # 图像分割, 分别获取h, s, v 通道分量图像skin3 = np.zeros(_h.shape, dtype=np.uint8)  # 根据源图像的大小创建一个全0的矩阵,用于保存图像数据(x, y) = _h.shape # 获取源图像数据的长和宽
# 遍历图像, 判断HSV通道的数值, 如果在指定范围中, 则置把新图像的点设为255,否则设为0for i in  range(0, x):for j in  range(0, y):if (_h[i][j] >  7) and (_h[i][j] <  20) and (_s[i][j] >  28) and (_s[i][j] <  255) and (_v[i][j] >  50) and (_v[i][j] <  255):            skin3[i][j] =  255else:            skin3[i][j] =  0
cv2.imshow(imname, img)cv2.imshow(imname +  " Skin3 HSV", skin3)

检测效果

三种检测算法效果对比

项目内文件截图


Python人体肤色检测

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

利用Python 代码实现人体肤色检测相关推荐

  1. 100 行 Python 代码实现人体肤色检测

    作者: WHJWNAVY http://www.demodashi.com/demo/12967.html 概述 本文中的人体肤色 检测功能采用 OpenCV 库实现.OpenCV是一个基于BSD许可 ...

  2. Python人体肤色检测

    代码地址如下: http://www.demodashi.com/demo/12967.html Python人体肤色检测 概述 本文中的人体肤色检测功能采用 OpenCV 库实现, OpenCV是一 ...

  3. python 人体检测_Python人体肤色检测

    Python人体肤色检测 概述 本文中的人体肤色检测功能采用 OpenCV 库实现, OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Andro ...

  4. 人体肤色检测:100 行 Python 实现

    点击上方"机器学习与生成对抗网络",关注星标 获取有趣.好玩的前沿干货! 作者:WHJWNAVY http://www.demodashi.com/demo/12967.html ...

  5. python颜色识别_Python人体肤色检测

    Python人体肤色检测 概述 本文中的人体肤色检测功能采用 OpenCV 库实现, OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Andro ...

  6. python图色检测_利用python打开摄像头及颜色检测方法

    最近两周由于忙于个人项目,一直未发言了,实在是太荒凉了....,上周由于项目,见到Python的应用极为广泛,用起来也特别顺手,于是小编也开始着手学习Python,-下面我就汇报下今天的学习成果吧 小 ...

  7. python爬虫背景_利用Python代码实现一键抠背景功能

    前言 又是一个逛csdn发现的一个有趣的小项目,可以一键抠背景,需要用到removebg模块及其API,API可从其官网免费获取,网址如下https://www.remove.bg/zh ps:加上/ ...

  8. python实现背景抠除_利用Python代码实现一键抠背景功能

    这篇文章主要给大家介绍了关于如何利用Python代码实现一键抠背景的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前 ...

  9. python计算器程序_利用Python代码编写计算器小程序

    1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 def __init__(self):8 #创建主界面 9 ...

最新文章

  1. Thread Per Message Pattern
  2. POJ 1679 - The Unique MST(次小生成树)
  3. HTML+CSS+JS实现 ❤️圆圈倒计时间❤️
  4. PostgreSQL 优化器案例之 - order by limit 索引选择问题
  5. 用php判断大月小月,php 获取月第一天和最后一天 | 学步园
  6. 联想r720内存频率_锐龙H真给劲儿 联想拯救者R7000 2020首测
  7. Postgres invalid command \N数据恢复处理
  8. 器件旋转45度_【速评3+1】第十一期:朱雨玲45,日版CL,Rakza Z,国变等
  9. 【Spark篇】---SparkStreaming算子操作transform和updateStateByKey
  10. iOS开发之Undefined symbols for architecture x86_64报错
  11. js 线性最小二乘回归线方程
  12. 计算机里被删除的文件可以在哪里进行恢复,电脑怎么找回删除的文件?找回删除文件的方法...
  13. 倒计时3天!这届XIN公益大会很不一般!
  14. C++开源库列表总结记录
  15. Python学习,接上篇文章的50道基础入门练习题(附答案)
  16. 家乡の战队实训项目博客二
  17. 使用post上传文件报500错误
  18. eis电子防抖好还是光学防抖好_EIS和OIS有啥差别?一文搞懂手机防抖的那些事儿...
  19. 街霸 隆(Ryu)升龙拳(Syoryuken)动画(四)制作过程中几个版本动画比较一下
  20. 电影票务大排行:猫眼第一,淘票票、格瓦拉分列二、三位!

热门文章

  1. python前端基础知识总结 及部分练习题
  2. 触动心灵的十句诗,不看悔死你
  3. crossover安装oracle,linux通过CrossOver安装最新版本TIM
  4. 山东十大计算机排名2015,2015山东省大学专业排名
  5. 关注时事与新闻的意义
  6. Failed to start firewalld.service: Unit is masked
  7. JavaScript练习编程题2
  8. BGP属性:MED、 METRIC属性
  9. MySQL半同步复制配置
  10. Pro/E 各种曲线方程集合