2013-03-28 6 views
8

Ich habe viele Formeln verwendet, um von RGB in Graustufen zu konvertieren, aber nicht gute Ergebnisse im Vergleich zu GIMP.konvertiert RGB in Graustufen in C

Getestet habe ich bereits die folgenden Formeln:

gray = (int)(0.299 * r + 0.587 * g + 0.144 * b); 

gray = (int)(0.299 * r + 0.587 * g + 0.114 * b); 

gray = (int)(0.2126 * r + 0.7152 * g + 0.0722 * b); 

gray = (int) (0.35*r + 0.50*g + 0.15*b); 

gray = ((r * 61) + (g * 174) + (b * 21))/256; 

gray = (int)((4897 * r + 9617 * g + 1868 * b) >> 14); 

gray = r; if(g > gray) gray = g; if(b > gray) gray = b; 
+0

Ich glaube nicht, dass das wirklich hier auf-Thema ist, da es sich um eine (subjektive) Grafik Frage ist eher als eine Programmierfrage. Das heißt, GIMP ist Open-Source, also hast du darüber nachgedacht, was es macht? – Useless

+0

Kannst du 'libgimp' nicht einfach für dich verwenden? – teppic

+0

Da das Auge ein Maximum an Empfindlichkeit bei Grün hat, scheint es wie erste oder vierte Formel richtig zu sein. –

Antwort

12

Um RGB korrekt zu konvertieren, in Graustufen Sie das Gamma in den linearen Farbraum korrigiert R-, G- und B-Werte umwandeln sollen, gilt die Umwandlung in der linearer Raum und wendet dann eine Gammakorrektur auf das Ergebnis an.

Der sRGB Farbraum hat eine Transformation, die nur eine Gammakurve approximiert. Siehe den Artikel Wikipedia für die Einzelheiten. Wikipedia hat auch eine spezifische section zum Thema sRGB zu Graustufen.

Grundsätzlich ist ein sRGB Komponente lineares Format zu konvertieren:

double sRGB_to_linear(double x) { 
    if (x < 0.04045) return x/12.92; 
    return pow((x+0.055)/1.055, 2.4); 
} 

Dann sRGB zu konvertieren Graustufen linear:

double R_linear = sRGB_to_linear(R/255.0); 
double G_linear = sRGB_to_linear(G/255.0); 
double B_linear = sRGB_to_linear(B/255.0); 
double gray_linear = 0.2126 * R_linear + 0.7152 * G_linear + 0.0722 * B_linear; 

Dann gelten die sRGB Gammakorrektur wieder:

double linear_to_sRGB(double y) { 
    if (y <= 0.0031308) return 12.92 * y; 
    return 1.055 * pow(y, 1/2.4) - 0.055; 
} 

Ie

double gray_color = round(linear_to_sRGB(gray_linear) * 255); 
+0

Können Sie mir eine Referenz oder Gleichung geben? – user2000255

+0

Ich fand die mathematische Gleichung von der Wikipedia-Site unter der Converting-Farbe in Graustufentitel. Aber ich verstehe nicht, was es bedeutet. Danke. – user2000255

+1

Diese Koeffizienten (0.2126, 0.7152 und 0.0722) stammen ursprünglich aus der linear-RGB -> XYZ-Raumtransformationsmatrix (die mittlere Zeile der Matrix, die das Y berechnet). Der resultierende "Intensitäts" -Wert ist eigentlich der Y-Wert vom XYZ-Vektor. https: // de.wikipedia.org/wiki/SRGB#The_reverse_transformation –

2

Es gibt a GIMP tutorial, die verschiedenen Möglichkeiten beschrieben, die von The GIMP ein Farbbild umwandeln in Graustufen. Eine Methode ist eine gewichtete Entsättigung, wie Sie es bereits versucht haben, und der Artikel gibt einige Gewichte, die verwendet werden können, um die Konvertierung von GIMP zu approximieren.

Die gegl Bibliothek GIMP, die die Grundlage für alle seine Bildoperationen, hat a rather elaborate mechanism for converting color to greyscale, die die Farbe der benachbarten Pixel berücksichtigt und verwendet einen iterativen Ansatz, der den Prozess der Entwicklung Schwarzweißfotos zu emulieren scheint.

0

Die gimp help for the desaturate tool gibt drei verfügbare Formeln an, die den Optionen "Lighness", "Luminosity" und "Average" entsprechen. Diejenigen wäre:

Leichtigkeit: 0.5 * (max(R,G,B) + min(R,G,B))

Leuchtstärke: (0.21 * R) + (0.72 * G) + (0.07 * B)

Durchschnitt: (R + G + B)/3

Verwandte Themen