FFmpeg: Anwenden von Effekten auf ein Video


0

Ich versuche, einige Effekte auf ein Video anzuwenden, indem ich Farbe, Kontrast, Helligkeit usw. anpasse. Hier sind einige der Effekte, die ich versucht habe. Und das Folgende ist der Befehl, mit dem ich den "Kelvin" -Effekt angewendet habe.

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

Die FFmpeg-Dokumentation hat mir geholfen, die Grenzen für jeden Wert für eqfilter herauszufinden . Aber ich erhalte immer noch nicht die erwartete Ausgabe für den "Kelvin" -Effekt wie im obigen Link. Ich habe die Werte für rg, gg, bg anhand der sepiain css verwendeten Werte für value berechnet. (r = 112, g = 66, b = 20 sind die Werte, die ich für die Umwandlung von Sepia in RGB verwendet habe.) Im Folgenden ist die einfache Mathematik aufgeführt, die ich verwendet habe, um die Werte für rg, gg, bg zu erhalten.

rg = (112/255) * (gamma_r max - gamma_r min) * Sepia-Wert

Hier beträgt gamma_r max 10 und gamma_r min 0,1 gemäß der Dokumentation.

Was mache ich hier falsch? Gibt es eine andere Alternative, um dies zu erreichen?

Antworten:


0

Der eqFilter passt die Farbkanäle relativ zu ihrem aktuellen Status an, dh erhöht oder verringert ihre Intensität (wie ein Lautstärkeregler im Sound). Um Ihre Zielfarbtemperatur mit zu erreichen, müssen Sie eqdie aktuelle Farbtemperatur für jede Region im Foto berechnen und dann ändern - etwas, für das Sie einen Frameserver wie AviSynth benötigen. Dies alles ist jedoch nicht wirklich erforderlich, da Sie den Weißabgleich nicht wirklich vollständig steuern möchten. Sie möchten lediglich einen festen Filter anwenden, der einen bestimmten Farbton ergibt - in diesem Fall Sepia. Verwenden Sie stattdessen den Colorchannelmixer- Filter, mit dem Sie den Weißabgleich der Pixel relativ zueinander steuern können. Die Filterdokumentation enthält ein spezielles Beispiel für Sepia:

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

Wie es funktioniert (sehr vereinfachte Erklärung)

Das colorchannelmixerFilter beschreibt das Bild so, als ob es 4 Farbkanäle hätte - Rot, Grün, Blau und Alpha (der "Masken" -Kanal). Standardmäßig repräsentiert jeder Kanal die Intensität der Farbe, nach der er als 1.0 benannt ist. Der Kanal "Rot" repräsentiert also den Teil des Bildes, der rot mal 1,0 ist, den Teil, der grün mal 0,0 ist, den Teil, der blau als 0,0 ist, und den Teil, der alpha mal 0,0 ist. Ebenso hat jeder andere Kanal einen Wert von 1,0 für "seine" Farbe und 0,0 für alle anderen. Jetzt können Sie mit dem Filter eine Farbe aus ihrem Kanal "stehlen" und ihre "Energie" einem anderen Kanal zuführen. Beispielsweise können Sie den Wert von Rot im Kanal "Grün" auf 1,0 erhöhen und den Wert von Rot im Kanal "Rot" auf 0,0 ändern. Jetzt erhöht sich die Intensität von Grün in jedem Pixel um die ursprüngliche Intensität von Rot, ohne Rot im Bild zu hinterlassen und ohne die relative Intensität von Blau und Alpha zu ändern. Wenn Sie dieses Konzept auf alle 16 Farbkombinationen anwenden, erhalten Sie eine Matrix, die die resultierende Farbintensität jedes Pixels als Produkt aller ursprünglichen Farbintensitäten definiert. Das Ergebnis wird dann normalisiert und Sie erhalten eine einfache Möglichkeit, die Farbtransformationskurve auszudrücken.

Das Obige ist etwas vereinfacht, und um zu verstehen, wie es auf Ihre spezifische Frage zutrifft, können Sie mehr über die Farbtemperaturtheorie lesen . Beachten Sie jedoch, dass Sie mit dem colorchannelmixerFilter auch andere Funktionen ausführen können, z. B. Farbnegative erzeugen, die Farbtiefe reduzieren, um comicartige Effekte zu erzielen, und vieles mehr.

Ich hoffe, das funktioniert gut für Sie!


Können Sie bitte ein bisschen mehr Informationen über colorchannelmixerFilter bereitstellen ? Die Dokumentation selbst scheint nicht viele Details zu enthalten. Was sind diese durch Doppelpunkte getrennten Werte?
Chamath,

Der Kommentar hat einen begrenzten Speicherplatz, daher werde ich die Antwort auf den Kommentar in die vollständige Antwort ändern.
Avnr

Das ist informativ. Es ist großartig, wenn Sie erklären können, wie Colorchannelmixer mit Farbton, Sättigung, Kontrast und Helligkeit in Verbindung gebracht wird.
Chamath,

Der Farbkanalmixer-Filter arbeitet mit einem RGBa-Farbraum, erzwingt diesen Farbraum jedoch nicht für das Pixelformat des Streams, sodass er Sie vom praktischen Standpunkt aus nicht in Bezug auf die Möglichkeit einschränkt, zusätzliche Filter zu verketten, die mit anderen Farbräumen arbeiten. Die theoretische Seite der Farbräume ist ziemlich breit. Wenn Sie sich damit
befassen

0

Zuletzt wurden die Effekte durch Verketten colorchannelmixerund eqFiltern erzeugt. Entsprechend den hier erwähnten Effekten habe ich den sepiaEffekt mithilfe eines colorchannelmixerFilters angewendet und den Rest der Eigenschaften mithilfe eines eqFilters angepasst .

Für den Sepia-Effekt können Sie die Sepia-Matrix durch Ersetzen amountmit verwenden sepia value. Alle anderen Eigenschaften können direkt angewendet werden, ohne dass eine Berechnung mit Ausnahme des Helligkeitswerts erforderlich ist. Ich ersetzte Helligkeitswert mit,

(Helligkeit - Kontrast) / 20

was zu einer wahrscheinlicheren Ausgabe führte. Jemand kann dies korrigieren, da dies nicht die genaue Berechnung ist. Nach diesen Berechnungen folgt der Befehl FFmpeg für den Effekt "Willow".

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

Hoffe das wird jemand anderem helfen. Prost!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.