Sottrai i colori e estrai i valori di trasparenza


0

Diciamo che un'immagine è stata fatta per semitrasparente e aggiunta su un colore di sfondo piatto. L'immagine originale, il colore di sfondo e il risultato (miscela) sono noti. Ma quella trasparenza aggiunta (valore alfa) è sconosciuta e varia lungo l'immagine. Esiste un modo automatico per calcolare questo valore aggiunto di trasparenza per ciascun pixel dell'immagine? Possiamo copiare questi valori e applicarli a un'altra immagine?

[Immagine + Trasparenza (sconosciuta e varia)] +   FlatBackground = Mix (opaco)

= [Immagine semi-trasparente] + Sfondo piatto = Mix (opaco)

Un esempio di copia di ciascun valore di trasparenza aggiunto corrispondente a pixel dell'immagine:

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

Ma ovviamente non voglio stampare questi valori. Voglio solo usarlo come maschera (?). In questo modo, posso applicare questi valori a un'altra immagine per creare lo stesso effetto.


Sarebbe utile qualcosa come "color to alpha"? Cioè un colore di sfondo viene interpretato come completamente trasparente e i colori ad esso vicini vengono interpretati come semi-trasparenti?
George

Risposte:


0

La trasparenza viene moltiplicata per, non aggiunta a, il pixel originale per ottenere il pixel misto. Vedi la discussione nel Specifica PNG .

Assumendo campioni di colore a 8 bit che vanno da 0..255 e normalizzandoli nell'intervallo 0..1.0, esegui questo per ogni pixel dell'immagine:

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

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

Risolvi per "a"

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

Converti di nuovo nell'intervallo originale, ad esempio 0..255:

Transparency = a * 255

Sfortunatamente questo significa che non puoi estrarre Trasparenza (alfa) da tutti i pixel. In particolare, quando Picture == Background (p - b == 0), allora Transparency potrebbe essere qualsiasi cosa nell'intervallo 0..255 (a == qualsiasi cosa da 0.0 a 1.0); se utilizzi questa formula in un codice, devi proteggerti da divisione per zero.

Quando Picture Background non è zero, è possibile ottenere la trasparenza, ma non è molto preciso quando la differenza (p - b) è piccola.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.