缩放滤镜

来自NMM Doc
Lititude讨论 | 贡献2010年9月9日 (四) 20:06的版本
跳到导航 跳到搜索

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_left", 浮点 "-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。