經常用到ffmpeg中的sws_scale來進行影象縮放和格式轉換,該函式可以使用各種不同演算法來對影象進行處理。以前一直很懶,懶得測試和甄別應該使用哪種演算法,最近的工作時間,很多時候需要等待別人。忙裡偷閒,對ffmpeg的這一組函式進行了一下封裝,順便測試了一下各種演算法。
簡單說一下測試環境,我使用的是dell的品牌機,i5的cpu。ffmpeg是2023年8月左右的當時最新版本編譯而成,我使用的是其靜態庫版本。
sws_scale的演算法有如下這些選擇。
#define sws_fast_bilinear 1
#define sws_bilinear 2
#define sws_bicubic 4
#define sws_x 8
#define sws_point 0x10
#define sws_area 0x20
#define sws_bicublin 0x40
#define sws_gauss 0x80
#define sws_sinc 0x100
#define sws_lanczos 0x200
#define sws_spline 0x400
首先,將一幅1920*1080的風景影象,縮放為400*300的24位rgb,下面的幀率,是指每秒鐘縮放並渲染的次數。(經過我的測試,渲染的時間可以忽略不計,主要時間還是耗費在縮放演算法上。)
演算法
幀率
影象主觀感受
sws_fast_bilinear
影象無明顯失真,感覺效果很不錯。
sws_bilinear
感覺也很不錯,比上乙個演算法邊緣平滑一些。
sws_bicubic
感覺差不多,比上上演算法邊緣要平滑,比上一演算法要銳利。
sws_x
與上一影象,我看不出區別。
sws_point
細節比較銳利,影象效果比上圖略差一點點。
sws_area
與上上演算法,我看不出區別。
sws_bicublin
同上。sws_gauss
相對於上一演算法,要平滑(也可以說是模糊)一些。
sws_sinc
相對於上一演算法,細節要清晰一些。
sws_lanczos
相對於上一演算法,要平滑(也可以說是模糊)一點點,幾乎無區別。
sws_spline
和上乙個演算法,我看不出區別。
總評,以上各種演算法,縮小之後的效果似乎都不錯。如果不是對比著看,幾乎看不出縮放效果的好壞。上面所說的清晰(銳利)與平滑(模糊),是一種客觀感受,並非清晰就比平滑好,也非平滑比清晰好。其中的point演算法,效率之高,讓我震撼,但效果卻不差。此外,我對比過使用cimage的繪製時縮放,其幀率可到190,但效果慘不忍睹,顏色嚴重失真。
第二個試驗,將一幅1024*768的風景影象,放大到1920*1080,並進行渲染(此時的渲染時間,雖然不是忽略不計,但不超過5ms的渲染時間,不影響下面結論的相對準確性)。
演算法
幀率
影象主觀感受
sws_fast_bilinear
影象無明顯失真,感覺效果很不錯。
sws_bilinear
和上圖看不出區別。
sws_bicubic
相對上圖,感覺細節清晰一點點。
sws_x
與上上圖無區別。
sws_point
邊緣有明顯鋸齒。
sws_area
邊緣有不明顯鋸齒。
sws_bicublin
與上上上圖幾乎無區別。
sws_gauss
比上圖邊緣略微清楚一點。
sws_sinc
與上上圖無區別。
sws_lanczos
與上圖無區別。
sws_spline
與上圖無區別。
總評,point演算法有明顯鋸齒,area演算法鋸齒要不明顯一點,其餘各種演算法,肉眼看來無明顯差異。此外,使用cimage進行渲染時縮放,幀率可達105,效果與point相似。
當然,如果不計速度追求畫面質量。在上面的演算法中,選擇幀率最低的那個即可,畫面效果一般是最好的。
不過總的來說,ffmpeg的scale演算法,速度還是非常快的,畢竟我選擇的素材可是高畫質的。
(本想順便上傳一下,但各組差異其實非常小,恐怕上傳的時候格式轉換所造成的影象細節丟失,已經超過了各本身的細節差異,因此此處不上傳了。)
注:試驗了一下opencv的resize效率,和上面相同的情況下,opencv在上面的放大試驗中,每秒可以進行52次,縮小試驗中,每秒可以進行458次。
更新(2014.8.5)***************=
ffmpeg使用不同sws_scale()縮放演算法的命令示例(bilinear,bicubic,neighbor):
ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags bilinear -pix_fmt yuv420p src01_bilinear_1280x720.yuv
ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags bicubic -pix_fmt yuv420p src01_bicubic_1280x720.yuv
ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags neighbor -pix_fmt yuv420p src01_neighbor_1280x720.yuv
ffmpeg中的sws scale演算法效能測試
經常用到ffmpeg中的sws scale來進行影象縮放和格式轉換,該函式可以使用各種不同演算法來對影象進行處理。以前一直很懶,懶得測試和甄別應該使用哪種演算法,最近的工作時間,很多時候需要等待別人。忙裡偷閒,對ffmpeg的這一組函式進行了一下封裝,順便測試了一下各種演算法。簡單說一下測試環境,我...
ffmpeg中的sws scale演算法效能測試
經常用到ffmpeg中的sws scale來進行影象縮放和格式轉換,該函式可以使用各種不同演算法來對影象進行處理。以前一直很懶,懶得測試和甄別應該使用哪種演算法,最近的工作時間,很多時候需要等待別人。忙裡偷閒,對ffmpeg的這一組函式進行了一下封裝,順便測試了一下各種演算法。簡單說一下測試環境,我...
ffmpeg中的sws scale演算法效能測試
from 經常用到ffmpeg中的sws scale來進行影象縮放和格式轉換,該函式可以使用各種不同演算法來對影象進行處理。以前一直很懶,懶得測試和甄別應該使用哪種演算法,最近的工作時間,很多時候需要等待別人。忙裡偷閒,對ffmpeg的這一組函式進行了一下封裝,順便測試了一下各種演算法。簡單說一下測...