基于RGB颜色空间的简单阈值肤色识别
在human skin color clustering for face detection一文中提出如下简单的判别算式:
R>95 And G>40 And B>20 And R>G And R>B And Max(R,G,B)-Min(R,G,B)>15 And Abs(R-G)>15
算法非常之简单,同样主要把复杂的判断条件放到后面去判断,能有效的降低程序的执行时间,代码实现如下:
Mat SkinDetection(Mat src) {
int row = src.rows;
int col = src.cols;
int channels = src.channels();
Mat dst(row, col, CV_8UC3);
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
int B = src.at(i, j)[0];
int G = src.at(i, j)[1];
int R = src.at(i, j)[2];
for (int k = 0; k < 3; k++) {
dst.at(i, j)[k] = src.at(i, j)[k];
}
int maxx, minn;
if (R > 95 && G > 40 && B > 20 && R > B && R > G && abs(R - G) > 15) {
if (B >= G) {
maxx = B;
minn = G;
}
else {
maxx = G;
minn = B;
}
if (R > maxx)
maxx = R;
else if (R < minn)
minn = R;
if (maxx - minn > 15) {
for (int k = 0; k < 3; k++) {
dst.at(i, j)[k] = 255;
}
}
}
}
}
return dst;
}
效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190620214705626.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p1c3Rfc29ydA==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190620214719580.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p1c3Rfc29ydA==,size_16,color_FFFFFF,t_70)
基于YCbCr颜色空间的简单阈值肤色识别
该算法则更为简单,将图像转换到YCbCr颜色空间,然后按下述计算式判断是否属于皮肤区域: (Cb > 77 And Cb < 127) And (Cr > 133 And Cr < 173)
const float YCbCrYRF = 0.299F; // RGB转YCbCr的系数(浮点类型)
const float YCbCrYGF = 0.587F;
const float YCbCrYBF = 0.114F;
const float YCbCrCbRF = -0.168736F;
const float YCbCrCbGF = -0.331264F;
const float YCbCrCbBF = 0.500000F;
const float YCbCrCrRF = 0.500000F;
const float YCbCrCrGF = -0.418688F;
const float YCbCrCrBF = -0.081312F;
const float RGBRYF = 1.00000F; // YCbCr转RGB的系数(浮点类型)
const float RGBRCbF = 0.0000F;
const float RGBRCrF = 1.40200F;
const float RGBGYF = 1.00000F;
const float RGBGCbF = -0.34414F;
const float RGBGCrF = -0.71414F;
const float RGBBYF = 1.00000F;
const float RGBBCbF = 1.77200F;
const float RGBBCrF = 0.00000F;
const int Shift = 20;
const int HalfShiftValue = 1 |