Alguém conhece alguma fórmula para converter uma frequência de luz em um valor RGB?
algorithm
language-agnostic
rgb
formula
approximation
Shaul Behr
fonte
fonte
Respostas:
Aqui está uma explicação detalhada de todo o processo de conversão: http://www.fourmilab.ch/documents/specrend/ . Código-fonte incluído!
fonte
Para caras preguiçosos (como eu), aqui está uma implementação em java do código encontrado na resposta de @ user151323 (ou seja, apenas uma tradução simples do código pascal encontrado no Spectra Lab Report ):
fonte
Wavelength<=439
paraWavelength<440
.Ideia geral:
As etapas 1 e 2 podem variar.
Existem várias funções de correspondência de cores, disponíveis como tabelas ou como aproximações analíticas (sugeridas por @Tarc e @Haochen Xie). As tabelas são melhores se você precisar de um resultado preciso e suave.
Não há um único espaço de cores RGB. Múltiplas matrizes de transformação e diferentes tipos de correção gama podem ser usados.
Abaixo está o código C # que criei recentemente. Ele usa interpolação linear sobre a tabela do "observador padrão CIE 1964" e matriz sRGB + correção de gama .
Resultado para a faixa de 400-700 nm:
fonte
Embora esta seja uma pergunta antiga e já obtenha algumas respostas boas, quando tentei implementar essa funcionalidade de conversão em meu aplicativo não fiquei satisfeito com os algoritmos já listados aqui e fiz minha própria pesquisa, o que me deu alguns bons resultados. Vou postar uma nova resposta.
Depois de algumas pesquisas, encontrei este artigo, Aproximações analíticas simples às funções de correspondência de cores CIE XYZ , e tentei adotar o algoritmo de ajuste gaussiano por partes de vários lóbulos introduzido em meu aplicativo. O artigo descreveu apenas as funções para converter um comprimento de onda para os valores XYZ correspondentes , então implementei uma função para converter XYZ em RGB no espaço de cores sRGB e os combinei. O resultado é fantástico e vale a pena compartilhar:
meu código é escrito em Java 8, mas não deve ser difícil portá-lo para versões anteriores do Java e outras linguagens.
fonte
transfer
DoubleUnaryOperator estava fazendo (portanto, a explicação no meu comentário anterior não está correta), portanto, verifique o novo código.1.
é apenas 1, mas o tipo será emdouble
vez deint
Você está falando sobre a conversão do comprimento de onda para um valor RGB.
Olha aqui, provavelmente vou responder sua pergunta. Têm um utilitário para fazer isso com o código-fonte, bem como alguma explicação.
WaveLengthToRGB
fonte
Acho que também devo seguir meu comentário com uma resposta formal. A melhor opção é usar o espaço de cores HSV - embora o matiz represente o comprimento de onda, não é uma comparação de um para um.
fonte
Fiz um ajuste linear de frequências e valores de matiz conhecidos (excluindo vermelho e violeta porque eles se estendem tanto em valores de frequência que distorcem um pouco as coisas) e obtive uma equação de conversão aproximada.
É semelhante à
frequência (em THz) = 474 + (3/4) (Ângulo de matiz (em graus))
Tentei olhar em volta e ver se alguém descobriu essa equação, mas não encontrei nada até maio de 2010.
fonte
Método 1
Esta é uma versão C ++ 11 de @ haochen-xie um pouco limpa e testada. Também adicionei uma função que converte o valor 0 em 1 em um comprimento de onda no espectro visível que pode ser usado com este método. Você pode simplesmente colocar abaixo em um arquivo de cabeçalho e usá-lo sem quaisquer dependências. Esta versão será mantida aqui .
O gráfico de cores de 375 nm a 725 nm é semelhante a abaixo:
Um problema com este método é o fato de que ele funciona apenas entre 400-700 nm e fora disso cai abruptamente para o preto. Outro problema é o azul mais estreito.
Para comparação, abaixo estão as cores do Vision FAQ em maxmax.com:
Usei isso para visualizar o mapa de profundidade onde cada pixel representa o valor da profundidade em metros e isso se parece com o seguinte:
Método 2
Isso é implementado como parte da biblioteca bitmap_image de cabeçalho de arquivo único de Aeash Partow:
O gráfico do comprimento de onda de 375-725nm se parece com abaixo:
Portanto, é mais utilizável em 400-725 nm. Quando eu visualizo o mesmo mapa de profundidade do método 1, eu fico abaixo. Há um problema óbvio com essas linhas pretas que eu acho que indica um pequeno bug neste código que não examinei mais profundamente. Além disso, as violetas são um pouco mais estreitas neste método, o que causa menos contraste para objetos distantes.
fonte
Projete o CIExy do comprimento de onda em direção ao branco D65 na gama sRGB
fonte