在c#中将图像转换为黑白或棕褐色

时间:2011-01-07 11:25:15

标签: image-processing c#-3.0

我想将图像更改为Black-White或Sepia。 转换图像后,我想用转换后的图像替换现有图像。

请给我一些建议。

5 个答案:

答案 0 :(得分:10)

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

最简单的方式,适用于大多数照片(但对合成图像来说不太合适),就是使用3个RGB通道的绿色通道。人类对光谱绿色部分的变化最敏感,因此绿色通道覆盖了大部分可见光范围,并且非常接近您想要的灰度图像。

生成灰度图像的更好方法是使用3个RGB通道的加权平均值。选择相等的权重(0.33 * R + 0.33 * G + 0.33 * B)将产生非常好的灰度图像。其他凸起的权重(总和为1的非负权重)将给出不同的结果,其中一些可以被认为更美观,并且一些可以考虑感知参数。 (YUV uses these weightsY = 0.299*R + 0.587*G + 0.114*B

您总是可以将图像转换为另一个只有单个灰度通道(和2“颜色”通道)的颜色空间,例如HSV(V是灰度),YUV(Y是灰度)或La b (L是灰度)。差异不应该很大。

术语“去饱和”来自HSV空间。如果将图像转换为HSV,将S通道(饱和度)设置为全零,并渲染图像,您将获得3通道去饱和“颜色”图像。

将这些灰度通道复制为RGB将为您提供3通道去饱和“彩色”图像 - 其中所有3个RGB通道都相同。

一旦你有了这个3通道(RGB)去饱和图像,你可以将每个通道乘以一个单独的重量来为图像着色 - 一个棕褐色图像。

给定灰色像素[v,v,v],将其着色为:[v*a, v*b, v*c],以便0 <= a,b,c <=1

答案 1 :(得分:2)

// Loop through the images pixels to reset color.
for(x=0; x<image1.Width; x++)
{
    for(y=0; y<image1.Height; y++)
    {
        Color pixelColor = image1.GetPixel(x, y);
        int grayScale = (int)((originalColor.R * .3) + 
            (originalColor.G * .59) + (originalColor.B * .11));

        //create the color object
        Color newColor =  Color.FromArgb(grayScale, grayScale, grayScale);
            image1.SetPixel(x, y, newColor);
    }
}

使用此

将颜色像素转换为灰度
Gray = Green * 0.59 + Blue * 0.11 + Red * 0.30;

答案 2 :(得分:2)

对于棕褐色,您首先想要转换为灰度。然后简单地将每个像素乘以设定的缩放三元组,例如[1,0.95,0.82],您可以使用此三元组来播放以获得正确的外观......因此代码可能是......

for(x=0; x<image1.Width; x++)     
{         
    for(y=0; y<image1.Height; y++)         
    {             
        Color pixelColor = image1.GetPixel(x, y);             

        int grayScale = (int)((originalColor.R * .3) + (originalColor.G * .59) + (originalColor.B * .11));              
        //create the color object             
        Color newColor =  Color.FromArgb(grayScale, grayScale, grayScale);             

        //now apply a sepia filter
        pixelColor.R = newColor.R*1;
        pixelColor.G = newColor.G*0.95;
        pixelColor.B = newColor.B*0.82;

        image1.SetPixel(x, y, pixelColor);
     }
 }

答案 3 :(得分:1)

private Bitmap grayscale(Image image)
{
    Bitmap btm = new Bitmap(image);
    for (int i = 0; i < btm.Width; i++)
    {
        for (int j = 0; j < btm.Height; j++)
        {
            int ser = (btm.GetPixel(i, j).R + btm.GetPixel(i, j).G + btm.GetPixel(i, j).B) / 3;
            btm.SetPixel(i, j, Color.FromArgb(ser, ser, ser));
        }
    }
    return btm;
}

答案 4 :(得分:0)

我在这里找到了很好的答案: https://social.msdn.microsoft.com/Forums/vstudio/en-US/1d6b5960-c509-433c-b000-c885b8c727c4/how-to-convert-an-image-to-black-and-white-not-grayscale?forum=csharpgeneral&prof=required

var color = new Bitmap("file.jpg");
var bw = color.Clone(new Rectangle(0, 0, color.Width, color.Height), 
      PixelFormat.Format1bppIndexed);