[DVDrip]Crop&Resize原理浅析
SilkyBible对我们动漫系的人来说是个很有贡献的人,很多的DVDriper都得益于他所写的系列教程。不过,SilkyBible写文通常是因为回贴,所以就看起来有些繁杂,所以这里整理精简了一下。加入极少原因补充,因通常涉及到大量电视信号技术,所以只描述一下,我们知道有这码子事,明白到这么做是有理由的就行了。不至于与别人讨论只就数据乱说一把。我这人也是典型的追半个根,寻半个尾的满大街都是的半瓶子醋,就不那么严格了^0^。如果有错误,那可能只是我理解错误。注:这个帖子是个临时,可能看了后会可以更方便看[SilkyBible] Crop&Resize系列了。
1。为什么影视的长宽要保持为16的倍数(在技术发展中,这一条已经有一定的灵活性了。)?
2。为什么要做“Resize”(重置尺寸)?为什么ITU-R BT.601标准会这样规定?
3。为什么要“Crop”(切边)?
4。为什么要加“黑边”
5。为什么Resize时要加滤镜“过滤”高频(画面尺寸重置所带来的一些问题。)?
=======================================================
1。为什么影视的长宽要保持为16的倍数(在技术发展中,这一条已经有一定的灵活性了。)?
在各种编码技术中,编码通常都是把画面分成X*X的小正方块来处理。例如MPEG以16*16的小方块处理。如果待处理影象的尺寸不是16的倍数,那么在编码时,就不太方便。甚至这个缺陷会造成编码瑕龇。对于另外一些编码如XVID虽然可以处理非正常尺寸的影象,但从压制效率上来看,也建议以标准尺寸来做。而在NERO的H264方案中甚至不能处理非标准尺寸画面。
2。为什么要做“Resize”(重置尺寸)?为什么ITU-R BT.601标准会这样规定?
关于第一个小问题,请看下面的图示。
这个是把原始影象加工成DVD的简易说明。从这个图来分析,如果想反过来获得原始图象,该如何做就很明白了。下面的解释是比较通常的,继续讨论它的近似性,请看[SilkyBible] Crop&Resize系列。
根据 ITU-R BT.601(这是一个视频技术规范),做DVD取样的时候长宽的取样比例不是 1:1,
PAR(Pixel Aspect Ratio)(象素纵横比)不是正方形的 pixel,而是长方形的 pixel。
NTSC 的 PAR 是 10:11,也就是说如果横轴每隔 1cm 取样一点,纵轴就是每隔 1.1cm 取样一点,取样的间距是 1:1.1 = 10:11。
横轴取样的间距比较短,也就是取样的次数比较密集,也就是取样出来的点数会比较多。
假设原始影像是 PAR 1:1 640x480 的图形,经过 ITU-R BT.601 重新取样后,分办率会变成 PAR 10:11 704x480(高度 480 不变,长度变为原本的 1.1 倍,640*1.1=704,横轴的点数变多),而不是 720x480。
所以 NTSC PAR 10:11 720x480 的 DVD 要 resize 到 PAR 1:1 640x480,要左右共砍 16 个点,变成 704x480 再 resize 到 640x480 才会正确。(如果有注意到DVD播放机,它们也是有这个切边并重置的动作的)
关于第二个问题“为什么ITU-R BT.601标准会这样规定?”,那就是因为“人眼对水平方向上的细节更敏感一些”。
3。为什么要“Crop”(切边)?
这个问题的答案在第2个问题中已经很明白的回答了。至于切成多少比较好呢?有704、702、711等多种说法,但是,无论哪一种切法,都因为ITU-R BT.601标准而注定是一种近似。所以我的建议是请选取最方便的切法,以及最保留质量的切法,另外,关于可视面积的地方请参考第4个问题的回答。
画面比例在这里并不是需要强调的。因为我们通常是分辨不出的。除非Resize太夸张的错误。而且从目前的经验来看,还是使用 704 比较好,704 这个数字刚好可以被 16 整除,704 这个数字刚好是 VCD 352 的两倍,704 刚好是 VCD 可以存放的静态图片的最大分办率,704 刚好是 ATSC 数字电视的标准分办率...有这么多的 "巧合",所以我们还是选择削边为 704 来处理。DVD2AVI 的作者也是建议,还是以 704 来处理。
4。为什么要加“黑边”?
注意这个图示,我们换一种思路来还原画面比例:通过上下加黑边补足横轴多采集的16象素所对应的纵轴象素,再Resize也可以得到正确的比例。很多人对于这个很感兴趣。因为保留了所有原始细节。
但是,这里多说一下。
A、 事实上 DVD 的画面也是经过切过的,原始电影胶片上的画面更多,胶片转到 DVD 上时切掉的东西更多,如果要追求完整画面,恐怕得拿原始胶片来转才可以 :P 所以可见画面的多寡不是重点,画面的比例是否正确,反而是更值得注意的焦点。
B、 如果添加黑边,那么补多少才正确,很显然16象素纵轴对应的不是整数。所以第一个问题就是画面尺寸比例近似问题。当然,会有人说,切到704本身也是近似的。好,这个先略过。
C、 如果保留成720*(480+16*10/11),那么重置尺寸到640*480再全屏后的可视面积会减小。在通常的4:3的电视或者显示器上水平方向如果全屏到640,那么,竖直方向肯定会小于480。
D、 因为纵横轴全部变形,产生的质量下降会更多。详细解释请稍后看第5个问题“高频相关”的解释。
总上:4:3屏幕比例时,最好直接切边重置尺寸,16:9会比较适合这种办法。反正本来在4:3屏幕上放就是上下黑边。不过,随着,16:9的宽屏电视与显示器的出现,恐怕也要注意了。
5。为什么Resize要加滤镜“过滤”高频(画面尺寸重置所带来的一些问题。)?
关于这个问题请先参看下面的几幅图片。先给个结论:如果没有特别需要,请直接做成原始大小。
我们缩小画面的时候,譬如说由 256x256 变成 128x128,我们知道「分辨率」变小了,原本 256x256 画面有很密集,变化很快,空间频率很高的成分,在新的 128x128 这样少数的 pixel 上表现不出来,「分辨」不出来。学术的讲法就是,取样间距变宽,取样点不足,取样频率不够,无法记录取样频率一半以上的高频。这些高频的成分在缩小后的图形会变成以低频的形式出现,造成画面上出现许多原来没有的图形,这个瑕疵我们称为 aliasing,好像有翻译翻为「假频」。
第1个是原图。第2个图是一个有比较明显瑕疵的算法结果,多了好多没有的圈,产生的原因是如上段分析。第3个则是换用一个比较精细的算法后的结果。第4个则是相当完美的一个了(不过滤得越干净,通常也代表画面越模糊)。
看过上边的几个图,应该明白处于放大或者缩小时,所补充出来的象素需要重新计算它的像素值。如何计算,这个算法就需要个方面的考虑。这个 pre-filter(也就是一个 low pass filter)的设计有两个困难。不同种类的 filter 滤除高频的特性不一样,有的会造成画面模糊。如果 filter 的 tap 数越高(计算的像素个数越多),计算越精确,品质当然越好。但是 tap 数太高,会造成另一种瑕疵叫做 ringing effect,所以这个 filter tap 数不能太高。但是如果 tap 数太低,无法良好的滤除高频,又会发生 aliasing 的瑕疵。所以这是一个两难,必须视缩小率来调整最恰当的设计。
常见的有以下几种方法:
1. Nearest neighbor: 最近邻居法,就是很简单的直接拿最靠近的邻居(像素)数值来使用。
2. bilinear: 使用周围 2x2,4 个邻居做垂直、水平的线性内插。
3. bicubic: 使用周围 4x4,16 个邻居来做内插,内插的算式比较复杂,按距离的远近有不同的权重。
另外推荐一个 resize 的王者,叫做 lanczos3。这个 resize 法是一种 decimation filter,本身具有 low pass 的效果,也就是使用 lanczos windowed 的 FIR Low Pass Filter,它的 tap 数会根据缩小率自动变化,在清晰度和 ringing effect/aliasing 等瑕疵之间取得最佳的平衡点。所以 lanczos3 等于自己是一个完美的 low pass filter :p 根据大家的实验,lanczos3 可以保留最多的细节,而又不会造成太大的压缩困难,所以建议如果码率够的话,用 lanczos3 可以得到最佳的结果。相关讨论,可以看日本的网站或 Doom9。
另外,lanczos3 处理放大,效果也很不错。放大缩小都行,所以说它是 resize 的王者 :p
通过以上分析,明白为什么质量会下降了吧。幸亏我们Resize都会或多或少带个某软件默认的filter。比如“lanczos3”。所以,没特别需要的话建议是统统作成原始大小,播放时放大或者缩小画面都交给显卡去做。