C# port of a simple skin color detection algorithm. Python original by SpliFF here. See also this Stack Overflow question.
Produces a lot of false positives but is great for quickly filtering a large set of unknown images.
C# port of a simple skin color detection algorithm. Python original by SpliFF here. See also this Stack Overflow question.
Produces a lot of false positives but is great for quickly filtering a large set of unknown images.
using System; | |
using System.Diagnostics; | |
using System.Drawing; | |
using System.IO; | |
namespace SkinScanner | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
foreach (var dir in args) | |
{ | |
foreach (var file in Directory.GetFiles(dir)) | |
{ | |
try | |
{ | |
using (var img = Image.FromFile(file) as Bitmap) | |
{ | |
if (img != null) | |
{ | |
if (HasSkin(img)) | |
Console.Out.WriteLine(file); | |
} | |
// else not an image | |
} | |
} | |
catch | |
{ | |
// error reading file | |
} | |
} | |
} | |
} | |
const int MinSkinPercentage = 25; | |
static bool HasSkin(Bitmap img) | |
{ | |
int total = 0, skin = 0; | |
var startx = 0; | |
var endx = img.Width; | |
var starty = 0; | |
var endy = img.Height; | |
//var startx = (int)(0.2 * img.Width); | |
//var endx = (int)(0.8 * img.Width); | |
//var starty = (int)(0.2 * img.Height); | |
//var endy = (int)(0.8 * img.Height); | |
for (int y = starty; y < endy; y++) | |
{ | |
for (int x = startx; x < endx; x++) | |
{ | |
var p = img.GetPixel(x, y); | |
var s = IsSkin(p); | |
if (s) skin++; | |
total++; | |
} | |
} | |
return ((double)skin / total) > (MinSkinPercentage / 100.0); | |
} | |
static bool IsSkin(Color p) | |
{ | |
return p.R > 60 && (p.G < p.R * 0.85) && (p.B < p.R * 0.7) && (p.G > p.R * 0.4) && (p.B > p.R * 0.2); | |
} | |
} | |
} |