FFmpeg: Aplicando efeitos a um vídeo

0

Estou tentando aplicar alguns efeitos a um vídeo ajustando cor, contraste, brilho etc. Aqui são alguns dos efeitos que eu estava tentando. E seguir é o comando que eu usei para aplicar o efeito "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
A documentação do FFmpeg ajudou-me a descobrir os limites de cada valor para eq filter. Mas ainda não estou obtendo a saída esperada para o efeito "Kelvin" como no link acima. Calculei os valores de rg, gg, bg de acordo com os valores para sepia valor usado em css. (r = 112, g = 66, b = 20 são os valores que usei para converter sepia em rgb) A seguir, a matemática simples que usei para obter os valores de rg, gg, bg.

rg = (112 / 255) * (gamma_r max - gamma_r min) * sepia value

Aqui gamma_r max é 10 e gamma_r min é 0.1 de acordo com a documentação.

O que estou fazendo de errado aqui? Existe alguma outra alternativa para fazer isso?

    
por Chamath 11.06.2015 / 14:26

2 respostas

0

O filtro eq ajusta os canais de cor em relação ao seu estado atual, isto é, aumentando ou diminuindo sua intensidade (como um botão "volume" no som). Para atingir sua temperatura de cor de destino com eq você teria que calcular a temperatura de cor atual de cada região na foto e depois modificá-la - algo para o qual você precisa de um servidor de quadros como o AviSynth. Mas tudo isso não é realmente necessário, porque você realmente não quer controlar totalmente o seu balanço de branco, você só quer aplicar um filtro fixo que resultará em um tom de cor específico - neste caso, sépia. Para isso, você deve usar o filtro colorchannelmixer que fornece uma maneira de gerenciar o equilíbrio de branco dos pixels em relação um ao outro . A documentação do filtro tem um exemplo específico para sépia:

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

Como funciona (explicação muito simplificada)

O filtro colorchannelmixer descreve a imagem como se ela tivesse 4 canais de cor - chamados Red, Green, Blue e Alpha (o canal "mask"). Por padrão, cada canal representa a intensidade da cor após a qual é nomeado como 1.0. Assim, o canal "Vermelho" representa a porção da imagem que é vermelha vezes 1,0, a porção que é verde vezes 0,0, a porção que é azul como 0,0, e a porção que é alfa vezes 0,0. Da mesma forma, cada outro canal tem um valor de 1,0 para a cor "its" e 0,0 para todos os outros. Agora o filtro permite "roubar" uma cor do seu canal e injetar sua "energia" em outro canal. Por exemplo, você poderia aumentar o valor de vermelho no canal "Verde" para 1.0 e alterar o valor de vermelho no canal "Vermelho" para 0.0, então agora a intensidade de verde aumentará em cada pixel pela intensidade original de vermelho, sem deixar nenhum vermelho na imagem, e sem alterar a intensidade relativa de azul e alfa. Ao aplicar este conceito em todas as 16 combinações de cores, você obtém uma matriz que define a intensidade de cor resultante de cada pixel como um produto de todas as intensidades de cor originais. O resultado é então normalizado e você obtém uma maneira simples de expressar a curva de transformação de cor.

O texto acima é simplista, e para entender como ele se aplica à sua pergunta específica, leia mais sobre Temperatura da cor teoria. Observe que, com o filtro colorchannelmixer , você também pode fazer outras coisas, como gerar negativos de cor, reduzir a intensidade das cores para obter efeitos semelhantes aos quadrinhos e muito mais.

Espero que isso funcione bem para você!

    
por 11.06.2015 / 16:00
0

Por fim, criamos os efeitos encadeando colorchannelmixer e eq . De acordo com os efeitos mencionados aqui , apliquei sepia effect usando colorchannelmixer filter e resto ajustado das propriedades usando o filtro eq .

Para efeito sépia, você pode usar matriz sépia substituindo amount por sepia value . Todas as outras propriedades podem ser aplicadas diretamente sem fazer qualquer cálculo, exceto o valor de brilho. Substituí o valor de brilho por

(brightness - contrast) / 20

que resultou em saída mais provável. Alguém pode corrigir isso, pois esse não é o cálculo exato. A seguir está o comando FFmpeg para o efeito "Willow" depois de fazer esses cálculos.

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

Espero que isso ajude alguém. Felicidades!

    
por 18.06.2015 / 09:15