python opencv肤色检测的实现示例


Posted in Python onDecember 21, 2020

1 椭圆肤色检测模型

原理:将RGB图像转换到YCRCB空间,肤色像素点会聚集到一个椭圆区域。先定义一个椭圆模型,然后将每个RGB像素点转换到YCRCB空间比对是否再椭圆区域,是的话判断为皮肤。

YCRCB颜色空间

python opencv肤色检测的实现示例python opencv肤色检测的实现示例

椭圆模型

python opencv肤色检测的实现示例

代码

def ellipse_detect(image):
  """
  :param image: 图片路径
  :return: None
  """
  img = cv2.imread(image,cv2.IMREAD_COLOR)
  skinCrCbHist = np.zeros((256,256), dtype= np.uint8 )
  cv2.ellipse(skinCrCbHist ,(113,155),(23,15),43,0, 360, (255,255,255),-1)
 
  YCRCB = cv2.cvtColor(img,cv2.COLOR_BGR2YCR_CB)
  (y,cr,cb)= cv2.split(YCRCB)
  skin = np.zeros(cr.shape, dtype=np.uint8)
  (x,y)= cr.shape
  for i in range(0,x):
    for j in range(0,y):
      CR= YCRCB[i,j,1]
      CB= YCRCB[i,j,2]
      if skinCrCbHist [CR,CB]>0:
        skin[i,j]= 255
  cv2.namedWindow(image, cv2.WINDOW_NORMAL)
  cv2.imshow(image, img)
  dst = cv2.bitwise_and(img,img,mask= skin)
  cv2.namedWindow("cutout", cv2.WINDOW_NORMAL)
  cv2.imshow("cutout",dst)
  cv2.waitKey()

效果

python opencv肤色检测的实现示例

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

原理

针对YCRCB中CR分量的处理,将RGB转换为YCRCB,对CR通道单独进行otsu处理,otsu方法opencv里用threshold

代码

def cr_otsu(image):
  """YCrCb颜色空间的Cr分量+Otsu阈值分割
  :param image: 图片路径
  :return: None
  """
  img = cv2.imread(image, cv2.IMREAD_COLOR)
  ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
 
  (y, cr, cb) = cv2.split(ycrcb)
  cr1 = cv2.GaussianBlur(cr, (5, 5), 0)
  _, skin = cv2.threshold(cr1,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
 
  cv2.namedWindow("image raw", cv2.WINDOW_NORMAL)
  cv2.imshow("image raw", img)
  cv2.namedWindow("image CR", cv2.WINDOW_NORMAL)
  cv2.imshow("image CR", cr1)
  cv2.namedWindow("Skin Cr+OTSU", cv2.WINDOW_NORMAL)
  cv2.imshow("Skin Cr+OTSU", skin)
 
  dst = cv2.bitwise_and(img, img, mask=skin)
  cv2.namedWindow("seperate", cv2.WINDOW_NORMAL)
  cv2.imshow("seperate", dst)
  cv2.waitKey()

效果

python opencv肤色检测的实现示例

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

 原理

类似于第二种方法,只不过是对CR和CB两个通道综合考虑

代码

def crcb_range_sceening(image):
  """
  :param image: 图片路径
  :return: None
  """
  img = cv2.imread(image,cv2.IMREAD_COLOR)
  ycrcb=cv2.cvtColor(img,cv2.COLOR_BGR2YCR_CB)
  (y,cr,cb)= cv2.split(ycrcb)
 
  skin = np.zeros(cr.shape,dtype= np.uint8)
  (x,y)= cr.shape
  for i in range(0,x):
    for j in range(0,y):
      if (cr[i][j]>140)and(cr[i][j])<175 and (cr[i][j]>100) and (cb[i][j])<120:
        skin[i][j]= 255
      else:
        skin[i][j] = 0
  cv2.namedWindow(image,cv2.WINDOW_NORMAL)
  cv2.imshow(image,img)
  cv2.namedWindow(image+"skin2 cr+cb",cv2.WINDOW_NORMAL)
  cv2.imshow(image+"skin2 cr+cb",skin)
 
  dst = cv2.bitwise_and(img,img,mask=skin)
  cv2.namedWindow("cutout",cv2.WINDOW_NORMAL)
  cv2.imshow("cutout",dst)
 
  cv2.waitKey()

效果

python opencv肤色检测的实现示例

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

原理

还是转换空间然后每个通道设置一个阈值综合考虑,进行二值化操作。

代码

def hsv_detect(image):
  """
  :param image: 图片路径
  :return: None
  """
  img = cv2.imread(image,cv2.IMREAD_COLOR)
  hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
  (_h,_s,_v)= cv2.split(hsv)
  skin= np.zeros(_h.shape,dtype=np.uint8)
  (x,y)= _h.shape
 
  for 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):
        skin[i][j] = 255
      else:
        skin[i][j] = 0
  cv2.namedWindow(image, cv2.WINDOW_NORMAL)
  cv2.imshow(image, img)
  cv2.namedWindow(image + "hsv", cv2.WINDOW_NORMAL)
  cv2.imshow(image + "hsv", skin)
  dst = cv2.bitwise_and(img, img, mask=skin)
  cv2.namedWindow("cutout", cv2.WINDOW_NORMAL)
  cv2.imshow("cutout", dst)
  cv2.waitKey()

效果

python opencv肤色检测的实现示例

示例

import cv2
import numpy as np
 
 
def ellipse_detect(image):
  """
  :param image: img path
  :return: None
  """
  img = cv2.imread(image, cv2.IMREAD_COLOR)
  skinCrCbHist = np.zeros((256, 256), dtype=np.uint8)
  cv2.ellipse(skinCrCbHist, (113, 155), (23, 15), 43, 0, 360, (255, 255, 255), -1)
 
  YCRCB = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
  (y, cr, cb) = cv2.split(YCRCB)
  skin = np.zeros(cr.shape, dtype=np.uint8)
  (x, y) = cr.shape
  for i in range(0, x):
    for j in range(0, y):
      CR = YCRCB[i, j, 1]
      CB = YCRCB[i, j, 2]
      if skinCrCbHist[CR, CB] > 0:
        skin[i, j] = 255
  cv2.namedWindow(image, cv2.WINDOW_NORMAL)
  cv2.imshow(image, img)
  dst = cv2.bitwise_and(img, img, mask=skin)
  cv2.namedWindow("cutout", cv2.WINDOW_NORMAL)
  cv2.imshow("cutout", dst)
  cv2.waitKey()
 
 
 
if __name__ == '__main__':
  ellipse_detect('./test.png')

 到此这篇关于python opencv肤色检测的实现示例的文章就介绍到这了,更多相关opencv 肤色检测内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python获取标准北京时间的方法
Mar 24 Python
Django REST为文件属性输出完整URL的方法
Dec 18 Python
对numpy数据写入文件的方法讲解
Jul 09 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
PyQt5图形界面播放音乐的实例
Jun 17 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
Python发送邮件封装实现过程详解
May 09 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
python读写数据读写csv文件(pandas用法)
Dec 14 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
OpenCV+Python3.5 简易手势识别的实现
Dec 21 #Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 #Python
python 录制系统声音的示例
Dec 21 #Python
用python发送微信消息
Dec 21 #Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 #Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
Dec 21 #Python
python switch 实现多分支选择功能
Dec 21 #Python
You might like
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
jQuery select控制插件
2009/08/17 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
js实现连个数字相加而不是拼接的方法
2014/02/23 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
easyui简介_动力节点Java学院整理
2017/07/14 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
vue实现与安卓、IOS交互的方法
2018/11/02 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
数字漫画:comiXology
2020/06/13 全球购物
总经理助理岗位职责
2013/11/08 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
考勤制度通知
2015/04/25 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
浅析python中特殊文件和特殊函数
2022/02/24 Python
你真的会用Mysql的explain吗
2022/03/31 MySQL
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript