Subtraindo cores e extraindo valores de transparência

0

Digamos que uma foto foi criada para semitransparente e adicionada em uma cor de plano de fundo. A imagem original, a cor de fundo e o resultado (mistura) são conhecidos. Mas, essa transparência adicionada (valor alfa) é desconhecida e varia ao longo da imagem. Existe uma maneira automatizada de calcular esse valor de transparência adicionado para cada pixel de imagem? Podemos copiar esses valores e aplicar em outra foto?

[ Picture + Transparency(unknown and varies) ] + FlatBackground = Mix(opaque)

= [ Semi-tranparent Picture ] + FlatBackground = Mix(opaque)

Um exemplo de cópia de cada valor de transparência adicionado correspondente a pixels da imagem:

for pixel(0,0) added 127
for pixel(1,0) added 124
for pixel(0,1) added 124
for pixel(1,1) added 120

Mas é claro que não quero imprimir esses valores. Eu só quero usá-lo como máscara (?). Então, eu posso aplicar esses valores a outra imagem para criar o mesmo efeito.

    
por destor 02.05.2015 / 11:03

1 resposta

0

A transparência é multiplicada por, não adicionada ao pixel original para obter o pixel misto. Veja a discussão no Especificação do PNG .

Supondo que amostras de cores de 8 bits variem de 0..255 e normalizando para o intervalo 0..1.0, faça isso para cada pixel na imagem:

m = Mix/255
p = Picture/255
a = alpha = Transparency/255

m = (p * a) + (b * (1.0 - a))

Resolva "a"

a = (m - b) / (p - b)

Converter de volta ao intervalo original, por exemplo, 0..255:

Transparency = a * 255

Infelizmente, isso significa que você não pode extrair transparência (alfa) de todos os pixels. Em particular, quando Imagem == Fundo (p - b == 0), então Transparência pode ser qualquer coisa no intervalo 0..255 (a == qualquer coisa de 0.0 a 1.0); se você usar essa fórmula em um código que precisa proteger contra divisão por zero.

Quando o fundo da imagem é diferente de zero, você pode obter Transparência, mas não é muito preciso quando a diferença (p-b) é pequena.

    
por 27.07.2015 / 21:27