【发布时间】:2014-01-16 13:42:21
【问题描述】:
这是我为用手检测图像的肤色而实现的代码,但检查每张照片大约需要 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);
}
}
}
【问题讨论】:
-
如果我是你,我会尝试将图像分成几块(每块 40 个宽度)并在其上运行多个线程(如果你明白的话)
-
GetPixel/SetPixel是出了名的慢方法。尝试使用Bitmap.LockBits来加快访问速度。除此之外,您可能会尝试 google 以获得更好的算法。 -
为什么要将图像保存在
for循环中?将其保存在(内存)缓冲区中,完成图像处理后,将其保存到光盘中。