天天看點

OpenCV中resize()函數的插值方式對比

    在進行圖像縮放過程中,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方向分别對相鄰的八個點進行插值,也就是計算權重和,傅立葉變換有關的三角函數的方法 使用像素區域關系進行重采樣,圖像放大時類似于雙線性插值,縮放時類似于最近鄰插值
鋸齒現象 不可避免 可避免 可避免 可避免 可避免
周圍像素 未考慮 未考慮 已考慮 已考慮 已考慮
速度 最快 較快 一般 較慢 最慢

    以上算法的速度統計存在幾個問題,具體需要應用者自己重新測試确定,但是此結果基本準确。問題主要有:

  1. 為考慮圖像的分辨率,尤其是INTER_AREA、INTER_CUBIC和INTER_LANCZOS4插值,圖像分辨率的大小對其有一定的影響,一般情況INTER_AREA效率低一些;
  2. 算法運作過程中,opencv内部進行了優化,是以實際時間有些許波動;
  3. 測試過程中,硬體裝置的幹擾;

3、總結

    如果縮小圖像,INTER_AREA插值效果最好,而且可以有效防止産生波紋現象,如果放大圖像,通常使用INTER_CUBIC或是INTER_LANCZOS4,此兩種方法速度較慢,但效果相對較好。盡管INTER_NEAREST算法相當快,但使其效果大打折扣,一般很少使用。

    值得注意的是INTER_LINEAR速度較快,效果一般,其會抑制圖像信号中的高頻分量(即圖像邊緣會變模糊)。對于要求不高的場景,可以考慮此算法,但是如果需要最大限度的保留圖像中的邊緣與其他特征(如角點等),且對程式的效率要求并不是很苛刻,則不建議優先使用此算法。