差分金字塔
1、原理
DOG金字塔的每1組第i層是由高斯金字塔的每1組第i+1層減每1組第i層得到的。以此類推,逐組逐層生成每一個差分圖像,所有差分圖像構成差分金字塔;每一組在層數上,DOG金字塔比高斯金字塔少一層。
DOG金字塔的構建可以用下圖描述:
2、 源碼實現
//差分金字塔
//如果直接imshow差分圖會顯示不出人眼看到的圖像,只有對這些DOG圖像進行歸一化,
//可以很明顯的看到差分圖像所蘊含的特征,并且有一些特征是在不同模糊程度、不同
//尺度下都存在的,這些特征正是Sift所要提取的“穩定”特征
void siftLou::DogPyramid(const vector<Mat>& gauss_pyr, vector<Mat>& dog_pyr, int octaves)
{int intervals = INTERVALS;for (int o = 0; o < octaves; o++){for (int i = 1; i < intervals + 3; i++){Mat mat;mat=Sub(gauss_pyr[o * (intervals + 3) + i], gauss_pyr[o * (intervals + 3) + i - 1]);dog_pyr.push_back(mat);}}
}
下圖是差分金字塔第一組第0/1層的實際顯示效果,其實這里邊包含了大量特征點信息,但是我們人眼已經分辨不出來了。
所以想要顯示出人眼識別的圖像,就要對DOG圖像進行歸一化,下圖是歸一化的圖:
?3、歸一化原理
void cv::normalize(InputArry src,InputOutputArray dst,min,max,int norm_type=NORM_L2,int dtype=-1,InputArray mark=noArry())函數作用:
歸一化數據。該函數分為范圍歸一化與數據值歸一化。(Normalizes the norm or value range of an array.)其實范圍歸一化和數值歸一化可以歸為一類,一般來說數值歸一化是指將數值歸一到[0,1]區間上,而范圍歸一化則指將數值歸一到[a,b]上,a,b為任意值。由此看出,數值歸一化是范圍歸一化的特例,包含在范圍歸一化中。參數說明:
src 輸入數組;
dst 輸出數組,數組的大小和原數組一致;
min 用來規范值或者規范范圍,并且是下限;
max 只用來規范范圍并且是上限,因此只在NORM_MINMAX中起作用;
norm_type 歸一化選擇的數學公式類型;
dtype 當為負,輸出在大小深度通道數都等于輸入,當為正,輸出只在深度與輸如不同,不同 的地方由dtype決定;
mark 掩碼。選擇感興趣區域,選定后只能對該區域進行操作。
對數組的歸一化的公式為:
?上式表示:設置的上限(max)與下限(min)的差除以數組中的最大值為公因子;
數組中歸一化后的每一個值=歸一化前的每一個值*公因子
示例:
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include<vector>
#include<Eigen/Core>
#include <corecrt_math_defines.h>
using namespace std;
using namespace cv;int main()
{//生成一個3*4的矩陣Mat M = Mat::eye(3,4,CV_8UC1);M.at<uchar>(2, 3) = 9;Mat m;normalize(M, m, 0, 255, NORM_MINMAX);cout <<"歸一化前數組:\n" <<M << endl;cout <<"歸一化后數組:\n" << m << endl;cv::waitKey(0);return 0;
}
?
總結
- 上一篇: c++中static_cast用法与uc
- 下一篇: ZigBee(CC2530)最小系统PC