1.基于YCrCb颜色空间Cr, Cb范围筛选法
/***********基于YCrCb颜色空间Cr, Cb范围筛选法***********/
//肤色颜色范围
//Cr[132,136],Cb[125,130]
Mat YCrCb_detect(Mat & src)
{
Mat ycrcb_img;
int Cr = 1;
int Cb = 2;
cvtColor(src, ycrcb_img, CV_BGR2YCrCb); //首先将RGB转换成到YCrCb空间
Mat output_mask = Mat::zeros(src.size(), CV_8UC1);
//遍历每一个像素
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
uchar *p_mask = output_mask.ptr<uchar>(i, j);
uchar *p_src = ycrcb_img.ptr<uchar>(i, j);
//Cr[132, 136], Cb[125, 130],若再次范围内,则将掩模像素值置为255
if (p_src[Cr] >= 132 && p_src[Cr] <= 136 && p_src[Cb] >= 127 && p_src[Cb] <= 130)
{
p_mask[0] = 255;
}
}
}
Mat detect;
src.copyTo(detect, output_mask);
return detect;
}
2.YCrCb颜色空间Cr分量+Otsu法阈值分割
/*******YCrCb颜色空间Cr分量+Otsu法阈值分割**********/
Mat YCrCb_Otsu_detect(Mat & src)
{
Mat ycrcb_image, detect;
cvtColor(src, ycrcb_image, CV_BGR2YCrCb); //首先将RGB转换成到YCrCb空间
vector<Mat> channels;
split(ycrcb_image, channels); //通道分离
Mat output_mask = channels[1]; //Cr分量
threshold(output_mask, output_mask, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //OSTU阈值分割
src.copyTo(detect, output_mask);
return detect;
}