opencv圖像金字塔

我們可以使用下面的函數來將某種size的圖像轉換爲另一種size的圖像:
(1)、resize函數

void resize(InputArray src,OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )

第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。
第二個參數,OutputArray類型的dst,輸出圖像,當其非零時,有着dsize(第三個參數)的尺寸,或者由src.size()計算出來。
第三個參數,Size類型的dsize,輸出圖像的大小;如果它等於零,由下式進行計算:

其中,dsize,fx,fy都不能爲0。
第四個參數,double類型的fx,沿水平軸的縮放係數,有默認值0,且當其等於0時,由下式進行計算:
 
第五個參數,double類型的fy,沿垂直軸的縮放係數,有默認值0,且當其等於0時,由下式進行計算:

第六個參數,int類型的interpolation,用於指定插值方式,默認爲INTER_LINEAR(線性插值)。
可選的插值方式如下:
INTER_NEAREST - 最近鄰插值
INTER_LINEAR - 線性插值(默認值)
INTER_AREA - 區域插值(利用像素區域關係的重採樣插值)
INTER_CUBIC –三次樣條插值(超過4×4像素鄰域內的雙三次插值)
INTER_LANCZOS4 -Lanczos插值(超過8×8像素鄰域的Lanczos插值)
若要縮小圖像,一般情況下最好用CV_INTER_AREA來插值,
而若要放大圖像,一般情況下最好用CV_INTER_CUBIC(效率不高,慢,不推薦使用)或CV_INTER_LINEAR(效率較高,速度較快,推薦使用)。

(2)、pyrUp和pyrDown函數

void pyrUp(InputArray src, OutputArraydst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT )

第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。
第二個參數,OutputArray類型的dst,輸出圖像,和源圖片有一樣的尺寸和類型。
第三個參數,const Size&類型的dstsize,輸出圖像的大小;有默認值Size(),即默認情況下,由Size(src.cols*2,src.rows*2)來進行計算,且一直需要滿足下列條件:

第四個參數,int類型的borderType,又來了,邊界模式,一般我們不用去管它。

 void pyrDown(InputArray src,OutputArray dst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT)

第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。
第二個參數,OutputArray類型的dst,輸出圖像,和源圖片有一樣的尺寸和類型。
第三個參數,const Size&類型的dstsize,輸出圖像的大小;有默認值Size(),即默認情況下,由Size Size((src.cols+1)/2, (src.rows+1)/2)來進行計算,且一直需要滿足下列條件:

該pyrDown函數執行了高斯金字塔建造的向下採樣的步驟。首先,它將源圖像與如下內核做卷積運算:
 
 
接着,它便通過對圖像的偶數行和列做插值來進行向下採樣操作。

#define _PYRAMMID_
#ifdef  _PYRAMMID_

void usage_resize()
{
    Mat  src = imread("./smimage/1.jpg");
    Mat  dst;
    dst.create(Size(src.size().width/2,src.size().height/2), src.type());
    resize(src, dst,dst.size());

    //show images
    imshow("SRC", src);
    imshow("DST", dst);
    waitKey(0);
}

void usage_pyrUp()
{
    Mat src, dst;
    src = imread("./smimage/h.jpg");
    pyrUp(src, dst);
    imshow("src", src);
    imshow("dst", dst);
    waitKey(0);

}

void usage_pyrDown()
{
    Mat src, dst;
    src = imread("./smimage/h.jpg");
    pyrDown(src, dst);
    imshow("src", src);
    imshow("dst", dst);
    waitKey(0);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章