縮放濾鏡

出自NMM Doc
(重新導向自LanczosResize
跳至導覽 跳至搜尋

BicubicResize (clip, 整數 target_width, 整數 target_height, 浮點 "b=1./3.", 浮點 "c=1./3.", 浮點 "src_left", 浮點 "src_top", 浮點 "src_width", 浮點 "src_height")

BilinearResize (clip, 整數 target_width, 整數 target_height, 浮點 "src_left", 浮點 "src_top", 浮點 "src_width", 浮點 "src_height")

BlackmanResize (clip, 整數 target_width, 整數 target_height, 浮點 "src_left", 浮點 "src_top", 浮點 "src_width", 浮點 "src_height", 整數 "taps=4")

GaussResize (clip, 整數 target_width, 整數 target_height, 浮點 "src_left", 浮點 "src_top", 浮點 "src_width", 浮點 "src_height", 浮點 "p=30.")

LanczosResize (clip, 整數 target_width, 整數 target_height, 浮點 "src_left", 浮點 "src_top", 浮點 "src_width", 浮點 "src_height", 整數 "taps=4")

Lanczos4Resize (clip, 整數 target_width, 整數 target_height, 浮點 "src_left", 浮點 "src_top", 浮點 "src_width", 浮點 "src_height")

PointResize (clip, 整數 target_width, 整數 target_height, 浮點 "src_left", 浮點 "src_top", 浮點 "src_width", 浮點 "src_height")

Spline16Resize (clip, 整數 target_width, 整數 target_height, 浮點 "src_left", 浮點 "src_top", 浮點 "src_width", 浮點 "src_height")

Spline36Resize (clip, 整數 target_width, 整數 target_height, 浮點 "src_left", 浮點 "src_top", 浮點 "src_width", 浮點 "src_height")

Spline64Resize (clip, 整數 target_width, 整數 target_height, 浮點 "src_left", 浮點 "src_top", 浮點 "src_width", 浮點 "src_height")

從v2.56開始,可以使用偏移量切邊,就像在Crop里一樣。

比如:

Lanczos4Resize (clip, 整数 target_width, 整数 target_height, 浮点 "-src_left", 浮点 "-src_top", 浮点 "-src_right", 浮点 "-src_bottom")}}

所有的縮放濾鏡都有切邊的功能,可以切邊再縮放。如果在縮放前先寫Crop,效果一樣的,但是速度會有一些小的差別。

需要注意的是,邊緣的操作上略有差別。用Crop會有嚴格的邊緣,縮放濾鏡的作用範圍可能會擴展到切掉的部分里,但不會超過畫面的物理界限。

用Crop切掉邊界或VHS的頂部switching noise,若用縮放濾鏡的切邊功能可能會使噪點進入臨近的像素。當需要切掉整幅畫面的一部分時,用縮放濾鏡的切邊功能可以保持準確的邊界信息。

Crop(10,10,200,300).BilinearResize(100,150)

#和以下语句几乎相同
BilinearResize(100,150,10,10,200,300)

重要信息:AviSynth已經完全把縱向和橫向的縮放濾鏡分開了。如果在某個軸的方向上,輸入和輸出的尺寸相同,這個方向的縮放會被省略掉。哪個方向的縮放先做取決於哪個方向的縮小比例最小。這麼做是為了保證儘可能好的質量,因此可以在幾乎最好的畫面上做第二次縮放。


BilinearResize

BilinearResize(雙線性縮放)濾鏡可以把輸入的視頻拉伸或縮小到任意的新解像度。如果提供了可選的source的參數,結果和在BilinearResize之前用Crop效果一致。

BilinearResize使用標準的雙線性濾鏡,和VirtualDub的「precise bilinear」縮放選項的效果幾乎一樣。僅僅是「幾乎」,因為VirtualDub的濾鏡似乎把縮放參數稍稍搞錯了,畫面頂上和右邊得到的像素會被切掉或重複。(當以兩倍或以上的係數放大畫面時,這個錯誤比較明顯,但其他情況並不明顯,因此不必過分在意。)

舉例:

# 载入一个avi文件,并且缩放到240x180
AVISource("video.avi").BilinearResize(240,180)

# 载入一个720x480 (CCIR601) 的视频并缩小到352x240 (VCD),
# 保持原高宽比
AVISource("dv.avi").BilinearResize(352, 240, 8, 0, 704, 480)

# 作用和上个例子一样
AviSource("dv.avi").BilinearResize(352, 240, 8, 0, -8, -0)

# 把320x240视频的右上1/4取出并拉伸到整幅画面大小
BilinearResize(320,240,160,0,160,120)


BicubicResize

BicubicResize(雙立方縮放)和BilinearResize相似,區別在於用Mitchell-Betravali的兩部分立方算法代替了雙線性濾鏡。參數bc用於調整兩次立方的特性,某些時候分別指「blurring」和「ringing」。

b = 0和c = 0.75時,這個濾鏡和VirtualDub的「precise bicubic」完全一樣,得到的結果也是完全一樣的,除了上述的VirtualDub縮放問題。默認參數b = 1./3.、c = 1./3.,此參數是Mitchell和Netravali在人眼主觀測試綜合最滿意的結果才得到的。增大bc的值會得到有趣的反藝術效果——比方說試試b = 和 c= -5。

如果放大視頻,用BicubicResize比BilinearResize得到的畫面更好看。然而在縮小時,用BilinearResize可能和BicubicResize一樣,甚至優於BicubicResize。儘管VirtualDub的bicubic濾鏡比linear的效果好,但這是因為bicubic濾鏡銳化了圖像,而不是因為形狀更好。比較銳利的圖像看起來很舒服——但在壓縮時非常容易出瑕疵。BicubicResize的默認參數不像VirtualDub那樣銳化,但依然比bilinear銳利。若像壓低碼率的視頻,用BilinearResize得到的結果整體較好也很正常。

為了最精確的數值,濾鏡里b和c必須滿足如下關係:

b + 2 * c = 1

因此當b = 0時c可以取最大值0.5,這其實是Catmull-Rom樣條曲線。這是一個可以得到較銳利圖像的推薦值。

c > 0.6後濾鏡開始「ring」了。這不是真正的銳利,相反會得到像電視的銳化控制一樣的效果。b不能取負值,當c > 0,5時,b取0。


BlackmanResize

BlackmanResize是LanczosResize的改進版,它用高tap數實現了更好的ringing控制效果。

LanczosResize部分對於tap的解釋(默認taps = 4)。(v2.58加入)


GaussResize

GaussResize的參數p(默認值30)可以調節銳化程度。p的範圍可從1非常模糊到100非常銳利。

GaussResize用的tap數是4,和Lanczos4Resize的速度差異不大。(v2.56加入)


LanczosResize / Lanczos4Resize

LanczosResize是c值大約從0.6到0.75左右的BicubicResize的一個替代,BicubicResize的c值這個範圍內往往會產生很強烈的銳化。LanczosResize能實現的質量一般更好(瑕疵也更少),畫面也很銳利。

Lanczos4Resize(v2.56加入)和LanczosResize(真·名稱:Lanczos3Resize)有很緊密的聯繫。縮放方面,LanczosResize使用2*3=個lobes,Lanczos4Resize使用2*4=8個lobes,其結果是Lanczos4Resize能得到更銳利的畫面,而這一點特別適合放大圖像。

Lancozs4Resize是LanczosResize(taps=4)的簡略形式。

注意:參數taps真正的意義應是lobes(實際上是lobes數值上的一半)。談到縮放算法時,taps有其他意義,下面會講到。


差值算法的階數(taps參數)

設Taps=4,在放大(upsampling)畫面時,整個等式包括個輸入的4個採樣點,這就是濾鏡的作用範圍,4-tap濾鏡由此得來。濾鏡並不關心輸出多大的畫面--僅僅是4 taps而已。
在縮小(downsampling)畫面時,等式包括4個目標採樣點,顯然要包括源里的採樣點區間更大。因此在縮小兩倍時,(縮成原來的一半大小)濾鏡包括2*4=8個採樣點,因此相當於8 tap。縮小三倍時,相當於給了3*4=12個tap,四倍同樣。
因此縮小時等效的taps數量等於縮小的倍數乘以濾鏡的tap數,(於是用LanczoskResize縮小T倍相當於用T*k個tap)並且入到比該數大的最小的偶數上。當放大時,只是k個tap而已。來源:avsforum。


PointResize

PointResize可能是最簡單的縮放濾鏡。PointResize使用Point採樣或最臨近算法,這種算法一般會生成塊非常嚴重的圖像。因此一般這個濾鏡只在想得到較差的質量或想得到清晰像素畫時使用。

此濾鏡在放大一片小區域做細微的檢測時可發揮作用。


Spline16Resize / Spline36Resize / Spline64Resize

這三個縮放濾鏡基於樣條插值算法。(v2.56/v2.58加入)樣條差值算法可以儘可能的銳化圖像,同時產生的ringing瑕疵也比LanczosResize少。Spline16Resize用sqrt(16)=4個採樣點,Spline36Resize用6個採樣點,Spline64Resize用8個採樣點。採樣點用的越多,圖像就越銳利。對比測試見此

直到今天,AviSynth的作者也不能確定Spline縮放算法的係數是如何推導出來的。如果你知道,請告訴我們。


更新日誌:

v2.55 加入Lanczos4Resize。

v2.56 加入Spline16Resize、Spline36Resize、GaussResize和LanczosResize中的參數taps;加入縮放濾鏡中Crop的偏移量表達方式。

v2.58 加入BlackmanResize、Spline64Resize。