1 pontos por GN⁺ 2024-07-28 | 1 comentários | Compartilhar no WhatsApp
  • O contorno em forma de ferradura do diagrama de cromaticidade xy CIE 1931 não vem de uma fórmula arbitrária, mas das funções de igualação de cor obtidas ao medir como os humanos percebem relativamente a luz vermelha, verde e azul
  • Os dados CIE RGB são resultados de experimentos que ajustavam fontes de luz de 700nm, 546nm e 435nm para igualar cores espectrais, e os valores negativos em alguns comprimentos de onda mostram que há cores que não podem ser reproduzidas apenas com RGB puro
  • O espaço de cor XYZ é um padrão que aplica uma transformação linear ao RGB para facilitar o tratamento de todos os valores como positivos, projetando valores 3D em coordenadas de cromaticidade 2D com x = X/(X+Y+Z) e y = Y/(X+Y+Z)
  • As cores no interior do diagrama podem ser aproximadas não calculando diretamente a partir de x, y, mas criando várias formas de linha espectral, multiplicando-as pelas funções de igualação de cor, integrando o resultado e então marcando as coordenadas xy
  • Como telas reais estão limitadas a espaços de cor de exibição como sRGB ou display-p3, muitas cores perto da borda não podem ser mostradas com precisão, causando clipping ou saturação de canais

O ponto de partida do diagrama em forma de ferradura

  • Ao estudar o espaço de cor CIE 1931 XYZ, o diagrama de cromaticidade que aparece repetidamente é um gráfico que representa a qualidade da cor separadamente do brilho
  • A borda está ligada a cores espectrais de comprimentos de onda específicos, mas a forma geral e as cores internas não são explicadas por uma fórmula simples do tipo x = func(y)
  • A forma central vem de como os humanos percebem vermelho, verde e azul em relação entre si, e as cores internas podem ser renderizadas em uma imagem 2D com a matemática da mistura de cores e amostragem de pontos

Funções de igualação de cor e CIE RGB

  • As funções de igualação de cor mostram quanto é preciso ajustar a intensidade de fontes de luz vermelha, verde e azul para fazer uma cor-alvo de determinado comprimento de onda parecer igual ao olho humano
  • As funções de igualação de cor RGB da CIE 1931 usam como referência fontes de luz vermelha, verde e azul em 700nm, 546nm e 435nm, respectivamente
  • O experimento era feito colocando uma fonte de luz da cor-alvo de um lado e, do outro, fontes RGB ajustadas diretamente por uma pessoa até combinar com a cor-alvo
  • Nesses dados aparecem valores como vermelho negativo
    • Uma fonte de luz negativa não pode existir fisicamente
    • Isso significa que algumas cores espectrais não podem ser reproduzidas apenas com fontes RGB puras
    • Ainda assim, após transformações, esses dados continuam úteis para cálculos em espaços de cor

Espaço de cor XYZ e coordenadas de cromaticidade xy

  • O espaço de cor XYZ é uma transformação linear do espaço de cor RGB por matriz, mais próximo de uma reorganização da mesma informação em outro sistema de coordenadas mais fácil de calcular
  • Usando a matriz de transformação RGB da Wikipedia, é possível comparar os dados das funções de igualação de cor XYZ com o gráfico RGB
matrix = [
  2.364613,  -0.89654, -0.468073,
 -0.515166,  1.426408, 0.088758,
  0.005203, -0.014408, 1.009204
]

[R, G, B] = matrix * [X, Y, Z]
  • O XYZ pode ser usado como um espaço padrão para descrever todas as cores, incluindo cores que um dispositivo de exibição não consegue produzir diretamente
    • Cada dispositivo precisa interpretar esses valores dentro do espaço de cor que ele consegue exibir fisicamente
    • À medida que a gama do dispositivo aumenta, mais cores podem ser representadas com a mesma informação de cor
  • As coordenadas de cromaticidade xy são calculadas dividindo os valores XYZ pela soma total
const x = X / (X + Y + Z)
const y = Y / (X + Y + Z)
const z = Z / (X + Y + Z) = 1 - x - y
  • Como z pode ser derivado de x e y, ele normalmente é omitido no diagrama de cromaticidade xy
  • Para voltar de xy para XYZ, é necessário o valor de Y; a representação que o inclui é o espaço de cor xyY

Por que parece uma ferradura

  • Ao projetar os dados das funções de igualação de cor RGB em xy, começa a surgir o contorno familiar do diagrama de cromaticidade
  • Como os dados RGB incluem cores impossíveis, a região negativa do eixo x aparece, e após a transformação para XYZ a forma se aproxima do formato de ferradura mais conhecido
  • Mesmo renderizando diretamente em xy os dados tabulados das funções de igualação de cor XYZ, a mesma forma aparece
  • A forma é derivada diretamente das curvas das funções de igualação de cor XYZ
    • Para cada comprimento de onda, calcula-se a proporção de X, Y e Z no total
    • Marcando pontos segundo essas proporções, surge a borda da cromaticidade
  • Se o mesmo procedimento for aplicado a funções de igualação de cor arbitrárias, surgirão formas completamente diferentes; portanto, a ferradura real é o resultado de funções derivadas de experimentos com a visão humana

Um método aproximado para preencher as cores internas

  • Só as coordenadas x, y não bastam para saber imediatamente se um ponto corresponde a uma cor válida nem qual cor deve ser aproximada ali
  • Em vez disso, é possível criar um valor XYZ arbitrário ou um espectro, convertê-lo para coordenadas xy e então marcá-lo no gráfico
  • O ponto central é gerar formas de linha espectral
    • Cria-se uma linha ao longo de todo o eixo de comprimentos de onda indicando quanto cada comprimento de onda contribui para a cor
    • Multiplica-se essa linha pelas funções de igualação de cor XYZ e integra-se o resultado para obter o valor XYZ final
    • Da mesma forma, multiplica-se pelas funções de igualação de cor RGB e integra-se para obter valores RGB
    • O valor XYZ obtido é convertido em xy e marcado no diagrama de cromaticidade
  • Alterando o deslocamento e a largura de duas curvas senoidais, surgem diferentes linhas espectrais, e com isso diferentes cores e coordenadas aparecem no gráfico
  • A demonstração automatizada varia deslocamento e largura para percorrer o espaço de forma mais ampla, mas não preenche completamente todo o espaço de cor
  • Há uma demonstração no CodePen para experimentar diretamente

Exibição em tela e limitações do espaço de cor

  • Para mostrar na tela os valores XYZ calculados, é preciso convertê-los para um espaço de renderização real, como sRGB
  • Como o rgb() do navegador assume sRGB, é preciso considerar a correção de gama ao converter XYZ para RGB
  • display-p3 é um espaço de cor com gama mais ampla que sRGB, compatível com muitos navegadores e telas
  • Em CSS, cores em display-p3 podem ser definidas no formato color(display-p3 r, g, b)
  • O espaço de cor p3 no navegador também usa a mesma correção de gama do sRGB, então isso deve ser incluído para que a cor seja renderizada corretamente
  • Em navegadores e telas wide gamut é possível ver cores mais intensas, mas só com esse experimento não dá para determinar com certeza como p3 é transmitido em capturas de tela ou no compartilhamento de tela do Zoom, nem como é convertido para sRGB

Por que as cores não são totalmente precisas

  • Se as cores internas forem obtidas convertendo diretamente valores XYZ com XYZ_to_sRGB, muitas acabam saindo da faixa 0~255 e o resultado fica excessivamente saturado
  • Em vez de obter a cor diretamente de XYZ, integrar linhas espectrais multiplicadas pelas funções de igualação de cor RGB parece produzir uma interpolação melhor
  • Ainda assim, uma parte considerável das cores geradas continua sendo de valores RGB inválidos
  • Se as cores fora da faixa 0~255 não forem renderizadas, resta apenas o triângulo sRGB familiar
  • As cores fora do triângulo não podem ser exibidas com precisão, mas quando apenas 1 ou 2 canais RGB ficam saturados, ainda é possível perceber alguma diferença de cor por meio da variação nos canais restantes

Materiais relacionados

1 comentários

 
GN⁺ 2024-07-28
Opiniões no Hacker News
  • A forma mais comum de representar a cromaticidade em uma grade de coordenadas cartesianas é bastante enganosa. Diagramas de cromaticidade usam coordenadas baricêntricas, e a forma estranhamente distorcida do diagrama de cromaticidade XYZ comum parece ser mais uma distorção causada pelo modo de desenhar do que uma propriedade real dos dados.
    É mais natural ver o diagrama de cromaticidade como uma seção plana bidimensional que passa pelos três vetores unitários padrão em um espaço de cor tridimensional, e uma figura em triângulo equilátero como [1] mostra bem esse ponto. Também fica mais claro que a gama completa no espaço XYZ não é uma forma arbitrariamente deformada, mas foi escolhida deliberadamente para preencher razoavelmente bem o octante positivo dentro das limitações da visão humana.
    [1]: https://physics.stackexchange.com/questions/777501/why-is-th...

    • O diagrama de cromaticidade CIE 1976 u'v' foi distorcido de propósito para ser perceptualmente mais uniforme, e pode ser uma representação melhor, no geral, do que o diagrama xy ou a figura em triângulo equilátero.
      Como os próprios eixos X, Y e Z são até certo ponto arbitrários, é difícil dizer que desenhar xy dentro de um triângulo equilátero seja inerentemente mais correto do que desenhá-lo dentro de um triângulo retângulo isósceles. Usar coordenadas mais próximas das respostas dos cones poderia ser conceitualmente mais claro, mas esse tipo de figura 2D acaba podendo induzir ao erro quem não entende profundamente como a visão funciona e o que o gráfico significa.
    • Há um vídeo que demonstra esse conceito. Cada frame mostra as cores permitidas para um determinado brilho no espaço Rec. 709 YCbCr.
      https://www.w6rz.net/chromacity.mp4
    • Exato. Mas o diagrama de cromaticidade não é uma seção de corte do espaço de cor; ele é mais parecido com uma projeção central da origem para o plano X+Y+Z=1.
  • Essa versão específica do diagrama de cromaticidade faz as cores ausentes nos displays parecerem vários tipos de verde de ponteiro laser. Na prática, também há muitos vermelhos e azuis ausentes por causa de primárias vermelhas e azuis muito saturadas, que são escuras demais por unidade de energia para serem utilizáveis.
    Referência: https://nanosys.com/blog-archive/2012/08/14/color-space-conf...
    Aprendi mais sobre gerenciamento de cores do que gostaria enquanto fazia imagens estereoscópicas vermelho-ciano. Pedi vermelho sRGB, mas em um monitor de ampla gama ele saía com algo como (180,16,16), o que aumentava muito a interferência entre canais. Agora estou trabalhando com uma amiga costureira em tecido com estampa personalizada, e o amarelo do padrão floral de algum modo vira laranja no processamento, então estamos tentando terminar a depuração e a calibração antes de fazer o pedido. Continuo aprendendo demais sobre gerenciamento de cores.

    • É por isso que a Pantone ganha tanto dinheiro.
    • Dito de outro modo, isso quer dizer que o diagrama de cromaticidade poderia se estender mais para o sudeste? Ou seja, fico me perguntando se, no espaço de cor XYZ, as funções de ativação X e Z poderiam ser estendidas mais para a esquerda e para a direita, mas, por causa das frequências em que a linha espectral continua, essa região acabaria sendo ocupada principalmente por infravermelho e ultravioleta, que não conseguimos ver.
    • O texto linkado diz que a área colorida marcada como “visible region” representa as cores que humanos conseguem ver, e que a área sem cor representa estímulos dos cones fisicamente impossíveis.
      Mas a percepção visual vai muito além do que os cones do olho conseguem ver fisicamente. Por trás deles há o cérebro inteiro tentando interpretar fenômenos do nervo óptico. Como estímulos cerebrais interessantes, vale procurar por cores quiméricas, que os cones não conseguem detectar fisicamente, mas que conseguimos ver. Por exemplo, azul estígio, vermelho autoluminoso e laranja hiperbólico.
      †: https://www.perplexity.ai/search/please-provide-chimerical-c...
      W: https://en.wikipedia.org/wiki/Impossible_color
    • Se você está trabalhando com tecido de impressão personalizada, quase certamente precisa trabalhar no perfil de espaço de cor CMYK/SWOPv2 do fornecedor para que as cores saiam corretamente. Vale perguntar a eles. RGB saturado não converte bem. Uma alternativa é reduzir a saturação do amarelo para que ele fique levemente acinzentado.
      Ex.: https://ctnbee.com/en/upload
  • Há outra exploração interessante sobre espaços de cor: https://ericportis.com/posts/2024/okay-color-spaces/

    • Esta é melhor. É bem estranho que o link original não trate de Lab e OKLab.
      Para quem acha que roxo/magenta não são cores “reais”, eu diria que, em comprimentos de onda curtos, o X vermelho diminui mais lentamente que o Z azul, então é possível obter uma cor roxa/magenta saturada de comprimento de onda único e alta potência abaixo de 400 nm. Ela não é bem representada nos gráficos de cromaticidade padrão, não é eficiente para monitores e, assim como até o azul, é perigosa se observada por muito tempo. Se você vir um laser roxo/magenta de comprimento de onda único, deve virar a cabeça ou fechar os olhos.
  • Excelente. Isso me deu uma ideia sobre cor, percepção e gama de cores.
    Em resumo, imagine que certa combinação de comprimentos de onda de luz faça você perceber o cheiro de queijo curado, e outra combinação faça você achar que há um urso atrás de você. Nesse caso, o gráfico teria que incluir não só pixels coloridos, mas também pequenos desenhos de queijo e de urso nos pontos em que essas percepções específicas ocorrem.
    Acho que, na prática, magenta é algo assim. É uma cor que não existe no espectro, e parece mais uma sensação ou percepção que o cérebro faz você perceber simplesmente como mais uma cor para não ficar sobrecarregado demais. Também acho que isso se aproxima de explicar um fenômeno real em pessoas com graus variados de sinestesia — pessoas no espectro da sinestesia, se me permitem o trocadilho.

    • Não entendo por que o cérebro ficaria “sobrecarregado” por causa de cores não espectrais. Será que você sabe que, na natureza, praticamente não existem cores espectrais?
  • Começar pelo XYZ pode até fazer sentido, mas hoje já existem espaços de cor muito melhores, que correspondem melhor à nossa visão. Exemplos representativos são o CIE 1976 L',u',v' e, mais recentemente, o ICtCp das pesquisas da Dolby

    • O espaço de cor xyY foi projetado para que a cor da luz obtida ao misturar dois pontos fique sobre a linha reta entre os dois pontos correspondentes. Por isso ele é muito útil para descobrir quais cores podem ser produzidas com um determinado conjunto de cores primárias
      Da mesma forma, se você desenhar as cores correspondentes a comprimentos de onda puros e tomar o fecho convexo, obtém todo o espaço de cores fisicamente possível. Essa característica é difícil de reproduzir corretamente em outros espaços de cor; no máximo, algo como uma transformação linear é possível. XYZ já é esse tipo de transformação e tem praticamente todas as propriedades desejáveis para a escolha de uma base
    • Acho que não é uma boa ideia começar por XYZ e pelas funções de correspondência de cor. LMS e as funções de resposta dos cones explicam a resposta humana à cor de forma mais fundamental e intuitiva; então, se for mesmo tratar de XYZ, é melhor partir do LMS a partir de primeiros princípios e chegar até ele
    • Depois de passar por XYZ, também vale olhar o XYB usado no JPEG XL e no jpegli
      https://giannirosato.com/blog/post/jpegli-xyb/
    • CAM-16. Se ficar confuso, pergunte a um cientista de cores
  • Fico curioso para saber se existe um espaço de cor “educacional”, otimizado para ensino e aprendizado. Algo que priorize a precisão em vez de matemática simples, e em que as características visíveis sejam características reais da percepção humana, não “artefatos do modelo”
    Seria bom que ele cobrisse toda a gama de cores, funcionasse bem até no locus espectral, e que matiz e mistura de cores fossem razoavelmente lineares. Algo parecido com o espaço que o Munsell ocupava, mas cobrindo toda a gama e no estilo do século XXI. Em um projeto paralelo com a ideia de “será que enfatizar o espectro ajudaria a ensinar cores melhor?”, não encontrei nem algo próximo, então montei uma solução provisória. Usei CAM16UCS como candidato moderno a espaço perceptual de cores, desfiz a torção do matiz linear com Jzazbz, também fiz uma sanity check de luminância absoluta, e achatei de forma bastante pouco principiada uma cauda azul estranha perto do locus, que entendi como algo não perceptual do CAM. A implementação foi com uma lookup table. Gostaria de ouvir se houver trabalhos relacionados

    • Cam16 é baseado em percepção, ao contrário do cam16 ucs. Ele calcula croma, luminosidade e matiz, e se baseia no sistema de cores de Munsell
      Hellwig e Fairchild simplificaram matematicamente o modelo recentemente, melhorando a precisão do croma (http://markfairchild.org/PDFs/PAP45.pdf). Um modelo mais simples é o CIELAB, que retorna os parâmetros L, a, b. Aqui, L é a luminosidade, hypot(a,b) é o croma e arctan2(b,a) é o matiz
    • Ao falar de cores com alunos, o espaço HSL foi o mais fácil de usar. Ouvi dizer que, do ponto de vista da matemática de cores, ele é bem bagunçado, e que esse também foi um dos motivos pelos quais a Adobe deixou de usá-lo no Photoshop 3. Mas, do ponto de vista perceptual, é a forma de que os artistas gostam
      Uma opção melhor talvez seja o espaço de cor de Munsell. Munsell dividiu todo o espaço de cores em milhares de pequenos pedaços, e a distância entre cada pedaço era uma unidade de “diferença apenas perceptível”, determinada por testes cuidadosos com usuários. Por isso, a região dos verdes era muito maior do que a dos amarelos. O processo de desenvolvimento desse espaço de cor também é muito interessante; ele era pintor, mas seu trabalho abriu caminho para espaços de cor mais modernos
  • Uma “fonte de luz vermelha negativa” significa que o participante girou o dial que adicionava luz vermelha à cor que estava tentando igualar
    Basicamente, há uma cor desconhecida C e uma cor R+G+B. Às vezes não dá para igualar, então tenta-se fazer C+R = G+B. Nesse caso, como R é acrescentado ao outro lado da equação, surge um R “negativo”. O mesmo acontece com verde e azul, mas em menor grau

  • Em geral está certo, mas na última seção não entendi bem a parte em que o autor gera espectros com dois picos e os projeta no diagrama de cromaticidade para preencher o interior do locus. Não sei por que fazer isso
    Acho que a forma de fazer deveria ser esta. Primeiro, escolha um valor de Y como luminância do gráfico e, para cada pixel dentro da área delimitada pelo locus espectral e pela linha roxa, pegue as coordenadas x, y. Esses três valores especificam uma cor no espaço CIE xyY, e a conversão de xyY para XYZ é simples: X = Y / y * x, Y = Y, Z = Y / y * (1 - x - y). Depois, mapeie os valores XYZ para o espaço de cor da imagem de saída, por exemplo sRGB. Se um determinado valor XYZ ficar fora do intervalo [0,1] do sRGB, ele está fora da gama sRGB, então basta recortá-lo para o valor válido mais próximo dentro da gama

    • Sou o autor. Eu não entendi como fazer isso funcionar, e falei disso no texto. Esta demo faz dessa maneira: https://jlongster.com/why-chromaticity-shape#block-31f373
      O problema é “cada pixel dentro da área”. Eu até poderia ter feito isso e depois recortado a saída nesse formato, mas isso significaria recortar a saída usando o próprio formato, sem responder de modo algum por que o formato é aquele. Parecia falso. Dito isso, parece que esse é o método mais comum. Tentei entender uma abordagem mais rigorosa, e o método de gerar espectros para preencher está descrito aqui: https://clarkvision.com/articles/color-cie-chromaticity-and-...
      Essa parece uma abordagem mais rigorosa, mas o clipping provavelmente também pode ser “bom o bastante”
  • Tenho uma pergunta para quem entende bem de ciência das cores. Estou lendo os dados brutos de Guild https://royalsocietypublishing.org/doi/pdf/10.1098/rsta.1932... e está difícil entender o que significam os números da Tabela 4
    Gostaria de saber se alguém entende todas as colunas ali. Em especial, estou procurando os coeficientes não normalizados vindos dos experimentos de correspondência de cor, ou uma forma de desfazer a normalização desses coeficientes. Os coeficientes de que falo são os coeficientes tricromáticos u{a,b,c}_\lambda da Tabela 3. Nem sei se esses dados estão na Tabela 4, então talvez sejam duas perguntas diferentes

  • Acho que a explicação é simples. Cor é luz, e é algo linear que vai do ultravioleta ao azul, verde, amarelo, vermelho e infravermelho. É apenas uma linha
    Na realidade física, a luz violeta não existe. Quando os olhos recebem luz vermelha e azul ao mesmo tempo, a mente cria todos os tons de violeta e magenta entre o azul e o vermelho. Por isso, para incluir o magenta, é preciso traçar mais uma linha entre o azul e o vermelho. Ou seja, é preciso curvar a linha das cores reais, e é isso que vemos no diagrama de cromaticidade

    • Optei por uma explicação que separa fortemente “cor” e “luz”. Em um projeto paralelo do tipo “será que dá para ensinar melhor as cores enfatizando o espectro?”, tentei distinguir a luz física do mundo das cores percebidas pelo sistema nervoso
      Por isso escrevi luz “vermelha”, e não luz vermelha. Emparelhei o espectro físico, em escala de cinza nos eixos de nm e energia, com o espectro perceptivo, em cores de ângulo de matiz e luminância. Ambos podem ser enrolados em um espaço tridimensional de cor perceptiva, e também é possível interpolar o espectro físico de nm para matiz. Ou ainda dispô-lo ao longo de um espaço dicromático bidimensional de mamíferos não primatas, para enfatizar a dependência do sistema nervoso. Os equívocos sobre cor são tão difundidos, do jardim de infância à pós-graduação, que ajuda ser extremamente cuidadoso em nome da clareza
    • O equívoco mais comum sobre cor é considerá-la uma propriedade fora do observador. A cor está na mente
      Na óptica, aquilo a que se aludiu como “realidade física”, não há cor alguma. A mente cria todas as cores. Atribuir à luz uma característica chamada cor, independente do observador, é um erro de categoria. Na ciência da cor, essa realidade física aqui mencionada é chamada, de forma mais precisa, de distribuição espectral de potência da radiação eletromagnética na faixa visível. Enquanto essa radiação estimular a resposta cromática do sistema visual humano, a luz violeta claramente existe. Ela apenas não é simulada por uma radiação de uma única faixa estreita de comprimentos de onda
      A “fronteira púrpura” na parte inferior do diagrama em ferradura da CIE mostra a fronteira perceptiva ao misturar estímulos de comprimentos de onda longos e curtos, isto é, primárias vermelho/azul. Mas partir do pressuposto de que a luz tem uma cor natural é uma descrição da realidade muito centrada no ser humano. Outros organismos têm respostas características muito diferentes das humanas. Basta imaginar sentidos sensíveis à polarização. A roda de cores dos artistas é circular porque, na mente dos artistas, a cor se manifesta assim como qualia. A física dos qualia tem mais a ver com a complexidade das respostas internas do organismo do que com estímulos externos. Falar da cor da luz é uma expressão de senso comum, mas atribui em excesso características humanas à física do estímulo. A explicação deve ser a mais simples possível, mas não mais simples que isso
      A explicação que vê a “cor real” como uma propriedade da luz, e não da percepção, gera mais mal-entendidos do que clareza
    • Comprimento de onda ou frequência são lineares, mas a luz comum é composta por vários comprimentos de onda, isto é, pelo espectro inteiro