Pergunta

Eu tenho uma imagem em tons de cinza de uma fotografia. Eu determinado que certas partes da imagem são underilluminated, e que um pixel com luminância Y = 0,8 deve, na verdade, ser ajustada a 90% de cinza, isto é, que de pixel deve ser dada luminância 0,9. A minha pergunta é como faço para escalar os outros pixels nas proximidades? eu tenho certeza multiplicando todas as luminâncias por 9/8 é errado, porque eu me lembro vagamente de ouvir que, a fim de olhar uniforme, a escala tem que ser não-linear. Mas eu estou tendo dificuldades para encontrar uma equação que me permitiria fazer progressos. (É claro que eu estou realmente escrever um programa para fazer este ajuste para um grande número de fotografias.)

A fonte dos meus pixels é o formato PGM pbmplus, sobre o qual a página homem diz:

Cada valor de cinza é um número proporcional à intensidade do pixel, ajustado pela CIE Rec. 709 função de transferência gama. (Que função de transferência especifica um número gama de 2,2 e tem um linear seção para pequenas intensidades). Um valor de zero é, por conseguinte, preto. Um valor de MAXVAL representa CIE D65 branco e o valor mais intensa à imagem e qualquer outra imagem a que a imagem pode ser comparado.

Se eu entendi isso melhor do que eu provavelmente teria uma idéia melhor de como proceder.

Eu achei uma pergunta relacionada no fazer uma imagem do uniforme brilho .


Graças Shmoopty por me na pista. Eu aceitei a sua resposta depois acrescentou algumas informações a ele.

Foi útil?

Solução

Você provavelmente quer gama correção, que manterá verdadeiro preto e branco verdadeiro correta , enquanto dobra os valores no meio.

A fórmula para o ajuste de gama, quando a entrada se encontra no intervalo (0.0, 1.0) é:

output = pow( input, gamma )

... onde gamma irá clarear quando inferior a 1,0 e escurecer quando acima de 1,0.

Para empurrar 0,8 até 0,9, você log(0.9)/log(0.8) computação para obter uma gama de 0,4722 .

Note que esta é uma das muitas fórmulas - e é a matematicamente mais simples que preserve preto e branco como cores originais (que alguns considerariam importante) - no entanto, não existe uma única fórmula correta para dar o que é "verdadeiro".


Adenda: Eu verifiquei que a correção gamma pode ser aplicada aos valores que já estão gamma-codificado. É difícil anotar as contas na remarcação, mas a lei algébrica chave é

(y**a)**b == y**(a*b) == y**(b*a) == (y**b)**a

Se você aplicar esta lei, você pode determinar que a gama correções comutar, por isso é OK, para aplicar a correção de gama para valores já corrigidos. NR

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top