1. 程式人生 > >【opencv學習之四十四】影象放縮與金字塔

【opencv學習之四十四】影象放縮與金字塔

在opencv中影象有時候過大導致進行操作時候資訊量過大,耗時較長,一般可以將影象壓縮,然後根據進行初步資訊搜尋,減少搜尋範圍,然後定位可能搜尋區域進行再次分析。opencv有對影象進行放大(向上取樣)和縮小(向下取樣)兩個函式PyrUp()和PyrDown(),可以直接操作。當然放大與縮小影象也有resize()函式,不過resize()的實現方式主要是各種插值法,而PyrUp和PyrDown用了很多卷積和權值相關的演算法。

以下摘自網上:

高斯金字塔:向下降取樣影象 
拉普拉斯金字塔:從低層影象中向上取樣重建影象。
具體的過程,我們可以這麼描述下:
高斯金字塔:金字塔從i層生成第i+1層,我們要先用高斯核對Gi進行卷積,然後,刪除所有偶數行和偶數列。這樣,新得到的影象面積會變為源影象的四分之一。迴圈上述過程,即可產生整個金字塔。
拉普拉斯金字塔:影象首先在每個維度上擴大為原來的兩倍,新增的行以0填充,然後給指定的濾波器進行卷積(實際上是一個在每一維上都擴大為2倍的過濾器)去估計“丟失”畫素的近似值。得到後的影象與原來的影象相比較會發覺比較模糊,丟失了一些資訊。為了恢復出原來的影象,我們需要獲得這些丟失的資訊,這些資訊就構成了拉普拉斯金字塔。

具體這三個函式演算法可以查相關資料,一下程式碼示例:

void PyrUpAndPyrDown()//影象金字塔放縮
{
    Mat srcImg = imread("D:/ImageTest/m.jpg"); //讀取圖片
    Mat dst1,dst2,dst3;
    imshow("img", srcImg); //顯示圖片
    pyrUp(srcImg, dst1,Size(srcImg.cols*2,srcImg.rows*2));//放大為原來的兩倍
    pyrDown(srcImg, dst2,Size(srcImg.cols/2,srcImg.rows/2));//縮小為原來的一半

    resize(srcImg,dst3,Size(),0.5,0.5);//將原影象寬高縮放為0.5.
    //    resize(srcImg,dstImg,Size(srcImg.cols/2,srcImg.rows/2),0,0);//同樣將影象縮小為0.5
    //dsize和fx、fy不能同時為0。fx、fy是沿x軸和y軸的縮放係數;
    //@param dsize output image size; if it equals zero, it is computed as:
    //\f[\texttt{dsize = Size(round(fx*src.cols), round(fy*src.rows))}\f]
    //    CV_EXPORTS_W void resize( InputArray src, OutputArray dst,
    //                              Size dsize, double fx = 0, double fy = 0,
    //                              int interpolation = INTER_LINEAR );
    //    INTER_NEAREST - 最近鄰插值
    //    INTER_LINEAR - 線性插值(預設)
    //    INTER_AREA - 區域插值
    //    INTER_CUBIC - 三次樣條插值
    //    INTER_LANCZOS4 - Lanczos插值

    imshow("imgUp", dst1); //顯示圖片
    imshow("imgDown", dst2); //顯示圖片
    imshow("imgResize", dst3); //顯示圖片
    waitKey(0); //暫停按鍵等待
}

效果如下: