主要介紹函數resize();
圖像縮放的效果圖如下:
主程序代碼及函數解釋如下所示:
- /************************************************************************/
- /*
- OpenCV圖像縮放使用的函數是:resize
- void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
- 參數含義:
- InputArray src -原圖像
- OutputArray dst -輸出圖像
- Size dsize -目標圖像的大小
- double fx=0 -在x軸上的縮放比例
- double fy=0 -在y軸上的縮放比例
- int interpolation -插值方式,有以下四種方式
- INTER_NEAREST -最近鄰插值
- INTER_LINEAR -雙線性插值 (缺省使用)
- INTER_AREA -使用象素關系重采樣,當圖像縮小時候,該方法可以避免波紋出現。當圖像放大時,類似於 INTER_NN 方法。
- INTER_CUBIC -立方插值。
- 說明:dsize與fx和fy必須不能同時為零
- */
- /************************************************************************/
- #include <opencv2\opencv.hpp>
- #include <opencv2\imgproc\imgproc.hpp>
- using namespace cv;
- int main()
- {
- //讀入圖像
- Mat srcImage=imread("1.jpg");
- Mat temImage,dstImage1,dstImage2;
- temImage=srcImage;
- //顯示原圖
- imshow("原圖",srcImage);
- //尺寸調整
- resize(temImage,dstImage1,Size(temImage.cols/2,temImage.rows/2),0,0,INTER_LINEAR);
- resize(temImage,dstImage2,Size(temImage.cols*2,temImage.rows*2),0,0,INTER_LINEAR);
- imshow("縮小",dstImage1);
- imshow("放大",dstImage2);
- waitKey();
- return 0;
- }
1、最鄰近元法
這是最簡單的一種插值方法,不需要計算,在待求象素的四鄰象素中,將距離待求象素最近的鄰象素灰度賦給待求象素。設i+u, j+v(i, j為正整數, u, v為大於零小於1的小數,下同)為待求象素坐標,則待求象素灰度的值 f(i+u, j+v) 如下圖所示:
如果(i+u, j+v)落在A區,即u<0.5, v<0.5,則將左上角象素的灰度值賦給待求象素,同理,落在B區則賦予右上角的象素灰度值,落在C區則賦予左下角象素的灰度值,落在D區則賦予右下角象素的灰度值。
最鄰近元法計算量較小,但可能會造成插值生成的圖像灰度上的不連續,在灰度變化的地方可能出現明顯的鋸齒狀。
2、雙線性內插法
雙線性內插法是利用待求象素四個鄰象素的灰度在兩個方向上作線性內插,如下圖所示:
對於 (i, j+v),f(i, j) 到 f(i, j+1) 的灰度變化為線性關系,則有:
f(i, j+v) = [f(i, j+1) - f(i, j)] * v + f(i, j)
同理對於 (i+1, j+v) 則有:
f(i+1, j+v) = [f(i+1, j+1) - f(i+1, j)] * v + f(i+1, j)
從f(i, j+v) 到 f(i+1, j+v) 的灰度變化也為線性關系,由此可推導出待求象素灰度的計算式如下:
f(i+u, j+v) = (1-u) * (1-v) * f(i, j) + (1-u) * v * f(i, j+1) + u * (1-v) * f(i+1, j) + u * v * f(i+1, j+1)
雙線性內插法的計算比最鄰近點法復雜,計算量較大,但沒有灰度不連續的缺點,結果基本令人滿意。它具有低通濾波性質,使高頻分量受損,圖像輪廓可能會有一點模糊。
3、三次內插法
該方法利用三次多項式S(x)求逼近理論上最佳插值函數sin(x)/x, 其數學表達式為:
待求像素(x, y)的灰度值由其周圍16個灰度值加權內插得到,如下圖:
待求像素的灰度計算式如下:
f(x, y) = f(i+u, j+v) = ABC
其中:
三次曲線插值方法計算量較大,但插值后的圖像效果最好。