FFmpeg: applicazione di effetti a un video


0

Sto cercando di applicare alcuni effetti a un video regolando colore, contrasto, luminosità, ecc. Ecco alcuni degli effetti che stavo provando. E di seguito è riportato il comando che ho usato per applicare l'effetto "Kelvin".

ffmpeg -i 3.mp4 -c:v libx264 -c:a libfaac -filter_complex "[0:v]eq=1.0:0:1.3:2.4:0.175686275:0.103529412:0.031372549:0.4[outv]" -map [outv] out.mp4

La documentazione di FFmpeg mi ha aiutato a capire i limiti di ciascun valore per il eqfiltro. Ma non sto ancora ottenendo l'output atteso per l'effetto "Kelvin" come nel link sopra. Ho calcolato i valori di rg, gg, bg in base ai valori per il sepiavalore utilizzato in css. (r = 112, g = 66, b = 20 sono i valori che ho usato per convertire la seppia in rgb) Di seguito è la semplice matematica che ho usato per ottenere i valori rg, gg, bg.

rg = (112/255) * (gamma_r max - gamma_r min) * valore seppia

Qui gamma_r max è 10 e gamma_r min è 0.1 secondo la documentazione.

Cosa sto facendo di sbagliato qui? C'è qualche altra alternativa per farlo?

Risposte:


0

Il eqfiltro regola i canali di colore in relazione al loro stato attuale, ovvero aumentando o diminuendo la loro intensità (come una manopola "volume" nel suono). Per raggiungere la tua temperatura di colore target con eqdovresti calcolare la temperatura di colore corrente di ogni regione nella foto e quindi modificarla, qualcosa per cui hai bisogno di un frame server come AviSynth. Ma tutto ciò non è davvero necessario, perché non vuoi davvero controllare completamente il tuo bilanciamento del bianco, vuoi solo applicare un filtro fisso che si tradurrà in una tonalità di colore specifica - in questo caso seppia. Per questo dovresti usare invece il filtro colorchannelmixer che fornisce un modo per gestire il bilanciamento del bianco dei pixel l'uno rispetto all'altro. La documentazione del filtro ha un esempio specifico di seppia:

colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131

Come funziona (spiegazione molto semplificata)

Il colorchannelmixerIl filtro descrive l'immagine come se avesse 4 canali di colore, chiamati rosso, verde, blu e alfa (il canale "maschera"). Per impostazione predefinita, ogni canale rappresenta l'intensità del colore dopo il quale è nominato come 1.0. Quindi, il canale "Rosso" rappresenta la porzione dell'immagine che è rossa per 1,0, la porzione che è verde per 0,0, la porzione che è blu come 0,0. E la porzione che è alfa volte 0,0. Allo stesso modo, ogni altro canale ha un valore di 1,0 per il "suo" colore e 0,0 per tutti gli altri. Ora il filtro consente di "rubare" un colore dal suo canale e iniettare la sua "energia" in un altro canale. Ad esempio, potresti aumentare il valore di rosso nel canale "Verde" su 1,0 e modificare il valore di rosso nel canale "Rosso" su 0,0, così ora l'intensità del verde aumenterà in ogni pixel dell'intensità originale del rosso, senza lasciare alcun rosso nell'immagine e senza cambiare l'intensità relativa di blu e alfa. Quando si applica questo concetto su tutte e 16 le combinazioni di colori, si ottiene una matrice che definisce l'intensità di colore risultante di ciascun pixel come un prodotto di tutte le intensità di colore originali. Il risultato viene quindi normalizzato e si ottiene un modo semplice per esprimere la curva di trasformazione del colore.

Quanto sopra è in qualche modo semplicistico e per capire come si applica alla tua domanda specifica puoi leggere di più sulla teoria della temperatura di colore . Nota che con il colorchannelmixerfiltro puoi fare anche altre cose come generare negativi di colore, ridurre l'intensità del colore per ottenere effetti simili ai fumetti e molto altro.

Spero che questo funzioni bene per te!


puoi per favore fornire qualche informazione in più sul colorchannelmixerfiltro per favore. La documentazione in sé sembra non contenere molti dettagli. Quali sono quei valori separati da due punti?
Chamath,

Il commento ha uno spazio limitato, quindi modificherò la risposta al commento nella risposta completa.
AVNR

Questo è informativo. Sarebbe fantastico se riuscissi a spiegare in che modo il colorchannelmixer è associato a Tonalità, Saturazione, Contrasto e Luminosità?
Chamath,

Il filtro colorchannelmixer opera su uno spazio cromatico RGBa, ma non applica questo spazio cromatico sul formato pixel dello stream, quindi dal punto di vista pratico non ti limita in termini di capacità di concatenare filtri aggiuntivi che operano su altri spazi cromatici. Il lato teorico degli spazi colore è piuttosto ampio, se vuoi approfondire ti consiglio di iniziare leggendo questo articolo di Wikipedia: en.wikipedia.org/wiki/Color_space
avnr

0

Finalmente creato gli effetti concatenando colorchannelmixere eqfiltri. Secondo gli effetti citati qui , ho applicato l' sepiaeffetto usando il colorchannelmixerfiltro e ho regolato il resto delle proprietà usando il eqfiltro.

Per l'effetto seppia è possibile utilizzare la matrice seppia sostituendo amountcon sepia value. Tutte le altre proprietà possono essere applicate direttamente senza fare alcun calcolo matematico tranne il valore di luminosità. Ho sostituito il valore di luminosità con,

(luminosità - contrasto) / 20

che ha prodotto un output più probabile. Qualcuno può correggere questo dato che questo non è il calcolo esatto. Di seguito è riportato il comando FFmpeg per l'effetto "Willow" dopo aver eseguito questi calcoli.

ffmpeg -i input_image -filter_complex "
[0:v]colorchannelmixer=0.98786:0.01538:0.00378:0.0:0.00698:0.99372:0.00336:0.0:0.00544:0.01068:0.98262:0.0[colorchannelmixed];
[colorchannelmixed]eq=0.85:0.0175:0.02:1.0:1.0:1.0:1.0:1.0[color_effect]" -map [color_effect] -c:v png output_image

Spero che questo possa aiutare qualcun altro. Saluti!

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.