![]() |
||
Major Member
![]() 加入日期: Dec 2001
文章: 216
|
問個笨問題...有測試影片檔畫質的軟體嗎?
有這種軟體嗎?
|
|||||||
![]() |
![]() |
Senior Member
![]() ![]() ![]() 加入日期: Oct 2002 您的住址: El's room
文章: 1,046
|
你要測試哪種影片格式的品質?
客觀測試法,可以用 Avisynth 測 PSNR 和 Deviation 譬如說我壓的訊源是 avisource("source_vfapi.avi").ConvertToYV12() 因為 VFAPI 一律使用 RGB 格式傳遞資料,為了後面比較的公正性,壓縮前統一由 Avisynth 先轉成 YV12 格式,然後用 VirtualDubMod 的 Fast recompress 模式壓縮。VirtualDubMod 會直接傳送 Avisynth downsampling 好的 YV12 的資料,給 codec 壓縮,一般的 DivX5/XviD/MS MPEG-4 codec 都可以接收 YV12 的資料直接進行壓縮。 壓好的檔案 target.avi 就可以用 compare 這個 filter 來比較 orig=avisource("source_vfapi.avi").ConvertToYV12() encoded=avisource("target.avi", false, "YV12") compare(encoded, orig, "YUV", "PSNR.LOG", false) 上面第二行我們強制 codec 輸出 "YV12" 格式,這樣就可以比較原始的 YUV 4:2:0 資料,排除 chroma upsampling 的干擾,影響計算的正確性。 但是不是所有 codec 都可以輸出 "YV12" 格式,例如 DivX5/XviD 可以,但是 MS MPEG-4(DivX3)就不行,MS MPEG-4 vfw codec 只能輸出 RGB 格式。這樣就很傷腦筋啦,為了求公正性,我們只好改用 MS MPEG-4 的 DirectShow Filter 來解碼。MS MPEG-4 的 DirectShow Filter 也不能輸出 "YV12",但是可以輸出 YUY2(YUV 4:2:2),我們再把它轉回 "YV12",這樣比較至少比用 vfw codec 輸出 RGB,再轉回 YV12(需要做 YUV -> RGB -> YUV)來得好。 如果是 MS MPEG-4,第二行改成 encoded=DirectShowSource("target.avi", fps=23.976).ConvertToYV12() 然後我們用 VD 開啟這個 avs,選 Preview 跑一遍再關閉,Avisynth 就會將計算結果輸出成一個 PSNR.LOG 檔。 上面我們是比較 YUV 總和的 PSNR,如果只想比較 Y channel 的 PSNR,第三行改為 compare(encoded, orig, "Y", "PSNR.LOG", false) 如果不想輸出 LOG 檔,想在 VD 的視窗中直接看每個畫面計算的結果,第三行改成 compare(encoded, orig, "YUV") 另一個可以直接開啟 AVI 檔計算 PSNR 的軟體 http://www.vsofts.com/codec/codec_psnr.html PSNR4AVI <avifile1> <avifile2> >> PSNR.LOG 就可以輸出 LOG 檔。 網頁上也有計算 PSNR 的算式和說明。 不過我試用的結果,算出來的數值怪怪的。 CSP-FrameAnalyzer http://www.circlestorm.org/programs.asp Dead2 以前用來做 XviD 測試用的,現在好像不能下載了? MPEG/VCEG 的專家對於 PSNR 的提升,以 0.5dB 為單位,因為他們相信 0.5dB 的差距就可以從視覺上看得出來。 PSNR 是最普遍,最廣泛使用的評鑑畫質的客觀量測法,不過許多實驗結果都顯示,PSNR 的分數無法和人眼看到的視覺品質完全一致,有可能 PSNR 較高者看起來反而比 PSNR 較低者差。這是因為人眼的視覺對於誤差的敏感度並不是絕對的,其感知結果會受到許多因素的影響而產生變化(例如人眼對空間頻率較低的「對比差異」敏感度較高,人眼對亮度「對比差異」的敏感度較色度高,人眼對一個區域的感知結果會受到其周圍鄰近區域的影響,這種作用稱為 Masking... 等等)。 許多新的客觀評鑑方法都引進了 HVS(Human Visual System)模型,會根據人眼的視覺特性計算畫質的分數,這種的評鑑結果會比較接近實際上看起來的品質。 做 HVS 評鑑的軟體... 是有的,例如 ITS 的 VQM,用的就是 ASNI 建議的 SI 和 PI 量測法。有興趣者自行搜尋 ![]() 實際上我們也可以利用 Avisynth 的一些 filter 來做比較簡單的一些 HVS 測試,例如利用 sobel 微分做類似 ANSI Recommendation 的 Spatial Information 測試方法,這裡就不詳述了。 PSNR 雖然不夠準確的反映看起來的品質,不過它仍然是一個值得參考的評量方法,所有 encoder 的開發人員在測試自己的改良是否有助於畫質提升時,也都是用 PSNR 作為判斷的依據。 |
||
![]() |
![]() |
Major Member
![]() 加入日期: Dec 2001
文章: 216
|
嗯..Shade前輩寫的很專業..我得慢慢消化...目前是想測試mpeg檔的畫質..
|
![]() |
![]() |
Senior Member
![]() ![]() ![]() 加入日期: Oct 2002 您的住址: El's room
文章: 1,046
|
我是小輩
![]() 測 MPEG 可以用 BitRate Viewer 這個軟體看 Q.level,也就是 Quantizer,數字越大,品質越差。不過這也只能當作參考,不見得 Q.level 越大,看起來就一定會比較差。例如說 B-Frame,一般 B-Frame 都會乘上一個倍數 ratio,提高 Quantizer 壓縮,以提高壓縮率。因為 B-Frame 不能再被其他 Frame 拿來當作參考畫面,所以 B-Frame 提高 Quantizer 壓縮造成的誤差不會影響、傳遞給下一個 Frame。而 B-Frame 提高壓縮所省下來的流量,就可以分配給它要參考的 I, P Frame,這樣參考的 I, P Frame Quantizer 低,畫質很好,沒有壓縮瑕疵,所以 B-Frame 參考它們壓縮,雖然 Quantizer 很高,(和原本畫面的)誤差很大,但是這個誤差不會造成明顯的壓縮瑕疵,我們人眼比較不會注意到 B-Frame 的劣化。(注意看的話還是可以看出來,會發現畫面有週期性的騷動感,但是看不出有明顯壓縮瑕疵) 所以有使用 B-Frame 的檔案平均 Quantizer 會提高,但是視覺品質卻會提升。 (另外 B-Frame 使用的雙向預測等於具有時間軸上內插的效果,所以也具有抵抗雜訊,柔化的作用) 另一個 Quantizer 的大小會和品質不一樣的情況,是因為 Encoder 有使用 Adaptive Quant(自適應性量化)。Quantizer 的大小可以以 Macroblock 為單位改變,畫面上每個 16x16 的區塊可以使用不同的量化倍數。每個 MB 改變這個 Quant 需要多幾個額外的 bit 紀錄,連續幾個 MB 都用同一個 Qunat 只需第一個 MB 記錄即可,用得好的話可以提高壓縮效率。例如畫面上極黑和極白的地方,人眼的分辨力會降低,看不出好壞,所以可以提高 Quantizer 壓縮,這個叫 Lumi masking 和 Darkness masking。或者是畫面上在很小的空間內有非常複雜的花紋樣式,例如纖細一絲一絲的頭髮,茂盛的草地等等,我們人眼也無法解析這麼複雜的細節資訊,所以可以提高 Quantizer,也就是根據材質的複雜程度(Texture complexity)來改變 Quantizer,叫做 Spatial complexity masking。或者是連續的畫面之間動態非常大,人眼對高動態的物體無法分辨其細節,所以可以提高 Quantizer,也就是根據 Motion Vector 動作向量的複雜程度來改變 Quantizer,叫做 Temporary complexity masking。 MPEG-4 的規格比較死,MB 和 MB 之間的 Quant 相差不可以差過 3(同 H.263),所以這方面的彈性不如 MPEG-2 來得大。 有使用 Adaptive Quant 的 Encoder,畫面的 Quantizer 不是固定的,而是每一個 MB 都可能不一樣,人眼比較容易注意到的地方壓好一點,不容易注意的地方壓差一點,最後整張畫面的平均 Quantizer 可能比原來高,但是視覺品質卻比原來好。這也是一個 Quantizer 和畫面品質不成反比的例子。 但是一般的情況下,固定品質 CQ 壓縮,壓出來的 Quantizer 越小,通常代表品質比較好。 想測 PSNR 的話,一樣可以用 Avisynth,如 orig=avisource("source_vfapi.avi").ConvertToYUY2() LoadPlugin("MPEG2Dec3.dll") encoded=MPEG2Source("target.d2v").YV12toYUY2(interlaced=false) compare(encoded, orig, "Y", "PSNR.LOG", false) 目前 Avisynth 只支援 YUY2 的 MPEG2Source compare,所以第一行原始 VFAPI 要轉成 YUY2,第三行 MPEG2Dec3 轉出來的 YV12 要 upsampling 到 YUY2(YU12toYUY2),後面括弧中的 interlace=false 是指訊源是 progressive 的,用 progressive frame 的 chroma upsampling。(因為 progressive frame 和 interlaced frame 的 chroma upsampling 方法不一樣。詳細原理小弟以前曾經提過,此處便不再贅述) 因為經過 upsampling 手續,最好只比較 Y channel 的 PSNR,不要比較 UV(chroma,色彩資訊)的 PSNR。通常來說,如果沒有意外的話,Encoder 沒有做錯,則 UV 的 PSNR 通常都會比 Y 高,而且高很多。一般的 MPEG Encoder 不會做 Chroma 平面上的動作檢索,Chroma 的 MV 動作向量是直接拿 Lumi(Y) 的 MV 除以二來使用的,所以我們直接拿 Y 的 PSNR 來比較即可。而且 UV 的影響力比 Y 弱很多,UV 的好壞通常不容易看出來,除非相差非常多,而大部分 Encoder 壓出來 UV 的 PSNR 都差不多,所以我們可以只用 Y 的 PSNR 作為品質好壞的指標。 學界測試的時候,一般也只列 Y 的 PSNR。 |
![]() |
![]() |
Senior Member
![]() ![]() ![]() 加入日期: Oct 2002 您的住址: El's room
文章: 1,046
|
測好的 LOG 檔可以用 Execl 讀取,每 10 個 Frame 平均一次,畫成漂亮的圖表,這樣子就更清楚了。
例如下面這張圖,比較的是 ProCoder 的 Frame 壓縮/ Field 壓縮,和 TMPGEnc 壓縮的 PSNR, 訊源是 Hi-8 拍的交錯畫面 ![]() |
![]() |
![]() |
Major Member
![]() 加入日期: Dec 2001
文章: 216
|
![]() 嗯...看的眼睛都花了..慢慢消化..
![]() 感謝前輩~~ ![]() |
![]() |
![]() |
Basic Member
加入日期: Feb 2003 您的住址: 台中
文章: 18
|
![]() 研究中~~
|
![]() |
![]() |