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 实现归并排序算法
Jun 05 Python
跟老齐学Python之让人欢喜让人忧的迭代
Oct 02 Python
Python线程中对join方法的运用的教程
Apr 09 Python
Python中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
浅谈python numpy中nonzero()的用法
Apr 02 Python
浅谈python中对于json写入txt文件的编码问题
Jun 07 Python
Python使用paramiko操作linux的方法讲解
Feb 25 Python
python性能测量工具cProfile使用解析
Sep 26 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
Nov 29 Python
Python判断字符串是否为空和null方法实例
Apr 26 Python
python中pop()函数的语法与实例
Dec 01 Python
Python echarts实现数据可视化实例详解
Mar 03 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
escape unescape的php下的实现方法
2007/04/27 PHP
php5 apache 2.2 webservice 创建与配置(java)
2011/01/27 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
vue弹窗插件实战代码
2018/09/08 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
Python中实现参数类型检查的简单方法
2015/04/21 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
python的range和linspace使用详解
2019/11/27 Python
世界上最好的帽子:Tilley
2016/11/27 全球购物
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
2014年人事行政工作总结
2014/12/03 职场文书
前台岗位职责
2015/02/13 职场文书
学习保证书100字
2015/02/26 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS