概述本文中的人体肤色检测功能是使用OpenCV库实现的。OpenCV是一个基于BSD许可(开源)发布的跨平台计算机视觉库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量高效——由一系列C函数和少量C++类组成,同时提供Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉中的许多通用算法。本文主要利用了OpenCV的图像色域转换、颜色通道分割、高斯滤波、OSTU自动阈值等功能。参考OpenCV探索之路:皮肤检测技术学习OpenCV——肤色检测准备安装Python-OpenCV库pipinstallopencv-python-ihttps://mirrors.ustc.edu.cn/pypi/web/simple使用-i作为pip命令镜像源,这里用的是电子科大的源,比官方源快。安装Numpy科学计算库pipinstallnumpy-ihttps://mirrors.ustc.edu.cn/pypi/web/simple图像的基本操作importnumpyasnpimportcv2imname="6358772.jpg"#读取图像'''使用函数cv2。imread()读取图像。图片应该在这个程序的工作路径中,或者提供函数的完整路径。警告:即使图片路径错误,OpenCV也不会提醒你,但是当你使用命令print(img)时,你得到的结果是None。'''img=cv2.imread(imname,cv2.IMREAD_COLOR)'''imread函数第一个参数是要打开的图片的名称(带路径)第二个参数是告诉函数如何读取图片picture.其中cv2.IMREAD_COLOR表示读取彩色图像,alpha通道被忽略,默认值cv2.IMREAD_ANYCOLOR表示读取彩色图像cv2.IMREAD_GRAYSCALE表示读取灰度图像cv2.IMREAD_UNCHANGED表示读取图像,和包括图像的alpha通道'''#DisplayImage'''使用函数cv2.imshow()来显示图像。窗口会自动调整为图像大小。第一个参数是窗口的名称,后面是我们的图像。你可以创建任意多个窗口,但是必须给它们取不同的名字。'''cv2.imshow("image",img)#"image"参数是图像显示窗口的标题,img是需要显示的图片Datacv2.waitKey(0)#等待键盘输入,参数表示等待时间,单位毫秒。0表示无限等待cv2.destroyAllWindows()#销毁cv创建的所有窗口#也可以销毁指定的窗口:#cv2.destroyWindow("image")#删除标题为"image"的窗口#保存一张图片'''使用函数cv2.imwrite()保存图像。首先需要文件名,然后是要保存的图像。保存图片的格式由后缀名决定'''#cv2.imwrite(imname+"01.png",img)cv2.imwrite(imname+"01.jpg",img)运行基于截图的皮肤检测算法YCrCb颜色空间Cr分量+大津法阈值分割算法YCrCb即YUV,其中Y代表亮度Luminance或Luma,即灰度值。U和V表示色度Chrominance或Chroma,用来描述图像颜色和饱和度。用于指定像素的颜色。通过将RGB信号的特定部分叠加在一起,通过RGB输入信号建立亮度。色度定义了一种颜色的两个方面——色调和饱和度,用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值的差异。而Cb反映了RGB输入信号的蓝色部分与RGB信号亮度值的差异。这种方法的原理也很简单:将RGB图像转换到YCrCb颜色空间,提取Cr分量图像,对Cr分量进行高斯滤波。对Cr执行自二值化阈值分割。OSTU方法采用低通滤波器进行高斯滤波,达到图像模糊的目的。这对于消除噪音很有用。其实就是去除图像中的高频成分(如:噪声、边框)。所以界限会有点模糊。(当然也有不模糊边界的模糊技巧)。OpenCV提供了四种模糊技术。高斯滤波就是其中之一。实现的函数是cv2.GaussianBlur()。我们需要指定高斯滤波器的宽度和高度(必须是奇数)。以及沿X、Y方向的高斯分布的标准差。如果我们只指定X方向的标准偏差,Y方向将取相同的值。如果两个标准差都为0,则函数会根据核的大小自行计算。高斯滤波可以有效去除图像中的高斯噪声。如果需要,您还可以使用函数cv2.getGaussianKernel()自己构建一个高斯滤波器。#肤色检测一:YCrCb的Cr分量+OTSU二值化img=cv2.imread(imname,cv2.IMREAD_COLOR)ycrcb=cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb)#转换图像为YUV色域(y,cr,cb))=cv2.split(ycrcb)#图像分割,分别得到y,cr,br通道图像#高斯滤波,cr为待滤波的源图像数据,(5,5)为取值窗口大小,0表示计算高斯函数根据窗口大小的标准差cr1=cv2.GaussianBlur(cr,(5,5),0)#cr通道分量上的高斯滤波#根据OTSU算法计算图像阈值,得到imageisbinarized_,skin1=cv2.threshold(cr1,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)cv2.imshow("imageCR",cr1)cv2.imshow("SkinCr+OSTU",skin1)基于YCrCb颜色的检测效果空间Cr,Cb范围筛选这种方法其实和方法1类似,只是颜色空间不同。资料显示,正常黄种人的Cr分量在140~175之间,Cb分量在100~120之间,你可以根据自己的项目需要,放大或缩小这两个分量的范围,会有不同效果。#肤色检测二:140<=Cr<=175100<=Cb<=120img=cv2.imread(imname,cv2.IMREAD_COLOR)ycrcb=cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb)#将图像转换成YUVinYCrCbColorgamut(y,cr,cb)=cv2.split(ycrcb)#图像分割,分别得到y,cr,br通道分量图像skin2=np.zeros(cr.shape,dtype=np.uint8)#根据出处image大小创建一个全0的矩阵来保存图像数据(x,y)=cr.shape#获取源图像数据的长宽#遍历图像,判断Cr和Br通道的值,如果在指定范围内,则设置新图像的点为255,否则设置为0foriinrange(0,x):forjinrange(0,y):if(cr[i][j]>140)and(cr[i][j]<175)and(cb[i][j]>100)and(cb[i][j]<120):skin2[i][j]=255else:skin2[i][j]=0cv2.imshow(imname,img)cv2.imshow(imname+"Skin2Cr+Cb",skin2)检测效果基于HSV颜色空间H,S,V范围筛选法。这种方法与前面的方法类似,只是颜色空间不同。据资料显示,正常黄种人的H成分约为7~20,S成分约为28~256,V成分约为50~256,可根据需要放大或缩小这两个成分的范围你的项目需要,就会有不同的效果。#肤色检测三:7
