关于ffmpeg:多媒体开发6用滤镜实现各种图片效果

101次阅读

共计 4845 个字符,预计需要花费 13 分钟才能阅读完成。

之前讲过应用 FFmpeg 的 drawtext 滤镜(把图片或文字加到视频上),而实际上,FFmpeg 的滤镜很弱小,远不止加字幕或加图片的性能。滤镜很乏味,能够把图片变含糊、变色、缩放旋转,等等。

本文介绍 FFmpeg 滤镜的应用。目标是让你感受一下 FFmepg 的滤镜成果,这样在理论须要某种成果时,能够思考应用 FFmpeg。

我这里间接应用 FFmpeg 的命令行来应用滤镜,不波及写代码调用 FFmpeg 的内容,并且这里都是 对图片进行滤镜解决,你会看到很多乏味的解决成果。

然而,因为 FFmpeg 滤镜的内容很多,我这里没有一一介绍,你如果想具体理解这部分内容的话,能够查阅官网文档:http://www.ffmpeg.org/ffmpeg-…

本文多图。

(0)前提

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

./configure –enable-avfilter

最终编译进去的 FFmepg 是反对滤镜的,比方,小程的 ffmpeg 程序的滤镜信息是这样的:

这个 ffmpeg 程序已反对滤镜解决,比方之前加字幕、加图片的操作,用的就是这个 ffmepg 程序。

在进行滤镜解决之前,先给出几张丑陋的原图:

最难看的当然是第三张。

(1)含糊

参数 boxblur。

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

值越大越含糊,以下是值别离为 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

失去的图片是这样的:



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

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

成果是这样的:

(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 + green*rg +
alpha*ra,而后别离是 green 跟 blue 的计算权重。

下面两个命令对应的成果是这样的:

(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 时,就是原图):

再比方,只调饱和度 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 时,就是原图):

(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 色彩空间。这两个命令的成果是一样的,都是反转,失去底片的成果:

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

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

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

把色度移除(uv),失去黑白图:

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

晋升亮度,成果如下:

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

调整 uv 的值,成果如下:

(e)negate

反转,失去底片的成果,参数值为 0 或 1,为 1 时示意把 alpha 通道也反转,默认为 0。

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

成果如下:

(f)swapuv

uv 调换。

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

成果如下:

(3)裁剪

参数 crop,反对裁剪多大、在哪个地位开始,也反对带变量的更简单的裁剪。

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

./ffmpeg -i 1.jpg -vf crop=w=200:h=300:x=100:y=100 crop2.jpg

这两个命令是一样的,都是在 (100,100) 的地位,裁剪 200*300 的大小,成果如下:

./ffmpeg -i 1.jpg -vf crop=400:500 crop2.jpg

这个命令是从两头开始,裁剪 400*500 的尺寸。

(4)去 logo

参数 delogo,在指定的区域作含糊解决,达到打消 logo 的成果。

./ffmpeg -i 2.jpg -vf delogo=x=0:y=0:w=50:h=50:band=5:show=1 delogo2.jpg

band 为含糊的强度,show 为 1 时显示含糊的区域框,省略 show 或值为 0 时不显示区域框。

成果如下:

(5)加边框

参数 drawbox。

./ffmpeg -i 2.jpg -vf drawbox drawbox1.jpg

在边界画一个实心的黑框,成果如下:

./ffmpeg -i 2.jpg -vf drawbox=10:10:200red@0.5 drawbox2.jpg

./ffmpeg -i 2.jpg -vf drawbox=x=10:y=10:w=200:h=100:color=red@0.5 drawbox2.jpg

这两个命令是一样的,0.5 为边框的透明度(0 到 1),成果如下:

./ffmpeg -i 2.jpg -vf drawbox=x=10:y=10:w=300:h=230:color=pink@0.5:t=10 drawbox3.jpg

t 为边框厚度,成果如下:

(6)画网格

参数 drawgrid。

./ffmpeg -i 2.jpg -vf drawgrid=w=iw/3:h=ih/3:t=2:c=white@0.5 drawgrid1.jpg

画一个 3 * 3 的红色的厚度为 2,透明度为 0.5 的网络,成果如下:

./ffmpeg -i 2.jpg -vf drawgrid=w=400:h=100:t=2:c=red@0.5 drawgrid2.jpg

画每个单元为 400*100 的网格,成果如下:

(7)增加字幕

参数为 drawtext,这个小程之前曾经具体介绍过了。

(8)画边缘

参数 edgedetect。

./ffmpeg -i 2.jpg -vf edgedetect=low=0.1:high=0.4 edge2-1.jpg

./ffmpeg -i 2.jpg -vf edgedetect=low=0.5:high=0.8 edge2-2.jpg

low 小于等于 high,且值的范畴为[0,1],是检测算法应用的阈值。

以上两个命令的成果是这样的:

再比方:

./ffmpeg -i 1.jpg -vf edgedetect=low=0.1:high=0.2 edge1-1.jpg

成果是这样的:

(9)eq 成果

参数为 eq,能够调整亮度、饱和度、对比度等。

./ffmpeg -i 2.jpg -vf eq=brightness=0.2 eq1.jpg

brightness 为亮度,值范畴为[-1,1],成果是这样的:

./ffmpeg -i 2.jpg -vf eq=contrast=1.5 eq2.jpg

contrast 是对比度,值范畴为[-2, 2],成果如下:

./ffmpeg -i 2.jpg -vf eq=saturation=0.1 eq3.jpg

saturation 是饱和度,值范畴为[0,3],默认是 1,成果如下:

./ffmpeg -i 2.jpg -vf eq=gamma_r=0.2 eq4.jpg

调整 gamma 系数,范畴为[0.1,10],默认是 1,成果如下:

(10)缩放

参数 scale。

./ffmpeg -i 3.jpg -vf scale=200:200 scale1.jpg

缩放为 200*200,成果如下:

(11)等比放大

参数 hqx。

./ffmpeg -i 2.jpg -vf hqx=4 hqx1.jpg

成果是尺寸等比放大 4 倍。

(12)横向倒置

参数 hflip。

./ffmpeg -i 2.jpg -vf “hflip” hflip1.jpg

程度方向作镜像,成果是这样的:

(13)纵向倒置

参数 vflip。

./ffmpeg -i 2.jpg -vf “vflip” vflip2.jpg

纵向作镜像,成果是这样的:

(14)加乐音

参数 noise。

./ffmpeg -i 3.jpg -vf noise=alls=100:allf=t+u noise1.jpg

alls 示意所有像素成分的强度,范畴为[0,100],默认为 0;allf 示意所有像素成分的乐音类型,t 为长期乐音,u 为对立乐音。成果如下:

./ffmpeg -i 3.jpg -vf noise=alls=100:allf=a noise2.jpg

a 示意平滑的均匀乐音,成果如下:

./ffmpeg -i 3.jpg -vf noise=alls=100:allf=p noise3.jpg

p 示意随机乐音,成果如下:

(15)加水印

参数 overlay。

之前介绍在视频上加 logo(图片或 gif 图)时解说过。

(16)加底板

参数 pad。

./ffmpeg -i 2.jpg -vf pad=500:500:40:40:violet pad1.jpg

./ffmpeg -i 2.jpg -vf pad=width=500:height=500:x=40:y=40:color=violet pad2.jpg

以上两个命令是一样的成果,减少一个 500*500 的底面板,(x,y)是原图摆放的地位:

(17)旋转

参数 rotate。

./ffmpeg -i 1.jpg -vf rotate=PI/6 rotate1.jpg

成果如下:

(18)光晕

参数 vignette。

./ffmpeg -i 2.jpg -vf vignette=PI/4 vignette1.jpg

成果如下:


好了,总结一下,本文介绍怎么应用 FFmpeg 命令行来调用滤镜解决,并且给出了解决的成果。这里只是小局部滤镜介绍,心愿能让你对滤镜有个感知,如果理论要应用到,则能够具体查看相应的文档阐明。好了,有缘再见,see you.

正文完
 0