多媒體開發(6):用濾鏡實現各類圖片效果

以前講過使用FFmpeg的drawtext濾鏡(把圖片或文字加到視頻上),而實際上,FFmpeg的濾鏡很強大,遠不止加字幕或加圖片的功能。濾鏡頗有趣,能夠把圖片變模糊、變色、縮放旋轉,等等。html

本文介紹FFmpeg濾鏡的使用。目的是讓你感覺一下FFmepg的濾鏡效果,這樣在實際須要某種效果時,能夠考慮使用FFmpeg。算法

我這裏直接使用FFmpeg的命令行來使用濾鏡,不涉及寫代碼調用FFmpeg的內容,而且這裏都是對圖片進行濾鏡處理,你會看到不少有趣的處理效果。網絡

可是,因爲FFmpeg濾鏡的內容不少,我這裏沒有一一介紹,你若是想詳細瞭解這部份內容的話,能夠查閱官方文檔: http://www.ffmpeg.org/ffmpeg-...ide

本文多圖。佈局

(0)前提

先要讓ffmpeg程序支持濾鏡,對於FFmpeg的安裝或編譯,我以前已經有介紹,後續還會介紹FFmpeg的編譯。以前介紹過,讓FFmpeg支持濾鏡的話,須要在配置FFmpeg時指定使用avfilter:spa

./configure --enable-avfilter

最終編譯出來的FFmepg是支持濾鏡的,好比,小程的ffmpeg程序的濾鏡信息是這樣的:
FFmpeg的濾鏡信息命令行

這個ffmpeg程序已支持濾鏡處理,好比以前加字幕、加圖片的操做,用的就是這個ffmepg程序。視頻

在進行濾鏡處理以前,先給出幾張漂亮的原圖:
濾鏡處理的原圖1htm

濾鏡處理的原圖2

濾鏡處理的原圖3

最好看的固然是第三張。圖片

(1)模糊

參數boxblur。

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

值越大越模糊,如下是值分別爲二、四、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 + green*rg +
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、2十、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分別爲-十、-五、0、一、五、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.2 val: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:100:100 crop1.jpg

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

這兩個命令是同樣的,都是在(100,100)的位置,裁剪200*300的大小,效果以下:

裁剪crop1

./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時不顯示區域框。

效果以下:

去logo

(5)加邊框

參數drawbox。

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

在邊界畫一個實心的黑框,效果以下:

drawbox1

./ffmpeg -i 2.jpg -vf drawbox=10:10:200 red@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),效果以下:

drawbox2

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

t爲邊框厚度,效果以下:

drawbox3

(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的網絡,效果以下:
drawgrid1

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

畫每一個單元爲400*100的網格,效果以下:

drawgrid2

(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],是檢測算法使用的閾值。

以上兩個命令的效果是這樣的:

edge2-1

edge2-2

再好比:

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

效果是這樣的:

edge1-1

(9)eq效果

參數爲eq,能夠調整亮度、飽和度、對比度等。

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

brightness爲亮度,值範圍爲[-1,1],效果是這樣的:

eq1

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

contrast是對比度,值範圍爲[-2, 2],效果以下:

eq2

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

saturation是飽和度,值範圍爲[0,3],默認是1,效果以下:

eq3

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

調整gamma係數,範圍爲[0.1,10],默認是1,效果以下:

eq4

(10)縮放

參數scale。

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

縮放爲200*200,效果以下:

scale1

(11)等比放大

參數hqx。

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

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

(12)橫向倒置

參數hflip。

./ffmpeg -i 2.jpg -vf "hflip" hflip1.jpg

水平方向做鏡像,效果是這樣的:

橫向倒置1

(13)縱向倒置

參數vflip。

./ffmpeg -i 2.jpg -vf "vflip" vflip2.jpg

縱向做鏡像,效果是這樣的:

縱向倒置1

(14)加噪音

參數noise。

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

alls表示全部像素成分的強度,範圍爲[0,100],默認爲0;allf表示全部像素成分的噪音類型,t爲臨時噪音,u爲統一噪音。效果以下:

noise1

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

a表示平滑的平均噪音,效果以下:

noise2

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

p表示隨機噪音,效果以下:

noise3

(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)是原圖擺放的位置:

pad1

(17)旋轉

參數rotate。

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

效果以下:

rotate1

(18)光暈

參數vignette。

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

效果以下:

vignette1


好了,總結一下,本文介紹怎麼使用FFmpeg命令行來調用濾鏡處理,而且給出了處理的效果。這裏只是小部分濾鏡介紹,但願能讓你對濾鏡有個感知,若是實際要使用到,則能夠詳細查看相應的文檔說明。好了,有緣再見,see you.

輕鬆一下

相關文章
相關標籤/搜索