在C#中,将图像转换为纯黑白的最快方法是什么?

6
在有人因为我没有检查其他帖子而批评我的之前,我已经做过了。我有一个关于将图像转换为灰度的技术之一的具体问题。
我已经阅读了SO上的其他帖子,并从这个网站的教程中复制了技术3(ColorMatrix)。它非常快速。
我遇到的问题是我需要一个纯BW图像。(即:如果average(R,B,G) > 200 => white else black)。我已经按照直接的方式实现了它,但它实际上需要将近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;       

}

你实际上不需要使用颜色矩阵来将图像转换为1位(纯黑白)图像。尝试第二种解决方案,看看是否更快。(如果不是,请发布您的代码。) - Cody Gray
你能贴一些表现不佳的代码吗?如果只添加一个“if”,如何使某些东西的时间增加10倍? - Daniel Mošmondor
3个回答

3
我将使用以下简单代码:

我正在使用这个简单的代码:

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;
}

6
我们讨论一下最快的完成方法,好吗? - WiiMaxx

3

应该更仔细地搜索...问题已解决,运行速度非常快。 - user472875
2
我“作弊”了一点……看到你链接中最快的示例使用了SetColorMatrix,于是我谷歌搜索了SetColorMatrix BW :-) - xanatos

2
这个人进行了三个测试,其中最快的是如此提到的ColorMatrix有关图像转换的外部链接 但是,其中一位评论者声称直接和unsafe像素访问方法速度较慢的原因是在位图中调用.Width.Height并将这些值复制到本地变量中,这使得直接像素访问明显更快。
我进行了测试,发现使用unsafe方法大约比使用ColorMatrix快2.5倍。但是这也可能更加复杂,显然需要允许项目中使用unsafe代码,这可能并不理想。

2
请不要仅仅包含外部文章的链接,而不添加任何示例。现在链接已经失效,无法知道如何实现它。 - kv1dr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接