如何在C#中将位图图像转换为黑白?

11

可能是重复问题:
在C#中将图像转换为黑白或棕褐色

我正在编写一个C#应用程序,它打开一张图片,点击按钮后,只显示黑白的图片! 我确信可以在网上找到很多信息,但我的搜索并没有给我提供很多易懂和有用的信息。

我不知道该怎么做。有人有什么建议吗?知道网上的教程吗?


可能是重复问题 https://dev59.com/mHE95IYBdhLWcg3wi-ee - scartag
2个回答

26

我曾经找到一个将位图转换为灰度的函数。

public void ToGrayScale(Bitmap Bmp)
{
    int rgb;
    Color c;

    for (int y = 0; y < Bmp.Height; y++)
    for (int x = 0; x < Bmp.Width; x++)
    {
        c = Bmp.GetPixel(x, y);
        rgb = (int)Math.Round(.299 * c.R + .587 * c.G + .114 * c.B);
        Bmp.SetPixel(x, y, Color.FromArgb(rgb, rgb, rgb));
    }
}

该函数接受一个位图作为参数,并将其转换为灰度版本。

希望这可以帮到你。


16
(c.R + c.G + c.B)/ 3的计算方法可以将图片变为灰色,但结果位图不正确。你应该使用以下公式之一:(c.R * .3)+(c.G * .59)+(c.B * .11),或者如A_Nablsi所述:(.299 * c.R + .587 * c.G + .114 * c.B)。 - petro.sidlovskyy
2
这个函数很有用,但是我想指出返回Bmp是具有误导性的,因为Bmp参数的内容无论如何都会被修改。这让我感到困惑,因为我以为这个函数会返回一个新的位图。 - Surfbutler
1
对于纯黑/白色: rgb = (int)(Math.Round(((double)(c.R + c.G + c.B) / 3.0) / 255) * 255); - Zachary Canann
这个可行,但没有保持透明度 - 这个可以:https://stackoverflow.com/questions/3053889/how-to-convert-32-bit-rgba-image-to-grayscale-preserving-alpha#comment94710683_3054357 - Christopher

2

编辑 点此查看完整答案:在C#中将图像转换为黑白或棕褐色

有许多方法可以去色彩图像。实际上,可能没有一种“真正”的或“正确”的方法来做到这一点,尽管某些方法比其他方法更正确。
我假设您的图像是RGB(红绿蓝)格式(尽管BGR也很常见)。

简单的方法是使用3个RGB通道中的绿色通道,这应该适用于大多数照片(但对合成图像的效果不佳)。人类对光谱中绿色部分的变化最为敏感,因此绿色通道覆盖了大部分可见范围,并且是您想要的灰度图像的很好近似。

生成灰度图像的更好方法是使用3个RGB通道的加权平均值。选择相等的权重(0.33*R+0.33*G+0.33*B)将给出一个相当不错的灰度图像。其他权重将给出不同的结果,其中一些可能被认为更具美感,而另一些可能考虑了感知参数。

您始终可以将图像转换为另一个颜色空间,该颜色空间仅具有单个灰度通道(和2个“彩色”通道),例如HSV(V是灰度),YUV(Y是灰度)或Lab(L是灰度)。差异应该不会很大。

术语“去饱和度”来自HSV空间。如果您将图像转换为HSV,则将S通道(饱和度)设置为所有零,并渲染图像,则会获得一个3通道的去饱和“彩色”图像。


谢谢评论!我用了另一种更简单的方法,但你的方法在其他情况下应该也可以用得上,所以我会保留它! - Flo

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