我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python传统图像处理皮肤区域检测的方法有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python传统图像处理皮肤区域检测的方法有哪些

这篇文章主要介绍“Python传统图像处理皮肤区域检测的方法有哪些”,在日常操作中,相信很多人在Python传统图像处理皮肤区域检测的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python传统图像处理皮肤区域检测的方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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

效果:

Python传统图像处理皮肤区域检测的方法有哪些Python传统图像处理皮肤区域检测的方法有哪些

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

效果:

Python传统图像处理皮肤区域检测的方法有哪些

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

效果:

Python传统图像处理皮肤区域检测的方法有哪些

4.HSV空间

7<H<20

28<S<256

50<V<256

代码:

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

效果:

Python传统图像处理皮肤区域检测的方法有哪些

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

效果:

椭圆模型

Python传统图像处理皮肤区域检测的方法有哪些

效果

Python传统图像处理皮肤区域检测的方法有哪些

7.直方图反向投影

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

操作步骤:

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

Python传统图像处理皮肤区域检测的方法有哪些

(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

效果: 

 Python传统图像处理皮肤区域检测的方法有哪些

到此,关于“Python传统图像处理皮肤区域检测的方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python传统图像处理皮肤区域检测的方法有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python传统图像处理皮肤区域检测的方法有哪些

这篇文章主要介绍“Python传统图像处理皮肤区域检测的方法有哪些”,在日常操作中,相信很多人在Python传统图像处理皮肤区域检测的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python传统图
2023-06-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录