首页 > 技术文章 > 多媒体开发(6):用滤镜实现各种图片效果

freeself 2021-01-14 14:25 原文

之前讲过使用FFmpeg的drawtext滤镜(把图片或文字加到视频上),而实际上,FFmpeg的滤镜很强大,远不止加字幕或加图片的功能。滤镜很有趣,可以把图片变模糊、变色、缩放旋转,等等。

本文介绍FFmpeg滤镜的使用。目的是让你感受一下FFmepg的滤镜效果,这样在实际需要某种效果时,可以考虑使用FFmpeg。

我这里直接使用FFmpeg的命令行来使用滤镜,不涉及写代码调用FFmpeg的内容,并且这里都是对图片进行滤镜处理,你会看到很多有趣的处理效果。

但是,由于FFmpeg滤镜的内容很多,我这里没有一一介绍,你如果想详细了解这部分内容的话,可以查阅官方文档: http://www.ffmpeg.org/ffmpeg-filters.html#Video-Filters

本文多图。

(0)前提

先要让ffmpeg程序支持滤镜,对于FFmpeg的安装或编译,我之前已经有介绍,后续还会介绍FFmpeg的编译。之前介绍过,让FFmpeg支持滤镜的话,需要在配置FFmpeg时指定使用avfilter:

./configure --enable-avfilter

最终编译出来的FFmepg是支持滤镜的,比如,小程的ffmpeg程序的滤镜信息是这样的:
FFmpeg的滤镜信息

这个ffmpeg程序已支持滤镜处理,比如之前加字幕、加图片的操作,用的就是这个ffmepg程序。

在进行滤镜处理之前,先给出几张漂亮的原图:
滤镜处理的原图1

滤镜处理的原图2

滤镜处理的原图3

最好看的当然是第三张。

(1)模糊

参数boxblur。

./ffmpeg -i 1.jpg -vf boxblur=2 blur1.jpg

值越大越模糊,以下是值分别为2、4、8的效果:
模糊-2

模糊-4

模糊-8

(2)变色

有几个办法。

(a)colorbalance

调整rgb某个维度的权重实现变色。

选项有三组,分别为rs/gs/bs、rm/gm/bm、rh/gh/bh。每一个选项都指定了目标颜色(rgb中的一个),s表现偏暗,m表现偏中间,h表现偏亮(且平滑)。

选项的值范围为[-1, 1],正数表示偏向目标颜色,负数表示远离目标颜色。

比如这三个命令:

./ffmpeg -i 1.jpg -vf colorbalance=rs=1 colorbalance1-1.jpg

./ffmpeg -i 1.jpg -vf colorbalance=rm=1 colorbalance1-2.jpg

./ffmpeg -i 1.jpg -vf colorbalance=rh=1 colorbalance1-3.jpg

得到的图片是这样的:
变色rs1
变色rm1
变色rh1

再比如把图片变得冷色一点:

./ffmpeg -i 2.jpg -vf colorbalance=rh=-0.6 colorbalance2.jpg

效果是这样的:
变色rh-0.6

(b)colorchannelmixer

对rgba四个通道进行重新计算,并分别给定权重比例。

先看命令:

./ffmpeg -i 3.jpg -vf colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3 colorchannelmixer3.jpg

./ffmpeg -i 2.jpg -vf colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131 colorchannelmixer2.jpg

每个通道的权重从0到1,先给red的计算权重,即red=redrr + bluerb + greenrg +
alpha
ra,然后分别是green跟blue的计算权重。

上面两个命令对应的效果是这样的:
变色colorchannelmixer3

变色colorchannelmixer2

(c)hue

改变色调,相当在调色板上调色。

./ffmpeg -i 2.jpg -vf hue=h=30:s=1 hue_30.jpg

s为饱和度,范围为[-10,10],默认为1。h为角度,不同角度有不同的颜色布局(类比调色板),范围为[0,360],超过360则相当于从0开始,默认为0。

以下效果为s=1(默认),h分别为30、60、90、120、160、180、210、250、280、320、360时的效果(在360时,就是原图):
hue-h30

hue-h60

hue-h90

hue-h120

hue-h160

hue-h180

hue-h210

hue-h250

hue-h280

hue-h320

hue-h360

再比如,只调饱和度s:

./ffmpeg -i 2.jpg -vf hue=h=0:s=-5 hue_s-5.jpg

以下效果为h=0(默认),s分别为-10、-5、0、1、5、10时的效果(在1时,就是原图):
hue-s-10

hue-s-5

hue-s0

hue-s1

hue-s5

hue-s10

(d)lut/lutyuv/lutrgb

./ffmpeg -i 2.jpg -vf lutyuv="y=maxval+minval-val:u=maxval+minval-val:v=maxval+minval-val" lutyuv1.jpg

./ffmpeg -i 2.jpg -vf lutyuv="y=negval:u=negval:v=negval" lutyuv2.jpg

lutyuv用于yuv颜色空间。这两个命令的效果是一样的,都是反转,得到底片的效果:
底片lutyuv1

./ffmpeg -i 2.jpg -vf lutyuv=y=negval lutyuv2.jpg

把亮度(y)反转,效果如下:
lutyuv2

./ffmpeg -i 2.jpg -vf lutyuv="u=128:v=128" lutyuv3.jpg

把色度移除(uv),得到黑白图:
lutyuv3

./ffmpeg -i 2.jpg -vf lutyuv="y=2*val" lutyuv4.jpg

提升亮度,效果如下:
lutyuv4

./ffmpeg -i 2.jpg -vf lutyuv='u=1.2val:v=1.1val' lutyuv5.jpg

调整uv的值,效果如下:
lutyuv5

(e)negate

反转,得到底片的效果,参数值为0或1,为1时表示把alpha通道也反转,默认为0。

./ffmpeg -i 3.jpg -vf negate=0 negate1.jpg

效果如下:
negate1

(f)swapuv

uv互换。

./ffmpeg -i 2.jpg -vf swapuv swapuv1.jpg

效果如下:
swapuv1

(3)裁剪

参数crop,支持裁剪多大、在哪个位置开始,也支持带变量的更复杂的裁剪。

./ffmpeg -i 1.jpg -vf crop=200:300

推荐阅读