1.肤色检测

  肤色检测技术利用了计算机对人体皮肤像素的分析过程,随着人脸检测技术,表情识别及手势识别等技术的快速发展,肤色应用领域日趋增多。肤色检测技术常用的方法有基于颜色空间、光谱特征以及肤色反射模型等方法,这些方法的主要步骤先进行颜色空间变换,然后再建立肤色模型。肤色检测中颜色空间有RGB、YCrCb、HSV和Lab等,通常在处理的时候是将RGB颜色空间变换成相应的颜色空间,对某种类型的图像通过统计或物理分析,转换成YUV、LUX或H-SV-V等,肤色在颜色空间的分布中相对集中,为了消除光照的影响一般放弃亮度通道。皮肤模型中有单高斯、混合高斯、贝叶斯模型和椭圆模型等,高斯分布模型用于刻画椭圆高斯概率,对肤色与非肤色采用高斯混合模型在特定区域内能取得较好的实验结果。

  肤色YCbCr颜色空间是一种常用的肤色检测的色彩模型,其中Y代表亮度,Cr代表光源中的红色分类,Cb代表光源中的蓝色分量。人的肤色在外观上的差异是由色度引起的,不同人的肤色分布集中在较小的区域内。肤色的YCbCr颜色空间CbCr平面分布在近似的椭圆区域内,通过判断当前像素点的CbCr值是否落在肤色分布的椭圆区域内,就可以很容易确认当前像素点是否属于肤色。将图像转化到YCbCr空间并且在CbCr平面进行投影,可以采集到肤色的样本点,将其投影到此平面后,我们进行相应的非线性变换(K-L变换),进而形成的统计椭圆模型如下:
python肤色检测 opencv肤色检测_python肤色检测
  将上式转换为参数矩阵形式:
python肤色检测 opencv肤色检测_特征值_02
  将CbCr平面均分为小区域,将每个区域中心点CbCr色度值作为当前区域的特征值,对肤色区域像素值进行遍历,如果当前像素值落在该区域内则替换当前区域特征值。

python肤色检测 opencv肤色检测_特征值_03

2.参考代码

cv::Mat ellipse_detect(cv::Mat Src)
{
	cv::Mat srcImage = Src.clone();
	cv::Mat skinMat = cv::Mat::zeros(cv::Size(255, 255), CV_8UC1);
	cv::ellipse(skinMat, cv::Point(113, 155.6), cv::Size(23.4, 15.2), 43.0, 0.0, 360.0, cv::Scalar(255, 255, 255), -1);

	cv::Mat YcrcbMat;
	cv::Mat tempMat = cv::Mat::zeros(srcImage.size(), CV_8UC1);
	cv::cvtColor(srcImage, YcrcbMat, CV_BGR2YCrCb);

	for (int i = 0; i < srcImage.cols; i++)
	{
		for (int j = 0; j < srcImage.rows; j++)
		{
			cv::Vec3b ycrcb = YcrcbMat.at<cv::Vec3b>(j, i);

			if (skinMat.at<uchar>(ycrcb[1], ycrcb[2] > 0))
			{
				tempMat.at<uchar>(j, i) = 255;
			}
		}
	}

	cv::Mat resultMat;

	srcImage.copyTo(resultMat, tempMat);

	return resultMat;
}