星期六, 4月 02, 2005

resize 要用 bicubic 還是 bilinear?

這是從PCDVD copy過來的
作者是Shade.

--------------------------------------------------
resize 要用 bicubic 還是 bilinear?
----------------------------------

好問題

也許有人看過 Nicky 寫的這篇:
http://nickyguides.digital-digest.c...-vs-bicubic.htm

他的建議是
放大用 bicubic
縮小用 bilinear

一般我們做 DVDRip 的時候都是用縮小 resize,放大留給播放的時候再去放大。

縮小 resize 的計算步驟
1. pre-filter
2. 座標變換
3. post-filter

resize 的時候,要計算像素的座標變換,例如 704x480 -> 320x240,
新畫面座標 (99,99) 這個點對應到原畫面,是 (217.8,198) 這個點,
落在原畫面的整數像素之間。
704/320 = 2.2
x = 99*2.2 = 217.8

480/240 = 2
y= 99*2 = 198

所以 (99,99) 對應的 (x,y) 是 (217.8,198)

當然原畫面是沒有 (217.8,198) 這個點的數值,那我們要計算這個位置的像素值應該是多少,
也就是對應過來的新畫面座標 (99,99) 的像素值是多少。
那要怎麼計算這個在像素中間的值呢?
我們會利用內插法,也就是利用這個點周圍鄰居的像素值,來推算這個位於像素中間的數值。
這個內插法使用的 interpolation filter 也就是步驟三的 post-filter,
常見的有以下幾種方法:
1. Nearest neighbor: 最近鄰居法,就是很簡單的直接拿最靠近的鄰居(像素)數值來使用。

2. bilinear: 使用周圍 2x2,4 個鄰居做垂直、水平的線性內插。

3. bicubic: 使用周圍 4x4,16 個鄰居來做內插,內插的算式比較複雜,按距離的遠近有不同的權重。

縮小的時候會發生一種瑕疵叫做 aliasing,也就是原本的高頻被當成低頻訊號,
使得縮小後的低頻出現不正確的結果。
從畫面上看起來 aliasing 會造成 moire 和 鋸齒,線條會一格一格的很難看。
解決的方法是步驟一,先用一個 pre-filter 濾掉 resize 後無法正確記錄、
會引起 aliasing 的高頻訊號,然後再 resize,這樣就可以解決 aliasing 的問題。

但是這個 pre-filter(也就是一個 low pass filter)的設計有兩個困難。
不同種類的 filter 濾除高頻的特性不一樣,有的會造成畫面模糊。
如果 filter 的 tap 數越高(計算的像素個數越多),計算越精確,
品質當然越好。但是 tap 數太高,會造成另一種瑕疵叫做 ringing effect,
所以這個 filter tap 數不能太高。
但是如果 tap 數太低,無法無法良好的濾除高頻,又會發生 aliasing 的瑕疵。
所以這是一個兩難,必須視縮小率來調整最恰當的設計。

Avisynth 的 bicubic 設定
# BicubicResize(clip, int target_width, int target_height, float "b", float "c")

其中參數 b 代表模糊的程度,c 代表 ringing 的程度。
預設值是 b = 1/3, c = 1/3。
b = 0, c = 0.75 等於 VirtualDub 的 "precise bicubic"。
Avisynth 建議,理論上保持 b + 2 * c = 1 會得到最正確、最適當的 filter 結果。
例如 b = 0, c 便要 = 0.5,如果 c 超過 0.5 就會產生 ringing 瑕疵。

bilinear 的畫面比較模糊,但是也比較好壓縮,做 1 CD 的時候,用 bilinear 會比較好。
SimpleResize 這個 resize 法就等於 bilinear 拿掉 triangle filter,
所以它的畫面會比 bilinear 銳利一點。
如果你的畫面本來就很銳利,用 SimpleResize 縮小,那麼就會出現 aliasing 瑕疵。


前面的討論中,我們有提到一個 resize 的王者,叫做 lanczos3。
這個 resize 法是一種 decimation filter,本身具有 low pass 的效果,
也就是使用 lanczos windowed 的 FIR Low Pass Filter,它的 tap 數會根據縮小率
自動變化,在清晰度和 ringing effect/aliasing 等瑕疵之間取得最佳的平衡點。
所以 lanczos3 等於自己是一個完美的 low pass filter
根據大家的實驗,lanczos3 可以保留最多的細節,而又不會造成太大的壓縮困難,
所以建議如果流量夠的話,用 lanczos3 可以得到最佳的結果。
相關討論,可以看日本的網站或 Doom9。

另外,lanczos3 處理放大,效果也很不錯。
放大縮小都行,所以說它是 resize 的王者

沒有留言:

張貼留言