热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

传统图像处理之皮肤区域检测

本文主要分享【图像区域识别】,技术文章【传统图像处理之皮肤区域检测】为【watersink】投稿,如果你遇到图像处理相关问题,本文相关知识或能到你。图像区域识别能够从别人的角度来看待这个世界,是一

本文主要分享【图像区域识别】,技术文章【传统图像处理之皮肤区域检测】为【watersink】投稿,如果你遇到图像处理相关问题,本文相关知识或能到你。

图像区域识别

能够从别人的角度来看待这个世界,是一种极其珍贵的体验。

---- 高铭《天才在左,疯子在右》

目录

1.RGB空间

代码:

效果:

2.Ycrcb空间

代码:

 效果:

3.Ycrcb空间+otsu

代码:

效果:

4.HSV空间

代码:

效果:

5.opencv自带肤色检测类AdaptiveSkinDetector

6.基于椭圆模型

代码:

效果:

7.直方图反向投影

操作步骤:

代码:

效果: 



1. RGB空间

肤色在RGB模型下的范围基本满足以下约束:

在均匀光照下应满足以下判别式:

R>95 AND G>40 B>20 AND MAX(R,G,B)-MIN(R,G,B)>15 AND ABS(R-G)>15 AND R>G AND R>B

在侧光拍摄环境下:

R>220 AND G>210 AND B>170 AND ABS(R-G)<=15 AND R>B AND G>B

代码
def skinMask_rgb(image):
    b, g, r = cv2.split(image)
    mask_uniformity = (r>95)*(g>40)*(b>20)* (np.max(image, axis=2) -np.min(image,axis=2)>15)* (abs(r-g)>15)*(r>g)*(r>b)
    mask_side = (r>220)*(g>210)*(b>170)*(abs(r-g)<=15)*(r>b)*(g>b)
    mask = mask_uniformity|mask_side
    skin = np.array(mask, np.uint8)*255
    ratio = np.sum(skin/255)/(image.shape[0]*image.shape[1])

    return skin, ratio
效果

2 . Ycrcb 空间

在RGB空间里人脸的肤色受亮度影响相当大,所以肤色点很难从非肤色点中分离出来,也就是说在此空间经过处理后,肤色点是离散的点,中间嵌有很多非肤色。如果把RGB转为YCrCb空间的话,可以忽略Y(亮度)的影响,因为该空间受亮度影响很小,肤色会产生很好的类聚。这样就把三维的空间降为二维的CrCb,肤色点会形成一定得形状。

133≤Cr≤173

77≤Cb≤127

代码
def skinMask_YCrCb(image):
    YCrCb = cv2.cvtColor(image, cv2.COLOR_BGR2YCR_CB) #转换至YCrCb空间
    (y,cr,cb) = cv2.split(YCrCb) #拆分出Y,Cr,Cb值
    skin = np.zeros(cr.shape, dtype = np.uint8)
    (x,y) = cr.shape
    
    cr_mask1 = cr >= 133
    cr_mask2 = cr <= 173
    cr_mask = cr_mask1 * cr_mask2

    cb_mask1 = cb >= 77
    cb_mask2 = cb <= 127
    cb_mask = cb_mask1 * cb_mask2
    mask = cr_mask * cb_mask
    skin[mask] = 255

    ratio = np.sum(skin/255)/(x*y)
    return skin, ratio
  效果

3.Ycrcb 空间 + otsu

Y表示明亮度(Luminance或Luma),也就是灰阶值。Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。

将RGB图像转换到YCrCb颜色空间,提取Cr分量图像。对Cr做自二值化阈值分割处理(Otsu法)。

代码
def skinMask_YCrCb_otsu(image):
    YCrCb = cv2.cvtColor(image, cv2.COLOR_BGR2YCR_CB) #转换至YCrCb空间
    (y,cr,cb) = cv2.split(YCrCb) #拆分出Y,Cr,Cb值
    
    ret, skin = cv2.threshold(cr, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

    ratio = np.sum(skin/255)/(image.shape[0]*image.shape[1])
    return skin, ratio
效果

4 . HS V空间

7

28

50

代码
def skinMask_hsv(image):
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv)

    mask = (h>7)*(h<20)*(s>28)*(v>50)
    skin = np.array(mask, np.uint8)*255
    ratio = np.sum(skin/255)/(image.shape[0]*image.shape[1])
    return skin, ratio
效果

5.opencv自带肤色检测类AdaptiveSkinDetector

已经从opencv 3以上版本中移除,opencv 2中函数。

6.基于椭圆模型

将皮肤信息映射到YCrCb空间,则在CrCb二维空间中这些皮肤像素点近似成一个椭圆分布。因此如果我们得到了一个CrCb的椭圆,下次来一个坐标(Cr, Cb)我们只需判断它是否在椭圆内(包括边界),如果是,则可以判断其为皮肤,否则就是非皮肤像素点。

代码
def skinMask_ellipse(image):
    YCrCb = cv2.cvtColor(image, cv2.COLOR_BGR2YCR_CB) #转换至YCrCb空间
    (y,cr,cb) = cv2.split(YCrCb) #拆分出Y,Cr,Cb值

    skinCrCbHist = np.zeros((256,256),np.uint8)
    skinCrCbHist = cv2.ellipse(skinCrCbHist, (113, 155), (23, 15), 43.0, 0.0, 360.0, (255, 255, 255), -1)
    cv2.imwrite("ww.jpg", skinCrCbHist)

    skin = cv2.remap(skinCrCbHist, cb.astype(np.float32), cr.astype(np.float32), interpolation=cv2.INTER_LINEAR)
    ratio = np.sum(skin/255)/(image.shape[0]*image.shape[1])
    return skin, ratio
效果

椭圆模型

 效果

7.直方图反向投影

反向投影可以用来做图像分割,寻找感兴趣区间。可以寻找任何的roi,这里将其用作寻找人体肤色。它会输出与输入图像大小相同的图像,每一个像素值代表了输入图像上对应点属于目标对象的概率,简言之,输出图像中像素值越高的点越可能代表想要查找的目标。直方图投影经常与camshift(追踪算法)算法一起使用。

操作步骤

(1)截取若干张不同肤色的图片,最好覆盖常见的所有肤色(如下图)

(2)对所有肤色的图片一起做色彩直方图(利用OpenCV中的calcHist函数)

(3)新建一个与待检测图片同尺寸的灰度图片,找到待检测图片中每颗像素点的颜色在色彩直方图中对应栅格的数值(即统计中出现的次数),并将该数值赋值予新建灰度图片中与该检测像素同位置的像素(利用OpenCV中的calcBackProject函数)。图像中像素亮度越高,待检测图像该位置处是肤色的概率越大。

代码
def skinMask_hist_backproject(target, roi_image):
    #roi图片,就想要找的的图片
    hsv = cv2.cvtColor(roi_image,cv2.COLOR_BGR2HSV)

    #目标搜索图片
    hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)

    #计算目标直方图
    roihist = cv2.calcHist([hsv],[0,1],None,[180,256],[0,180,0,256])
    #归一化,参数为原图像和输出图像,归一化后值全部在2到255范围
    cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
    dst = cv2.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)


    #卷积连接分散的点
    disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
    dst = cv2.filter2D(dst,-1,disc)

    ret,skin = cv2.threshold(dst,50,255,0)

    ratio = np.sum(skin/255)/(target.shape[0]*target.shape[1])
return skin, ratio
效果 

本文《传统图像处理之皮肤区域检测》版权归watersink所有,引用传统图像处理之皮肤区域检测需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • plt python 画直线_机器学习干货,一步一步通过Python实现梯度下降的学习
    GradientDescent-梯度下降梯度下降法(英语:Gradientdescent)是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 本文介绍了一个Python函数same_set,用于判断两个相等长度的数组是否包含相同的元素。函数会忽略元素的顺序和重复次数,如果两个数组包含相同的元素,则返回1,否则返回0。文章还提供了函数的具体实现代码和样例输入输出。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • 前言:拿到一个案例,去分析:它该是做分类还是做回归,哪部分该做分类,哪部分该做回归,哪部分该做优化,它们的目标值分别是什么。再挑影响因素,哪些和分类有关的影响因素,哪些和回归有关的 ... [详细]
  • 基于词向量计算文本相似度1.测试数据:链接:https:pan.baidu.coms1fXJjcujAmAwTfsuTg2CbWA提取码:f4vx2.实验代码:imp ... [详细]
author-avatar
手机用户2502896257
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有