在進行圖像縮放過程中,opencv中的resize函數是最常用的,其速度相對較快,隻需要一行代碼即可。此函數中提供5種縮放插值的方法。在下文中将進行對比。
1、resize函數簡介
參數含義
參數含義:
InputArray src -原圖像
OutputArray dst -輸出圖像
Size dsize -目标圖像的大小
double fx=0 -在x軸上的縮放比例
double fy=0 -在y軸上的縮放比例
int interpolation -插值方式,有以下5種方式
INTER_NEAREST -最近鄰插值
INTER_LINEAR -雙線性插值 (預設使用)
INTER_AREA -區域插值。
INTER_CUBIC -三次樣條插值,也叫立方插值(超過4*4像素鄰域内的雙三次插值)
INTER_LANCZOS4 -Lanczos插值(超過8*8像素鄰域的Lanczos插值)
2、算法對比
算法 | INTER_NEAREST | INTER_LINEAR | INTER_CUBIC | INTER_LANCZOS4 | INTER_AREA |
---|---|---|---|---|---|
主要思想 | 用距離采樣點最近的像素值最為采樣點的灰階值 | 用雙線性方式計算采樣點周圍的4個點,計算其灰階值 | 根據采樣點的周圍16個像素值的雙線性關系以及像素變化率,計算出采樣點的灰階值 | 在x,y方向分别對相鄰的八個點進行插值,也就是計算權重和,傅立葉變換有關的三角函數的方法 | 使用像素區域關系進行重采樣,圖像放大時類似于雙線性插值,縮放時類似于最近鄰插值 |
鋸齒現象 | 不可避免 | 可避免 | 可避免 | 可避免 | 可避免 |
周圍像素 | 未考慮 | 未考慮 | 已考慮 | 已考慮 | 已考慮 |
速度 | 最快 | 較快 | 一般 | 較慢 | 最慢 |
以上算法的速度統計存在幾個問題,具體需要應用者自己重新測試确定,但是此結果基本準确。問題主要有:
- 為考慮圖像的分辨率,尤其是INTER_AREA、INTER_CUBIC和INTER_LANCZOS4插值,圖像分辨率的大小對其有一定的影響,一般情況INTER_AREA效率低一些;
- 算法運作過程中,opencv内部進行了優化,是以實際時間有些許波動;
- 測試過程中,硬體裝置的幹擾;
3、總結
如果縮小圖像,INTER_AREA插值效果最好,而且可以有效防止産生波紋現象,如果放大圖像,通常使用INTER_CUBIC或是INTER_LANCZOS4,此兩種方法速度較慢,但效果相對較好。盡管INTER_NEAREST算法相當快,但使其效果大打折扣,一般很少使用。
值得注意的是INTER_LINEAR速度較快,效果一般,其會抑制圖像信号中的高頻分量(即圖像邊緣會變模糊)。對于要求不高的場景,可以考慮此算法,但是如果需要最大限度的保留圖像中的邊緣與其他特征(如角點等),且對程式的效率要求并不是很苛刻,則不建議優先使用此算法。