Como posso ajustar a temperatura da cor de uma imagem programaticamente?

8

Eu estou querendo saber como converter programaticamente (ou seja, com uma linguagem de programação em vez de um editor) de uma temperatura de cor para outra?

Se, por exemplo, eu suponho (e é uma grande suposição) que um algoritmo de balanço de branco possa capturar uma imagem processada (por exemplo, JPEG, etc.) e colocar a temperatura geral em uma cena em 6500, como você algoritmicamente "esfria" "ou" aquecer "a cena a uma temperatura específica?

Obviamente, essa é uma operação comum em um programa de edição de imagens, mas normalmente elas operam em imagens RAW que não têm processamento aplicado (manipulação do espaço de cores ou outros). No caso de arquivos RAW, talvez os arquivos RAW individuais contenham informações suficientes (no cabeçalho do arquivo) sobre a calibração de cores do sensor da câmera para tornar a transformação de temperatura específica mais determinística?

A propósito, fiz essa pergunta no Stack Overflow regular e foi sugerido que eu possa obter uma resposta melhor aqui.

trican
fonte
"[...] talvez os arquivos RAW individuais contenham informações suficientes (no cabeçalho do arquivo) sobre a calibração de cores do sensor da câmera para tornar a transformação de temperatura específica mais determinística?" Sim. O exemplo é para matérias-primas da Canon, portanto a localização difere um pouco para outras marcas.
Jari Keinänen
Obrigado, que foi um link muito útil! Embora eu ainda não tenha certeza de como mudar de uma temperatura de cor para outra?
trican 20/05
As imagens brutas são sempre interpretadas com algum conjunto de instruções do qual as informações Exif sobre os níveis de RGGB do balanço de brancos são um aspecto. Os JPG, por sua vez, são imagens mais ou menos compostas nas quais todas as informações são codificadas e as edições são destrutivas. Não posso fornecer bons exemplos, mas mergulharia no ImageMagick, um editor de imagens de linha de comando com várias interfaces de programa. Sua -color-matrixopção pode ajudar você a começar; veja também: fmwconcepts.com/imagemagick/whitebalance/index.php
Jari Keinänen
O cara que respondeu no estouro da pilha respondeu corretamente, mas com menos detalhes. Ele sugeriu que uma matriz matematicamente equivalente a um ganho por canal dos valores fora da diagonal seja zero.
Agf1997

Respostas:

6

Você precisaria fazer uma conversão de ponto branco no espaço de cores no espaço L * a * b *. A maioria dos modelos de cores com os quais trabalhamos normalmente, principalmente RGB, mas geralmente CMYK, são projetados para suportar as limitações e os requisitos do hardware físico. Esses modelos geralmente não representam muito bem o espaço "perceptivo" da cor, e o ponto branco é definitivamente um aspecto perceptivo da cor.

Sempre que você precisar aplicar ajustes de percepção a uma imagem, como temperatura de cor ou mudança de tonalidade, é melhor fazer a conversão de RGB para XYZ e, durante a conversão, você pode aplicar "pontos brancos de referência" para o espaço de cores de origem e destino . A conversão de XYZ para Lab leva você para um espaço de cores onde você pode remapear perceptivamente o ponto branco e todas as cores, de forma que elas mantenham a continuidade.

Conversões de espaço de cores, adaptação cromática, ajustes de pontos brancos, etc. são matematicamente bastante complexos. Quanto mais perceptivamente precisa você pretende ser, mais complexa a matemática geralmente acaba. Uma excelente fonte de informações para conversões de espaço de cores pode ser encontrada no site de Bruce Lindbloom . Algumas informações úteis adicionais podem ser encontradas na Wikipedia . Você também pode encontrar essas informações nos iluminantes da série D da CIE , pois contém informações, cálculos e constantes específicos do ponto branco.

jrista
fonte
Não é necessário ir a um espaço perceptivo como o CIELAB para executar um balanço de branco para exposições de cenas como as encontradas nos dados da câmera RAW. O balanço de brancos é uma alteração da exposição por canal no espaço de exposição da cena linear. A adaptação cromática é usada para ajustar uma imagem com base no estado de adaptação assumido dos espectadores a um iluminante. Isso também é feito como um ganho, mas no espaço de resposta do cone (LMS), razão pela qual produzirá um resultado razoável.
Agf1997 14/05
Deve-se observar que para passar do RAW cameraRGB para o XYZ e, finalmente, o CIELAB, é preciso passar por uma matriz de caracterização que foi otimizada com um solucionador. Os valores de cameraRGB devem ser adequadamente balanceados em branco para que a transformação da matriz em XYZ seja precisa, efetivamente, exigindo que o balanço de brancos seja feito no espaço de exposição linear da cena.
agf1997 14/05
11
Eu ia dizer que você deveria responder isso, mas vejo que você já o fez. Obrigado pelas ideias, no entanto! Eu não sabia que isso poderia ser feito de maneira tão simples.
jrista
4

O balanço de brancos é uma manipulação muito direta do processamento de imagens. É apenas um ganho por canal no espaço linear RGB. Os arquivos JPG não são ideais para o balanço de branco, pois geralmente possuem uma curva de tons e um EOTF (Electro Optical Transform Function) aplicado, quebrando a relação linear com os valores de luminância da cena. É por isso que geralmente é feito a partir dos dados RAW. Se você conseguir valores RGB lineares através dos dados RAW ou ao inverter a não linearidade descrita acima, poderá fazer o balanço de brancos aplicando o seguinte.

R_out = R_in * R_gain
G_out = G_in
B_out = B_in * B_gain

Observe que é uma convenção não aplicar um ganho ao canal verde, pois ele se refere muito à luminância e a alteração dos três canais também alteraria a exposição geral.

Geralmente, há um campo de metadados nos arquivos RAW que contém um conjunto de ganhos de balanço de branco calculados pela câmera usando um algoritmo incorporado. Esses algoritmos geralmente são baseados em alguma forma de algoritmo de estimativa de iluminante de constância de cores.

Depois que os ganhos são aplicados, uma matriz primária de codificação deve ser aplicada a curva de reprodução do tom de destino e o EOTF inverso.

agf1997
fonte
Estou curioso para saber como é possível executar o balanço de branco como é feito com o Lightroom, onde você tem temperatura de cor e tonalidade de cor. Esses dois controles deslizantes alinham-se perfeitamente com os dois eixos espaciais planares do laboratório, bem como com a fórmula de ajuste de ponto branco baseada em CIE que pode ser encontrada online. É possível controlar a temperatura e a tonalidade da cor separadamente com esse tipo de simplicidade? Isso é apenas algum outro cálculo para determinar o R_gain e B_gain?
jrista
@jrista Os valores de temperatura e matiz da cor são usados ​​para definir uma cromaticidade. Essa cromaticidade é convertida novamente em um conjunto de fatores de ganho R, G e B usados ​​para o balanço de branco no espaço de exposição da cena.
agf1997
2

Eu tinha uma ótima foto de uma mulher que tirei sob uma iluminação estranha e complexa (vapor de sódio e vapor de mercúrio). Ótimo sorriso, foco perfeito, excelente imagem, exceto pelo caminho, longe da cor.

Eu usei o Temp / Matiz por uma hora no Adobe Camera Raw sem nenhum bom resultado. Eu escrevi um programa para hackear o arquivo XMP do side-car variando a temperatura e criando um link simbólico para o NEF original chamado paralelo ao arquivo XMP.

Isso NÃO é tão chique nem tecnicamente correto como a resposta acima, mas lança uma quantidade enorme de CPU no problema e fornece alguns resultados (possivelmente) interessantes.

Isso cria um monte de links de arquivos .NEF e um arquivo secundário .XMP real para cada um. Apenas copie uma combinação real de arquivo nef / xmp para clonar no diretório de teste e defina a temperatura min / max e dif_temp (Kelvins entre clones). Outro loop pode ser inserido para variar o valor da tonalidade em um Kelvin constante, mas os arquivos gerados serão multiplicados pelo número de tonalidades.

Execute o arquivo Photoshop -> scripts -> image_processor, aponte-o para este diretório e ele criará um tif / jpg / real para qualquer link para a temperatura de cor especificada.

Este código é um Hack Direto e Feio, e executá-lo provavelmente derreterá o seu processador enquanto atrai raios de bola e abelhas assassinas para a vizinhança imediata. Nenhuma garantia é desnecessária.

Requer Perl (certamente usado diariamente) e mklink (podem estar presentes).

sub color_temp_experiment()  {
$nef = '6s-2014.1004-237695.acl.nef'; 
$xmp = '6s-2014.1004-237695.acl.xmp';  # crs:Temperature="6000"
$min_temp = 7800;
$max_temp = 9000;
$dif_temp = 200;   # Difference in temp per loop.
$xd = `cat $xmp`;  # Xmp Data;
($base = $nef) =~ s/\.nef//;  # Basename common to both nef and xmp.
$ii = -1;
for($temp = $min_temp; $temp <= $max_temp; $temp += $dif_temp)  {
    $ii++;
    $link = $base . ".$temp" . 'k.nef';  # Abuse Kelvins with lower case.
    $xfn  = $base . ".$temp" . 'k.xmp';  # Abuse Kelvins with lower case.
    if(-f $link)  {
        print("Found FILE (s/b sym link!) $link. Next!\n");  # This prints!
        next;
    }
    $cmd = "mklink $link $nef";
    printf("$ii) Cmd = $cmd\n");
    $sto = `$cmd`;
    unless(-f $link)  {
        print("ERROR! Sym link $link not found!\n StdOut=<<$sto>>\n\n");
        exit;
    }
    ($xt = $xd) =~ s/crs:Temperature="\d+/crs:Temperature="$temp/ms;
    open(O, ">$xfn");
    print(O "$xt");
    close O;
}

}

BrianP007
fonte