1. 程式人生 > >Opencv--影象金字塔

Opencv--影象金字塔

目標

理論

注意

下面的解釋屬於Bradski和Kaehler 的“ 學習OpenCV ”一書。

  • 通常我們需要將影象轉換成與原始影象不同的大小。為此,有兩個可能的選擇:升高影象(放大)或縮小(縮小)。
  • 雖然有一個幾何變換中的OpenCV函式-literally-調整影象大小(CV ::調整大小,我們將在以後的教程顯示),在該部分中,我們分析第一使用影象金字塔,這是在廣泛應用的視覺範圍廣泛的應用。

影象金字塔

  • 影象金字塔是由單個原始影象產生的影象的集合,它們被連續下采樣,直到達到一些所需的停止點。
  • 有兩種常見的影象金字塔:高斯金字塔:用於縮減影象拉普拉斯金字塔:用於從金字塔中較低的影象重建上取樣影象(解析度較低)
  • 在本教程中,我們將使用高斯金字塔。

高斯金字塔

  • 想象一下金字塔是一組層,層數越高,尺寸越小。

OpenCV影象金字塔

  • 每個層從底部到頂部編號,因此層(i+1)(表示為Gi+1)小於層i(Gi)。
  • 為了在高斯金字塔中產生層(i+1),我們做如下:

將Gi與高斯核心進行卷積:

OpenCV影象金字塔

刪除每個偶數行和列。

  • 您可以輕鬆注意到,所得到的影象將是其前身的四分之一。在輸入影象(原始影象)上迭代該過程產生整個金字塔。G0
  • 上面的過程對於縮小影象是有用的。如果我們想使它更大,怎麼辦?:填充零的列()0
  1. 首先,將影象大小增加到每個維度的兩倍,即新的偶數行和
  2. 用與上述相同的核心(乘以4)執行卷積近似“丟失畫素”的值
  • 這兩個過程(如上所述的下采樣和上取樣)由OpenCV函式
    cv :: pyrUp
    cv :: pyrDown實現,我們將在下面的程式碼示例中看到:

注意

當我們減小影象的大小時,我們實際上丟失了影象的資訊。

程式碼實現:

#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;
}

效果圖:

image_pyramid
DOG(高斯不同) ​​​