[C#] 濾鏡筆記 – 偵測人的皮膚

2012-12-07


其實人類的皮膚在一定的色域內,但是因為有光暗的明亮的關係

所以有許多演算法有加入邊界的運算等…

這邊參考了很多網站,我不是數學家,所以我把看到的幾個公式測過一次..

這邊記錄一下我測過的公式..

public static bool IsSkinColor(byte r, byte g, byte b)
{
 
   // 公式 1 : http://www.codeproject.com/Articles/38176/Image-Processing-Skin-Detection-Some-Filters-and-E
 
   //return ( (r > 95) && (g > 40) && (b < 20)) && ( (Math.Max(Math.Max(r, g), b)) - (Math.Min(Math.Min(r, g), b)) > 15) &&
   //       (Math.Abs(r - g) > 15) && (r > g) && (r > b) ||
   //       ( (r > 220) && (g > 210) && (b > 170) && (Math.Abs(r - g) == 15) && (r > b) && (g > b));
 
 
   // 公式 2 :http://www.codeproject.com/Articles/38176/Image-Processing-Skin-Detection-Some-Filters-and-E
   //if (r == 0 || b == 0 || g == 0) return false; 
 
   //return ((r/g) > 1.185) && (((r*b)/((r + g + b)*(r + g + b))) > 0.107) &&
   //       (((r*g)/((r + g + b)*(r + g + b))) > 0.112);
 
 
 
   // 公式 3 :http://www.codeproject.com/Articles/8127/Skin-Recognition-in-C
   //double I = (Math.Log(r) + Math.Log(b) + Math.Log(g)) / 3;
   //double Rg = Math.Log(r) - Math.Log(g);
   //double By = Math.Log(b) - (Math.Log(g) + Math.Log(r)) / 2;
   //double hue = Math.Atan2(Rg, By) * (180 / Math.PI);
 
 
   //if (I <= 5 && (hue >= 4 && hue <= 255))
   //{
   //    return true;
   //}
   //else
   //{
   //    return false;
   //}
 
 
   // 公式四 : http://w3.ualg.pt/~ftomaz/download/dicta2003.pdf
   var Cb = (0.148 * r) - (0.291 * g) + (0.439 * b) + 128;
   var Cr = (0.439 * r) - (0.368 * g) - (0.071 * b) + 128;
 
   if ((r > 95 && g > 40 && b > 20 && (Math.Max(Math.Max(r, g),
   b) - Math.Min(Math.Min(r, g), b) > 15) && (r - g) > 15 &&
   r > g && r > b) &&
   (Cr > 140 && Cr < 162 || Cb > 105 && Cb < 130))
   {
       return true; 
   }
   else
   {
       return false; 
   } 
 
 
}


最後 公式四 是我測過算是比較良好的,其他的可能因為我理解上面有誤,所以並不是非常好的效果
只有公式三 也還OK~  是可以搭配使用…
公式三:

double I = (Math.Log(r) + Math.Log(b) + Math.Log(g)) / 3;
double Rg = Math.Log(r) - Math.Log(g);
double By = Math.Log(b) - (Math.Log(g) + Math.Log(r)) / 2;
double hue = Math.Atan2(Rg, By) * (180 / Math.PI);
 
 
if (I <= 5 && (hue >= 4 && hue <= 255))
{
  return true;
}
else
{
  return false;
}



2012-08-16_220019



公式四:

var Cb = (0.148 * r) - (0.291 * g) + (0.439 * b) + 128;
var Cr = (0.439 * r) - (0.368 * g) - (0.071 * b) + 128;
 
if ((r > 95 && g > 40 && b > 20 && (Math.Max(Math.Max(r, g),
b) - Math.Min(Math.Min(r, g), b) > 15) && (r - g) > 15 &&
r > g && r > b) &&
(Cr > 140 && Cr < 162 || Cb > 105 && Cb < 130))
{
    return true;
}
else
{
    return false;
} 



2012-08-16_220152



參考:


http://www.codeproject.com/Articles/38176/Image-Processing-Skin-Detection-Some-Filters-and-E


http://www.codeproject.com/Articles/8127/Skin-Recognition-in-C



http://w3.ualg.pt/~ftomaz/download/dicta2003.pdf


當麻許的超技八 2014 | Donma Hsu Design.