Opencv--影象金字塔
阿新 • • 發佈:2018-12-12
目標
理論
注意
下面的解釋屬於Bradski和Kaehler 的“ 學習OpenCV ”一書。
- 通常我們需要將影象轉換成與原始影象不同的大小。為此,有兩個可能的選擇:升高影象(放大)或縮小(縮小)。
- 雖然有一個幾何變換中的OpenCV函式-literally-調整影象大小(CV ::調整大小,我們將在以後的教程顯示),在該部分中,我們分析第一使用影象金字塔,這是在廣泛應用的視覺範圍廣泛的應用。
影象金字塔
- 影象金字塔是由單個原始影象產生的影象的集合,它們被連續下采樣,直到達到一些所需的停止點。
- 有兩種常見的影象金字塔:高斯金字塔:用於縮減影象拉普拉斯金字塔:用於從金字塔中較低的影象重建上取樣影象(解析度較低)
- 在本教程中,我們將使用高斯金字塔。
高斯金字塔
- 想象一下金字塔是一組層,層數越高,尺寸越小。
- 每個層從底部到頂部編號,因此層(i+1)(表示為Gi+1)小於層i(Gi)。
- 為了在高斯金字塔中產生層(i+1),我們做如下:
將Gi與高斯核心進行卷積:
刪除每個偶數行和列。
- 您可以輕鬆注意到,所得到的影象將是其前身的四分之一。在輸入影象(原始影象)上迭代該過程產生整個金字塔。G0
- 上面的過程對於縮小影象是有用的。如果我們想使它更大,怎麼辦?:填充零的列()0
- 首先,將影象大小增加到每個維度的兩倍,即新的偶數行和
- 用與上述相同的核心(乘以4)執行卷積近似“丟失畫素”的值
- 這兩個過程(如上所述的下采樣和上取樣)由OpenCV函式
注意
當我們減小影象的大小時,我們實際上丟失了影象的資訊。
程式碼實現:
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; int main(int argc, char** argv) { Mat src,dst1,dst2; src = imread("C:/usr/opencv-test/Testpictures/sight.jpg"); if (!src.data) { printf("load image failed!\n"); return -1; } namedWindow("src image", CV_WINDOW_AUTOSIZE); imshow("src image", src); //上取樣 pyrUp(src, dst1, Size(src.cols * 2, src.rows * 2)); imshow("dst1 image", dst1); //降取樣 pyrDown(src, dst2, Size(src.cols / 2, src.rows / 2)); imshow("dst2 image", dst2); //DOG(高斯不同) Mat gray_src, g1, g2, dogImg; cvtColor(src, gray_src, CV_BGR2GRAY); GaussianBlur(gray_src, g1, Size(3, 3), 0, 0); //高斯模糊 GaussianBlur(g1, g2, Size(3, 3), 0, 0); subtract(g1, g2, dogImg, Mat()); //歸一化顯示 normalize(dogImg, dogImg, 255, 0, NORM_MINMAX); imshow("DOG Image", dogImg); waitKey(0); return 0; }
效果圖: