A resposta "Aceita" está incorreta e incompleta
As únicas respostas precisas são as respostas @ jive-dadson e @EddingtonsMonkey , e no suporte @ nils-pipenbrinck . As outras respostas (incluindo as aceitas) estão vinculando ou citando fontes erradas, irrelevantes, obsoletas ou quebradas.
Resumidamente:
- O sRGB deve ser LINEARIZADO antes de aplicar os coeficientes.
- A luminância (L ou Y) é linear e a luz.
- A leveza percebida (L *) não é linear, assim como a percepção humana.
- HSV e HSL não são nem remotamente precisos em termos de percepção.
- O padrão IEC para sRGB especifica um limite de 0,04045, NÃO é 0,03928 (que era de um rascunho inicial obsoleto).
- Para serem úteis (isto é, relativas à percepção) , as distâncias euclidianas requerem um espaço vetorial cartesiano perceptivamente uniforme, como o CIELAB. O sRGB não é um deles.
A seguir, uma resposta correta e completa:
Como esse tópico aparece muito nos mecanismos de pesquisa, estou adicionando esta resposta para esclarecer os vários equívocos sobre o assunto.
O brilho é um atributo perceptivo, não possui uma medida direta.
A luminosidade percebida é medida por alguns modelos de visão como CIELAB, aqui L * (Lstar) é uma medida da luminosidade perceptiva e não é linear para aproximar a curva de resposta não linear da visão humana.
A luminância é uma medida linear da luz, ponderada espectralmente para a visão normal, mas não ajustada para a percepção não linear da luminosidade.
Luma ( Y´ prime) é um sinal ponderado e codificado por gama usado em algumas codificações de vídeo. Não deve ser confundido com luminância linear.
A curva gama ou transferência (TRC) é uma curva que geralmente é semelhante à curva perceptiva e é comumente aplicada a dados de imagem para armazenamento ou transmissão, a fim de reduzir o ruído percebido e / ou melhorar a utilização dos dados (e razões relacionadas).
Para determinar a luminosidade percebida , primeiro converta os valores da imagem R´G´B´ codificados por gama em luminância linear ( L
ou Y
) e depois em luminosidade percebida não linear ( L*
)
PARA ENCONTRAR A LUMINÂNCIA:
... Porque aparentemente estava perdido em algum lugar ...
Passo um:
Converta todos os valores inteiros sRGB de 8 bits em decimal 0,0-1,0
vR = sR / 255;
vG = sG / 255;
vB = sB / 255;
Passo dois:
Converta um RGB codificado em gama em um valor linear. O sRGB (padrão do computador), por exemplo, requer uma curva de potência de aproximadamente V ^ 2,2, embora a transformação "precisa" seja:
Onde V 'é o canal R, G ou B codificado por gama de sRGB.
Pseudo-código:
function sRGBtoLin(colorChannel) {
// Send this function a decimal sRGB gamma encoded color value
// between 0.0 and 1.0, and it returns a linearized value.
if ( colorChannel <= 0.04045 ) {
return colorChannel / 12.92;
} else {
return pow((( colorChannel + 0.055)/1.055),2.4));
}
}
Passo três:
Para encontrar a luminância (Y), aplique os coeficientes padrão para sRGB:
Pseudocódigo usando as funções acima:
Y = (0.2126 * sRGBtoLin(vR) + 0.7152 * sRGBtoLin(vG) + 0.0722 * sRGBtoLin(vB))
PARA ENCONTRAR LEVEZA PERCEBIDA:
Etapa quatro:
Pegue a luminância Y de cima e transforme em L *
Pseudo-código:
function YtoLstar(Y) {
// Send this function a luminance value between 0.0 and 1.0,
// and it returns L* which is "perceptual lightness"
if ( Y <= (216/24389) { // The CIE standard states 0.008856 but 216/24389 is the intent for 0.008856451679036
return Y * (24389/27); // The CIE standard states 903.3, but 24389/27 is the intent, making 903.296296296296296
} else {
return pow(Y,(1/3)) * 116 - 16;
}
}
L * é um valor de 0 (preto) a 100 (branco), em que 50 é o "cinza do meio" perceptivo. L * = 50 é o equivalente de Y = 18,4, ou seja, um cartão cinza de 18%, representando o meio de uma exposição fotográfica (zona V de Ansel Adams).
Referências:
IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
Perguntas frequentes sobre a gama de Charles Poynton