差分金字塔

1、原理

DOG金字塔的每1组第i层是由高斯金字塔的每1组第i+1层每1组第i层得到的。以此类推,逐组逐层生成每一个差分图像,所有差分图像构成差分金字塔;每一组在层数上,DOG金字塔比高斯金字塔少一层。

DOG金字塔的构建可以用下图描述:

2、 源码实现

//差分金字塔
//如果直接imshow差分图会显示不出人眼看到的图像,只有对这些DOG图像进行归一化,
//可以很明显的看到差分图像所蕴含的特征,并且有一些特征是在不同模糊程度、不同
//尺度下都存在的,这些特征正是Sift所要提取的“稳定”特征
void siftLou::DogPyramid(const vector& gauss_pyr, vector& 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层的实际显示效果,其实这里边包含了大量特征点信息,但是我们人眼已经分辨不出来了。

差分金字塔_第1张图片

所以想要显示出人眼识别的图像,就要对DOG图像进行归一化,下图是归一化的图:

差分金字塔_第2张图片

 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 掩码。选择感兴趣区域,选定后只能对该区域进行操作。

对数组的归一化的公式为:

\frac{(max-min)}{max(M)}*max(M)

 上式表示:设置的上限(max)与下限(min)的差除以数组中的最大值为公因子;

数组中归一化后的每一个值=归一化前的每一个值*公因子

示例:

#include 
#include 
#include 
#include 
#include
#include
#include 
using namespace std;
using namespace cv;

int main()
{
	//生成一个3*4的矩阵
	Mat M = Mat::eye(3,4,CV_8UC1);
	M.at(2, 3) = 9;
	Mat m;
	normalize(M, m, 0, 255, NORM_MINMAX);
	cout <<"归一化前数组:\n" <

差分金字塔_第3张图片

 

你可能感兴趣的:(sift,opencv,c++)