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

mun*_*ish 5 image-processing c#-3.0

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

请给我一些建议.

Adi*_*vit 10

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

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

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


hun*_*ind 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此将彩色像素转换为灰度

Gray = Green * 0.59 + Blue * 0.11 + Red * 0.30;
Run Code Online (Sandbox Code Playgroud)