一、什么是resize 函數:
resize函數opencv中專門用來調整圖像大小的函數;
opencv 提供五種方法供選擇分別是:
a.最近鄰插值——INTER_NEAREST;
b.線性插值 ——INTER_LINEAR;(默認值)
c.區域插值 ——INTER_AREA;(利用像素區域關系的重采樣插值)
d.三次樣條插值——INTER_CUBIC(超過4*4像素鄰域內的雙三次插值)
e.Lanczos插值——INTER_LANCZOS4(超過8*8像素鄰域的Lanczos插值)
一般來說要縮小圖像用區域插值(INTER_AREA);要放大圖像一般用三次樣條插值(INTER_CUBIC)或者線性插值(INTER_LINEAR);
二、resize 5類算法的公式:
以下圖來說明假設下圖的大小為m*n ,想通過resize 函數把尺度變化為m1*n1;
a.最近鄰插值:
b.線性插值(雙線性插值):
其中:u v 是相當於放縮后的圖像Dst相對於原圖像Src中對應位置的小數部分;用的是最近鄰插的公式;
c.區域插值: 當放大圖像時類似最近鄰插值,當縮小圖像時候有不同的結果;能有效避免波紋出現;
d.三次樣條插值(雙三次插值):使用的是4*4鄰域的像素雙3次插值 從(i-1,j-1)到(i+2,j+2)所有點的插值運算結果公式如下圖:
其中S(x)是對 sin(x*pi)/x 的逼近,為插值核;
e.Lanczos插值:
其中:i,j 為縮放前的位置,水平相位值PH0 、PH1、PH2、PH3,垂直相位值PV0、PV1、PV2、PV3。具體如下圖所示
三、函數申明格式:
C++:void resize (InputArray src, OutputArray dst,Size dsize,double fx=0;double fy=0,int interpolation=INTER_LINEAR);
第一個參數:為輸入圖像;
第二個參數:為輸出圖像;
第三個參數:輸出圖像的大小;
第四個參數:沿着水平軸的縮放系數;
第五個參數:沿着垂直軸的縮放系數;
第六個參數:插值方式默認為 INTER_LINEAR 線性插值;
四、具體的實驗數據結果:
選取圖像的數據為3*3矩陣[5,3,1,1,1,1,0,1,0];擴大到6*6的矩陣結果圖
選取圖像的數據為6*6矩陣縮小到3*3矩陣的結果圖
結論:對於放大圖像來說方法越復雜,求出來的數據效果越好,同樣的計算時間也會提高(后面會驗算時間),區域插值結果與最近鄰插結果一樣;
對於縮小圖像來說方法越復雜,求出來的數據效果越好,同樣的計算時間也會提高(后面會驗算時間),區域插值結果與線性插值結果一樣;
五、具體圖像運算結果
縮小圖像用區域插值;放大圖像用三次樣條插值(速度慢);線性插值(速度快);
六、算法的具體時間測試,用一張400*400的圖像進行測試: 單位是 MS 用的clock_t 函數測試 循環100次然后 折算成MS
縮小成200*200像素圖像的測試結果
最近鄰插 雙插線性
區域插值
雙三插值
LANCZOS4
擴大成為 800*800像素圖像的測試結果
最近鄰插 雙插線性
區域插值
雙三插值
LANCZOS4
PS:如果自己計算會發現結果不正確,根源在於圖像中心opencv修正過;修正公式為: