Al fine di convertire correttamente RGB in scala di grigio, si dovrebbe trasformare la gamma corretta valori B R, G e nello spazio colore lineare, applicare la conversione nel spazio lineare e quindi applicare una correzione gamma al risultato.
Lo spazio di colori sRGB ha una trasformazione che si avvicina solo a una curva gamma. Vedere l'articolo Wikipedia per i dettagli. Wikipedia ha anche uno specifico section in materia di sRGB in scala di grigi.
Fondamentalmente, per convertire un componente sRGB formato lineare:
double sRGB_to_linear(double x) {
if (x < 0.04045) return x/12.92;
return pow((x+0.055)/1.055, 2.4);
}
Poi, per convertire sRGB a lineare in scala di grigi:
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;
Quindi, applicare la correzione gamma sRGB ancora:
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);
Non credo che questo è davvero in argomento qui, dal momento che è una domanda (soggettive) grafica piuttosto di una domanda di programmazione. Detto questo, GIMP è open-source, quindi hai pensato solo a quello che fa? – Useless
Non puoi semplicemente usare 'libgimp' per farlo per te? – teppic
Poiché l'occhio ha una sensibilità massima al verde, sembra che sia la prima o la quarta formula a destra. –