1. 程式人生 > >OpenCV學習筆記(1)——resize函式實現影象大小歸一化

OpenCV學習筆記(1)——resize函式實現影象大小歸一化

在影象處理過程中,有時需要把影象調整到同樣大小,便於處理,這時需要用到影象resize()

原函式
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
前兩個引數分別為輸入和輸出影象。dsize表示輸出影象的大小,如果為0,則

dsize=Size(round(fx∗src.cols),round(fy∗src.rows))
dsize和fx、fy不能同時為0。fx、fy是沿x軸和y軸的縮放係數;預設取0時,計算如下
fx=(double)dsize.width/src.cols

fy=(double)dsize.height/src.rows
最優一個引數interpolation表示插值方式,有以下幾種:
INTER_NEAREST - 最近鄰插值
INTER_LINEAR - 線性插值(預設)
INTER_AREA - 區域插值
INTER_CUBIC - 三次樣條插值
INTER_LANCZOS4 - Lanczos插值

INTER_NEAREST最近鄰插值

目標如下的畫素點為對應的最近的原影象的畫素點。假設原影象大小為(s_height, s_width),目標影象大小為(d_height, d_width),那麼高度和寬度的縮放比例為h_ratio = s_height/d_height,w_ratio=s_width/d_width。

對面目標影象畫素:(x, y)其值等於原影象(x * w_ration, y * h_ration)處的值。

INTER_LINEAR 線性插值

預設使用。在使用最近鄰插值時,得到的座標未必是一個整數,例如
(xw_ration, yh_ration)=(10.5, 20.5),那麼可能取得座標點就有四種(10, 20)、(11, 20)、(10, 21)、(11, 21)。雙線性插值,會把這四個座標的畫素值加權求和。
D(x, y) = S(j, k) * w1 + S(j+1, k) w2 + S(j+1,k+1) w3 + S(j, K+1) * w4,其中w為權值。權值大小和計算位置的小數部分有關。

CV_INTER_AREA:區域插值

區域插值分為3種情況。影象放大時類似於線性插值,影象縮小時可以避免波紋出現。

INTER_CUBIC 三次樣條插值

使用4x4鄰域內的畫素雙3次插值。

INTER_LANCZOS4 Lanczos插值

使用8×8畫素鄰域的Lanczos插值

例項

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
#define NORM_WIDTH 230 //歸一化後的寬和高
#define NORM_HEIGHT 230
using namespace std;
using namespace cv;
int main(void)
{
 Mat src_img;
 string imgSrcPath = "pic";//使用相對路徑,圖片和程式碼儲存在相同的目錄下
 string imgSavePath = "pic_new";
 imgSrcPath += ".png";
 src_img = imread(imgSrcPath,1);
 namedWindow("Test");     //建立一個名為Test視窗
 imshow("Test",src_img);   //視窗中顯示影象
 waitKey(1000); 
 Mat dst_img_rsize(NORM_WIDTH,NORM_HEIGHT,src_img.type()); //建立Mat物件並指定大小和型別
 resize(src_img,dst_img_rsize,dst_img_rsize.size(),0,0,INTER_LINEAR);
 imshow("Test",dst_img_rsize);
 imgSavePath += ".png";
 waitKey(5000);
 imwrite(imgSavePath,dst_img_rsize);
 return 0;
}