2011-01-07 83 views

回答

1
// 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; 
+0

为什么这些值乘以组件?这是否给棕褐色?我怀疑它的确存在,但一个解释会很有用。 – ChrisF

+0

红色(255,0,0)绿色(0,255,0)蓝色(0,0,255)他们一起制造255,255,255的白色。如果您使用纯RGB的上述公式进行计算,则结果接近255。 – hungryMind

1

对于要转换首先为灰度深褐色。然后,只需通过一组缩放三联如[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); 
    } 
} 
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(灰度)。差异不应该很大。

术语“去饱和度”来自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
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; 
} 
相关问题