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自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 Python
tensorflow实现逻辑回归模型
Sep 08 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
python如何读取bin文件并下发串口
Jul 05 Python
python爬虫神器Pyppeteer入门及使用
Jul 13 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
django之自定义软删除Model的方法
Aug 14 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
Apr 08 Python
Python基于pillow库实现生成图片水印
Sep 14 Python
pyx文件 生成pyd 文件用于 cython调用的实现
Mar 04 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
利用php获取服务器时间的实现代码
2013/06/07 PHP
php获取操作系统语言代码
2013/11/04 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
Laravel 队列使用的实现
2019/01/08 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
python微信公众号开发简单流程实现
2020/03/09 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
一套中级Java程序员笔试题
2015/01/14 面试题
业务部经理岗位职责
2014/01/04 职场文书
远程培训的心得体会
2014/09/01 职场文书
新教师个人总结
2015/02/06 职场文书
教师个人发展总结
2015/02/11 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
升学宴家长答谢词
2015/09/29 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书
家长必看:义务教育,不得以面试 评测等名义选拔学生
2019/07/09 职场文书