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

问题描述 投票:5回答:5

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

请给我一些建议。

image-processing c#-3.0
5个回答
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是灰度)或Lab(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


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
投票

对于棕褐色,您首先要转换为灰度。然后简单地将每个像素乘以设置的缩放三元组,例如[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);
     }
 }

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

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);
© www.soinside.com 2019 - 2024. All rights reserved.