欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#数字图象处理之肤色检测的方法

程序员文章站 2023-01-22 12:34:39
本文实例讲述了c#数字图象处理之肤色检测的方法。分享给大家供大家参考。具体如下: //定义肤色检测函数(可供人脸检测等研究使用) public bitmap s...

本文实例讲述了c#数字图象处理之肤色检测的方法。分享给大家供大家参考。具体如下:

//定义肤色检测函数(可供人脸检测等研究使用)
public bitmap skindetect1(bitmap a)
{
  rectangle rect = new rectangle(0, 0, a.width, a.height);
  system.drawing.imaging.bitmapdata bmpdata = a.lockbits(rect, system.drawing.imaging.imagelockmode.readwrite, system.drawing.imaging.pixelformat.format24bpprgb);
  int stride = bmpdata.stride;
  unsafe
  {
   byte* pin = (byte*)bmpdata.scan0.topointer();
   byte* p;
   int r, g, b;
   double r, g, fupr,flor,wrg;
   for (int y = 0; y < a.height; y++)
   {
     for (int x = 0; x < a.width; x++)
     {
     p = pin;
     b = p[0];
     g = p[1];
     r = p[2];
     if (r + g + b == 0)
     {
       r = 0;
       g = 0;
     }
     else
     {
       r = (r / (r + g + b));
       g = (g / (r + g + b));
     }
     fupr = (1.0743 * r + 0.1452-1.3767 * r * r) ;
     flor = (0.5601 * r + 0.1766-0.776 * r * r);
     wrg = (r - 0.33) * (r - 0.33) + (g - 0.33) * (g - 0.33);  
     if ((r - g >= 45) && ((r > g) && (g > b)) && (fupr > g) && (wrg >= 0.0004))
     {
        p[0] = (byte)b;
        p[1] = (byte)g;
        p[2] = (byte)r;  
     }
     else
     {
       p[0] = 0;
       p[1] = 0;
       p[2] = 0;
     }
     pin += 3;
     
     }
     pin += stride - a.width * 3;
   }
  }
  a.unlockbits(bmpdata);
  return a;
}

效果图像:

C#数字图象处理之肤色检测的方法

C#数字图象处理之肤色检测的方法

希望本文所述对大家的c#程序设计有所帮助。