2011-01-07 123 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; 
} 
相關問題