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的Flask框架实现视频的流媒体传输
Mar 31 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
用TensorFlow实现多类支持向量机的示例代码
Apr 28 Python
python使用wxpy实现微信消息防撤回脚本
Apr 29 Python
Python在Matplotlib图中显示中文字体的操作方法
Jul 29 Python
pytorch 实现打印模型的参数值
Dec 30 Python
Python-opencv 双线性插值实例
Jan 17 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
Python常用模块函数代码汇总解析
Aug 31 Python
如何基于Python按行合并两个txt
Nov 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
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
jQuery+HTML5加入购物车代码分享
2020/10/29 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
python处理document文档保留原样式
2019/09/23 Python
Python序列类型的打包和解包实例
2019/12/21 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
Python对wav文件的重采样实例
2020/02/25 Python
django配置app中的静态文件步骤
2020/03/27 Python
python os.rename实例用法详解
2020/12/06 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
市场营销毕业生自荐信
2013/11/23 职场文书
关于爱情的广播稿
2014/01/16 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
农村门前三包责任书
2014/07/25 职场文书
英语课外活动总结
2014/08/27 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript