0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

100行Python实现人体肤色检测

新机器视觉 来源:demodashi.com 2023-05-06 10:46 次阅读

概述

本文中的人体肤色检测功能采用 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 np
import cv2
imname =  "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<=120
img = 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,否则设为0
for 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] =  255
else:
            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  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] =  255
else:
            skin3[i][j] =  0


cv2.imshow(imname, img)
cv2.imshow(imname +  " Skin3 HSV", skin3)

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3851

    浏览量

    125642
  • 开源
    +关注

    关注

    3

    文章

    2989

    浏览量

    41721
  • 肤色检测
    +关注

    关注

    0

    文章

    3

    浏览量

    6016
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40786
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83473

原文标题:人体肤色检测:100 行 Python 实现

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于matlab的人脸检测K-L的人脸识别(肤色分割和特征提取)

    基于matlab的人脸检测K-L的人脸识别(肤色分割和特征提取)[hide] [/hide]《labview人脸识别》课程链接:http://url.elecfans.com/u/bc0e010da8
    发表于 02-22 16:45

    基于FPGA的肤色识别算法实现

    `大家好,给大家介绍一下,这是基于FPGA的肤色识别算法实现。我们今天这篇文章有两个内容一是实现基于FPGA的彩色图片转灰度实现,然后在这个基础上
    发表于 10-28 08:48

    基于STM32的人体检测系统设计

    STM32人体检测(体温、心率、心跳、跌倒检测)+zigbee笔者前言在闲鱼有缘结识的一个哥们,帮助做的基于STM32人体检测系统,我负责硬件程序开发设计,哥们负责客户端服务器微信程序的实现
    发表于 08-04 06:21

    如何去实现一种基于物联网感知的家居人体健康状况检测系统设计

    为什么要设计一种基于物联网感知的家居人体健康状况检测系统?如何去实现一种基于物联网感知的家居人体健康状况检测系统设计?
    发表于 10-20 06:23

    基于肤色模型和区域特征的人脸检测方法

    精度和速度是人脸检测系统的两个衡量标准。针对传统人脸检测方法两者不能兼优的问题,该文提出一种结合颜色空间和特征区域的人脸检测方法。该方法采用肤色模型提取
    发表于 04-15 08:55 25次下载

    基于肤色模型的人耳检测系统

    人耳检测是人耳识别以及基于内容的图像和视频检索的一项重要任务。本文提出了一种将背景差分和肤色模型相结合的人耳检测算法。算法首先在序列图像中自动提取运动目标并
    发表于 07-10 14:01 10次下载

    基于肤色的复杂背景条件下的人脸检测

    提出一种肤色与Adaboost 方法相结合的人脸检测方法。首先把图像转换为YCbCr 颜色空间,然后利用肤色在CbCr 上的聚类性对图像进行预处理,最后,使用Adaboost 算法对候选人脸集进行细
    发表于 08-13 10:17 15次下载

    一种使用邻接信息的自适应肤色检测方法

    本文提出了一种使用邻接信息的自适应肤色检测方法。先在HSV 空间对图像使用SPDH 方法以寻找最优的肤色阈值并以此对进行初步肤色分割;然后再通过使用邻接信息的空间扩散法对
    发表于 08-15 11:41 8次下载

    基于肤色模型的人脸检测研究

    本文对基于肤色分割结合模板匹配的人脸检测方法进行了改进,提出基于“光照预处理+肤色模型+模板匹配”的人脸检测解决思路,即在光照预处理的前提下
    发表于 04-02 11:09 3616次阅读
    基于<b class='flag-5'>肤色</b>模型的人脸<b class='flag-5'>检测</b>研究

    基于肤色的实时人脸检测算法研究

    研究了一种基于肤色的人脸检测算法的设计与实现过程。在YIQ颜色空间中,进行了有效的肤色提取,把提取到的肤色与背景图像信息转为二值图像进行形态
    发表于 05-05 16:54 25次下载
    基于<b class='flag-5'>肤色</b>的实时人脸<b class='flag-5'>检测</b>算法研究

    基于肤色检测和人眼定位的人脸检测方法

    提出了一种基于肤色检测和人眼定位的人脸检测方法。使用基于“基准白色”的色彩平衡方法归一化彩色图像,将图像在HSV 空间进行肤色分割,确定候选人脸,采用形态学滤波器对其降
    发表于 10-08 09:21 3598次阅读
    基于<b class='flag-5'>肤色</b><b class='flag-5'>检测</b>和人眼定位的人脸<b class='flag-5'>检测</b>方法

    基于ASM和肤色模型的疲劳驾驶检测方法

    疲劳驾驶研究中,面部关键特征精确定位与跟踪是个难点。提出了一种基于主动形状模型ASM和肤色模型的疲劳驾驶检测方法。首先,利用肤色模型检测到人脸区域为ASM提供初始定位;然后基于ASM进
    发表于 11-28 11:31 2次下载
    基于ASM和<b class='flag-5'>肤色</b>模型的疲劳驾驶<b class='flag-5'>检测</b>方法

    基于比例特征的网络不良图像过滤算法研究

    目前对网络不良图像进行过滤的方法中,裸露肤色比依然是常被利用的数据,但是其存在一些缺陷,如伪肤色的干扰、非关键区域肤色的干扰、整体裸露肤色比有时候不与裸露程度呈正相关等。本算法利用
    发表于 12-04 10:28 0次下载
    基于比例特征的网络不良图像过滤算法研究

    传音拍照专利解决人体肤色差异

    传音的该项专利针对目前全球各地区人种肤色的差异,以满足不同肤色用户的拍摄以及成像审美需求,并针对不同肤色的用户拍摄效果智能匹配美化算法,以获得最优的美化效果。
    的头像 发表于 12-31 11:27 3379次阅读
    传音拍照专利解决<b class='flag-5'>人体肤色</b>差异

    zynq-7000的肤色识别实现案例解析

    1 背景知识 在肤色识别算法中,常用的颜色空间为Ycbcr,Y代表亮度,cb代表蓝色分量,cr代表红色分量。 由于肤色在YCbCr 空间受亮度信息的影响较小,本算法直接考虑 YCbCr 空间
    的头像 发表于 12-29 12:22 1473次阅读
    zynq-7000的<b class='flag-5'>肤色</b>识别<b class='flag-5'>实现</b>案例解析