Converter RGB em tons de cinza / intensidade

Ao converter de RGB para escala de cinza, diz-se que pesos específicos para os canais R, G e B devem ser aplicados. Esses pesos são: 0,2989, 0,5870, 0,1140.

Diz-se que a razão para isso é diferente percepção / sensibilidade humana em relação a essas três colors. Às vezes também se diz que estes são os valores usados ​​para calcular o sinal NTSC.

No entanto, não encontrei uma boa referência para isso na web. Qual é a fonte desses valores?

Veja também estas perguntas anteriores: aqui e aqui .

   

Os números específicos da questão são do CCIR 601 (veja o link da Wikipedia abaixo).

Se você converter RGB -> escala de cinza com números / methods diferentes ligeiramente diferentes, você não verá muita diferença em uma canvas normal de computador sob condições normais de iluminação – experimente.

Aqui estão mais alguns links sobre colors em geral:

Wikipedia Luma

O excelente site de Bruce Lindbloom

capítulo 4 sobre cor no livro de Colin Ware, “Information Visualization”, isbn 1-55860-819-2; esse link longo para o Ware em books.google.com pode ou não funcionar

cambridgeincolor : excelentes, bem escritos “tutoriais sobre como adquirir, interpretar e processar fotografias digitais usando uma abordagem visualmente orientada que enfatiza o conceito sobre o procedimento”

Se você topar com RGB “linear” versus “não linear”, aqui está parte de uma nota antiga para mim sobre isso. Repita, na prática você não verá muita diferença.


RGB -> ^ gamma -> Y -> L *

Na ciência da cor, os valores RGB comuns, como em html rgb (10%, 20%, 30%), são chamados de “não-lineares” ou corrigidos por Gama . Valores “Lineares” são definidos como

Rlin = R^gamma, Glin = G^gamma, Blin = B^gamma 

onde gama é 2.2 para muitos PCs. O habitual RGB às vezes é escrito como R ‘G’ B ‘(R’ = Rlin ^ (1 / gama)) (puristas clique de língua) mas aqui eu vou largar o ‘.

O brilho em um monitor CRT é proporcional ao RGBlin = RGB ^ gama, portanto, 50% de cinza em um CRT é bastante escuro: 0,5 ^ 2,2 = 22% de brilho máximo. (Os ecrãs LCD são mais complexos; além disso, algumas placas gráficas compensam a gama.)

Para obter a medida da luminosidade chamada L* do RGB, primeiro divida o RGB por 255 e calcule

 Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma 

Este é Y no espaço de colors XYZ; é uma medida da cor “luminância”. (As fórmulas reais não são exatamente x ^ gamma, mas fecham; fique com x ^ gamma para uma primeira passagem.)

Finalmente, L * = 116 * Y ^ 1/3 – 16 “… aspira a uniformidade perceptual … combina de perto com a percepção humana de leveza.” – Espaço de colors do Laboratório da Wikipédia

Eu achei que esta publicação referenciada em uma resposta a uma pergunta semelhante anterior. É muito útil:

http://cadik.posvete.cz/color_to_gray_evaluation/

Ele mostra ‘toneladas’ de diferentes methods para gerar imagens em tons de cinza com diferentes resultados!

Heres algum código em c para converter rgb em escala de cinza. A ponderação real usada para a conversão de rgb para escala de cinza é de 0,3R + 0,6G + 0,11B. esses pesos não são absolutamente críticos, então você pode brincar com eles. Eu os fiz 0.25R + 0.5G + 0.25B. Produz uma imagem ligeiramente mais escura.

OBSERVAÇÃO: O código a seguir assume o formato de pixel xRGB de 32 bits

 unsigned int *pntrBWImage=(unsigned int*)..data pointer..; //assumes 4*width*height bytes with 32 bits ie 4 bytes per pixel unsigned int fourBytes; unsigned char r,g,b; for (int index=0;index>16); g=(fourBytes>>8); b=fourBytes; I_Out[index] = (r >>2)+ (g>>1) + (b>>2); //This runs in 0.00065s on my pc and produces slightly darker results //I_Out[index]=((unsigned int)(r+g+b))/3; //This runs in 0.0011s on my pc and produces a pure average } 

Confira as perguntas frequentes sobre colors para obter informações sobre isso. Esses valores vêm da padronização dos valores RGB que usamos em nossos monitores. Na verdade, de acordo com a FAQ de colors, os valores que você está usando estão desatualizados, pois são os valores usados ​​para o padrão NTSC original e não os monitores modernos.

Aqui está um artigo sobre como esses números (ou similares) foram derivados:

https://web.archive.org/web/20160303201512/http://www.cis.rit.edu/mcsl/research/broadbent/CIE1931_RGB.pdf

Esses valores variam de pessoa para pessoa, especialmente para pessoas daltônicas.

é tudo isso realmente necessário, a percepção humana e CRT vs LCD irá variar, mas a intensidade do RGB não, por que não L = (R + G + B)/3 e defina o novo RGB para L, L, L?