旧nmm论坛里有一个关于LanczosResize内部切边的讨论,大虾提到为了实现YV12奇数切边,对色度平面少切或多切半个像素。另一种方法是转成rgb或yuv444(yv24),但是又存在转换造成的损失。以下是一个比较这些方法的实验:
源是一个704x480的动画,首先在yv12下用lanczosresize切奇数,avs脚本是这样:
x = 702
LanczosResize(x,480,1,0,x,480)
x = x-2
LanczosResize(x,480,1,0,x,480)
……
"x = x-2 \n LanczosResize(x,480,1,0,x,480)"重复226次,结果如下图
这个结果表明,在yv12下,resizer内部切边造成了色度平面的误差。
再看rgb下的情况:
avisynth2.6 alpha添加了yv24的支持,所以看看converttoyv24()以后的情况:
选择用rgb还是yv24,就要考虑从yv12转换到哪一个损失较小。用yv12来源向rgb和yv24各自反复转换100次,结果是色度的误差都很严重,转yv24稍好些。后来发现,先从yv12转yuy2,再从yuy2转yv24,反着来一遍,反复100次,结果和原图肉眼无差别。因此一个很好(不知道是不是最好)的方法是:如果源是yv12,先转yuy2,再转yv24,奇数切边和resize,再转yuy2,再转yv12。
我上传了一些奇数切边和色彩转换的对比图:
http://ishare.iask.sina.com.cn/f/10604067.html