在有人因为没有查看其他帖子而让我发火焰之前,我已经做过了。我有一个特定的问题,关于将图像转换为灰度的技术之一。
我已阅读了SO上的其他帖子,并基本上从this site的教程中复制了技术3(ColorMatrix)。它非常,非常,快速地工作。
我遇到的问题是我需要的是纯粹的BW图像。 (即:如果平均值(R,B,G)> 200 =>白色,则为黑色)。我已经用简单的方式实现了它,它实际上需要的时间几乎是教程中灰度算法的10倍。
我不是图像处理的专家,并且想知道是否有任何方法可以修改教程中的片段以将图像转换为纯黑色和白色。如果没有,任何有效的方法都可以。
编辑:
这是我用于黑白(无大脑方法)的代码:
public Bitmap make_bw(Bitmap original) {
Bitmap output = new Bitmap(original.Width, original.Height);
for (int i = 0; i < original.Width; i++) {
for (int j = 0; j < original.Height; j++) {
Color c = original.GetPixel(i, j);
int average = ((c.R + c.B + c.G) / 3);
if (average < 200)
output.SetPixel(i, j, Color.Black);
else
output.SetPixel(i, j, Color.White);
}
}
return output;
}
答案 0 :(得分:3)
答案 1 :(得分:2)
这个家伙进行了三次测试,紧固件就是这里提到的ColorMatrix
。 External link about image conversion
但其中一位评论者声称直接和unsafe
像素访问方法较慢的原因是在位图中调用.Width
和.Height
并将这些值复制到局部变量使得直接像素访问速度更快。
我对此进行了测试,似乎不安全的方法比使用ColorMatrix
快约2.5倍。但它可能也更具参与性,显然它要求项目中允许使用unsafe
代码,这可能是不可取的。
答案 2 :(得分:2)
我正在使用这个简单的代码:
public Bitmap GrayScaleFilter(Bitmap image)
{
Bitmap grayScale = new Bitmap(image.Width, image.Height);
for (Int32 y = 0; y < grayScale.Height; y++)
for (Int32 x = 0; x < grayScale.Width; x++)
{
Color c = image.GetPixel(x, y);
Int32 gs = (Int32)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);
grayScale.SetPixel(x, y, Color.FromArgb(gs, gs, gs));
}
return grayScale;
}