W celu prawidłowej konwersji RGB do skali szarości, należy przekształcić gamma poprawione R, G i wartości B w liniowej przestrzeni kolorów, zastosować konwersję w przestrzeni liniowej, a następnie zastosuj korektę gamma do wyniku.
Przestrzeń kolorów zawiera transformację, która jest tylko przybliżeniem krzywej gamma. Szczegółowe informacje można znaleźć w artykule Wikipedia. Wikipedia ma również specyficzne section na temat sRGB do skali szarości.
Zasadniczo, w celu przekształcenia składnika sRGB do formatu liniowego:
double sRGB_to_linear(double x) {
if (x < 0.04045) return x/12.92;
return pow((x+0.055)/1.055, 2.4);
}
Następnie przekonwertować sRGB liniowego skali szarości: znowu
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;
Następnie zastosować korekcję gamma sRGB:
double linear_to_sRGB(double y) {
if (y <= 0.0031308) return 12.92 * y;
return 1.055 * pow(y, 1/2.4) - 0.055;
}
Tzn.
double gray_color = round(linear_to_sRGB(gray_linear) * 255);
I nie sądzę, że to jest naprawdę na temat tutaj, ponieważ jest to kwestia (subiektywne) grafika raczej niż pytanie programistyczne. To powiedziawszy, GIMP jest open-source, więc zastanawiałeś się po prostu patrząc na to, co robi? – Useless
Nie możesz po prostu użyć 'libgimp', aby zrobić to za Ciebie? – teppic
Ponieważ oko ma maksymalną czułość na zielono, wydaje się, że pierwsza lub czwarta formuła jest prawidłowa. –