如何做快速皮肤分割

时间:2013-12-29 15:10:25

标签: c# detection skin

这是我用手检测图像肤色的代码,但检查每张照片大约需要5分钟...有谁知道如何以更快的方式实现它?谢谢!

using (Bitmap SampleImage = (Bitmap)Image.FromFile (path)) { 
    for (int x = 0; x < SampleImage.Width; x++) {
        for (int y = 0; y < SampleImage.Height; y++) {
            Color pixelColor = SampleImage.GetPixel (x, y);
            int r = pixelColor.R;
            int g = pixelColor.G;
            int b = pixelColor.B;
            int differenceMinMax =
                Math.Max (r, Math.Max (g, b)) - Math.Min (r, Math.Min (g, b));

            if (r > 95 & g > 40 & b > 20 & differenceMinMax > 15 & r > g & r > b) {
                SampleImage.SetPixel (x, y, Color.White);
            } else if (r > 220 & g > 210 & b > 170) {
                SampleImage.SetPixel (x, y, Color.White);
            } else {
                SampleImage.SetPixel (x, y, Color.Black);
            }

            SampleImage.Save (path, System.Drawing.Imaging.ImageFormat.Jpeg); 
        }
    }
}

1 个答案:

答案 0 :(得分:0)

  1. 在循环之外移动SampleImage.Save。
  2. 内循环应按X坐标迭代。它减少了CPU缓存未命中数。
  3. 按照上面评论中的建议,取消缓慢的GetPixel和SetPixel方法。
  4. 并行化内循环http://msdn.microsoft.com/en-us/library/dd783584(v=vs.110).aspx#fbid=IJmDXumNJjA