Ответ от nickf, хотя и довольно распространенный, неправильный. (Извините, Ник.) Для начала это цифры яркости для NTSC RGB, а не sRGB, которые используются компьютерными изображениями. Правильные числа - 0,21, 0,72, 0,07. Во-вторых, весовые коэффициенты должны быть применены к значениям RGB без гамма-коррекции, затем гамма-коррекция применяется повторно. Гамма для sRGB составляет примерно 2,2. Точно, это составная функция, которая приближает возведение в степень на 1 / 2.2. Вот это в C ++. (Я не говорю на php. Извините, вам нужно будет перевести.)
// sRGB luminance(Y) values
const double rY = 0.212655;
const double gY = 0.715158;
const double bY = 0.072187;
// Inverse of sRGB "gamma" function. (approx 2.2)
double inv_gam_sRGB(int ic) {
double c = ic/255.0;
if ( c <= 0.04045 )
return c/12.92;
else
return pow(((c+0.055)/(1.055)),2.4);
}
// sRGB "gamma" function (approx 2.2)
int gam_sRGB(double v) {
if(v<=0.0031308)
v *= 12.92;
else
v = 1.055*pow(v,1.0/2.4)-0.055;
return int(v*255+.5);
}
// GRAY VALUE
int gray(int r, int g, int b) {
return gam_sRGB(
rY*inv_gam_sRGB(r) +
gY*inv_gam_sRGB(g) +
bY*inv_gam_sRGB(b)
);
}