2011-01-07 21 views

Antwort

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

Convert Farbpixel in Graustufen dieses Sepia

Gray = Green * 0.59 + Blue * 0.11 + Red * 0.30; 
+0

Warum die Komponenten zu multiplizieren diese Werte? Gibt das Sepia?Ich vermute es, aber eine Erklärung wäre nützlich. – ChrisF

+0

Rot (255,0,0) Grün (0,255,0) Blau (0,0,255) Zusammen ergeben sie eine weiße Farbe, die 255,255,255 ist. Wenn Sie die obige Formel mit reinem RGB berechnen, ergibt sich ein Wert von fast 255. – hungryMind

1

Für die Verwendung zuerst in Graustufen umwandeln möchten. Dann multiplizieren Sie einfach jedes Pixel durch einen Satz Skalierungs Triplett wie [1, 0,95, 0,82] Sie mit diesem Triplett rumspielen kann den richtigen Look zu bekommen ... so könnte der Code ...

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

Es Es gibt viele Möglichkeiten, entsättigen ein Farbbild. In der Tat gibt es wahrscheinlich keinen "richtigen" oder "richtigen" Weg, dies zu tun, obwohl einige Wege "korrekter" sind als andere.
Ich nehme an, dass Ihr Bild im RGB (Rot-Grün-Blau) Format ist (obwohl BGR auch üblich ist).

Die einfachste Weise, die für die meisten Fotos funktionieren sollte (aber weniger für synthetische Bilder), ist, nur den grünen Kanal der 3 RGB-Kanäle zu verwenden. Menschen sind am empfindlichsten auf Variationen im grünen Teil des Spektrums, so dass der grüne Kanal den größten Teil des sichtbaren Bereichs abdeckt und eine gute Annäherung an das gewünschte Graustufenbild darstellt.

Eine bessere Möglichkeit, ein Graustufenbild zu erstellen, besteht darin, einen gewichteten Durchschnitt der 3 RGB-Kanäle zu verwenden. Wenn Sie gleiche Gewichte wählen (0,33 * R + 0,33 * G + 0,33 * B), erhalten Sie ein ziemlich gutes Graustufenbild. Andere konvexe Gewichte (nicht negative Gewichte, die zu 1 summieren) ergeben andere Ergebnisse, von denen einige als ästhetisch ansprechender angesehen werden können und einige können Wahrnehmungsparameter berücksichtigen. (YUV uses these weights: Y = 0.299*R + 0.587*G + 0.114*B)

Sie immer das Bild in einen anderen Farbraum, den einzelnen Graustufen- Kanal hat umwandeln konnte nur einen (und 2 "color" Kanäle), wie beispielsweise HSV (V sind die Graustufen), YUV (Y ist die Graustufe) oder La b (L ist die Graustufe). Die Unterschiede sollten nicht sehr groß sein.

Der Begriff "Entsättigung" kommt vom HSV-Raum. Wenn Sie Ihr Bild in HSV konvertieren, den S-Kanal (Sättigung) auf Nullen setzen und das Bild rendern, erhalten Sie ein 3-Kanal-entsättigtes "Farb" -Bild.

Wenn Sie diese Graustufenkanäle in RGB duplizieren, erhalten Sie ein dreikanaliges, entsättigtes "Farbbild", in dem alle drei RGB-Kanäle identisch sind.

Sobald Sie dieses dreikanalige (RGB) entsättigte Bild haben, können Sie jeden Kanal mit einem separaten Gewicht multiplizieren, um das Bild zu kolorieren - ein Sepiabild.

Gegeben ein graues Pixel [v,v,v], kolorieren Sie es so: [v*a, v*b, v*c], so dass 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; 
}