我想将图像更改为Black-White或Sepia。 转换图像后,我想用转换后的图像替换现有图像。
请给我一些建议。
答案 0 :(得分:10)
去饱和彩色图像的方法有很多种。事实上,可能没有一种“真实”或“正确”的方式来做到这一点,尽管某些方式比其他方式更“正确”。
我假设您的图像是RGB(红 - 绿 - 蓝)格式(虽然BGR也很常见)。
最简单的方式,适用于大多数照片(但对合成图像来说不太合适),就是使用3个RGB通道的绿色通道。人类对光谱绿色部分的变化最敏感,因此绿色通道覆盖了大部分可见光范围,并且非常接近您想要的灰度图像。
生成灰度图像的更好方法是使用3个RGB通道的加权平均值。选择相等的权重(0.33 * R + 0.33 * G + 0.33 * B)将产生非常好的灰度图像。其他凸起的权重(总和为1的非负权重)将给出不同的结果,其中一些可以被认为更美观,并且一些可以考虑感知参数。 (YUV uses these weights: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
。
答案 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)
var color = new Bitmap("file.jpg");
var bw = color.Clone(new Rectangle(0, 0, color.Width, color.Height),
PixelFormat.Format1bppIndexed);