【opencv學習之四十四】影象放縮與金字塔
阿新 • • 發佈:2019-02-01
在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); //暫停按鍵等待 }
效果如下: