1、为什么要构建高斯金字塔
高斯金字塔模仿的是图像的不同的尺度,尺度应该怎样理解?对于一副图像,你近距离观察图像,与你在一米之外观察,看到的图像效果是不同的,前者比较清晰,后者比较模糊,前者比较大,后者比较小,通过前者能看到图像的一些细节信息,通过后者能看到图像的一些轮廓的信息,这就是图像的尺度,图像的尺度是自然存在的,并不是人为创造的。好了,到这里我们明白了,其实以前对一幅图像的处理还是比较单调的,因为我们的关注点只落在二维空间,并没有考虑到“图像的纵深”这样一个概念,如果将这些内容考虑进去我们是不是会得到更多以前在二维空间中没有得到的信息呢?于是高斯金字塔横空出世了,它就是为了在二维图像的基础之上,榨取出图像中自然存在的另一个维度:尺度。因为高斯核是唯一的线性核,也就是说使用高斯核对图像模糊不会引入其他噪声,因此就选用了高斯核来构建图像的尺度。
2、高斯金字塔的构建步骤:
高斯金字塔构建过程中,一般首先将图像扩大一倍,在扩大的图像的基础之上构建高斯金字塔,然后对该尺寸下图像进行高斯模糊,几幅模糊之后的图像集合构成了一个八度,然后对该八度下的最模糊的一幅图像进行下采样的过程,长和宽分别缩短一倍,图像面积变为原来四分之一。这幅图像就是下一个八度的初始图像,在初始图像图像的基础上完成属于这个八度的高斯模糊处理,以此类推完成整个算法所需要的所有八度(octave)构建,这样这个高斯金字塔就构建出来了。构建出的金字塔如下图所示:
注意:
1.在同一组内,不同层图像的尺寸是一样的,后一层图像的高斯平滑因子σ是前一层图像平滑因子的k倍;k=2^(1/s);s为想要得到的尺度结果;
2.在不同组内,后一组第一个图像是前一组倒数第三个图像的二分之一采样,图像大小是前一组的一半,尺度虽然保持不变,但是相当于扩大到了2倍,以此使尺度连续;
3.第一个八度的中图像的尺度分别是δ,kδ,k^2δ……,第二个八度的尺度分别是2δ,2kδ,2k^2δ……..,同理第三个八度的尺度分别是4δ,4kδ,4k^2δ……..。这个序列是通过下式来确定的:
3、源码实现
//金字塔每层多张图像合称为一组(Octave),金字塔每层只有一组图像,
//组数和金字塔层数相等,每组含有多张(也叫层Interval)图像。
//高斯金字塔
//https://blog.csdn.net/qq_44771627/article/details/123840316
void siftLou::GaussianPyramid(const Mat src, vector<Mat>& gauss_pyr, int octaves)
{
//高斯金字塔构建过程中,一般首先将图像扩大一倍,在扩大的图像的基础之上构建高斯
//金字塔,然后对该尺寸下图像进行高斯模糊,几幅模糊之后的图像集合构成了一个八度,
//然后对该八度下的最模糊的一幅图像进行下采样的过程,长和宽分别缩短一倍,图像面
//积变为原来四分之一。这幅图像就是下一个八度的初始图像,在初始图像图像的基础上
//完成属于这个八度的高斯模糊处理,以此类推完成整个算法所需要的所有八度构建,这样
//这个高斯金字塔就构建出来了。
Mat dst;
double sigma_init = sqrt(SIGMA * SIGMA - (INIT_SIGMA) * (INIT_SIGMA));
GaussianBlur(src, dst, Size(0, 0), sigma_init);
int intervals = INTERVALS;
double* sigmas = new double[intervals + 3];
double k = pow(2.0, 1.0 / intervals);
//每三个尺度一组进行匹配,因此想要得到3个尺度结果,就需要5个尺度拉普拉斯卷积和,
//也就是6个高斯函数卷积的图像
sigmas[0] = SIGMA;
double sig_prev, sig_total;
for (int i = 1; i < intervals + 3; i++)
{
sig_prev = pow(k, i - 1) * SIGMA;
sig_total = sig_prev * k;
//为了降低运算,将大尺度的高斯算子拆分为2个小尺度高斯算子的卷积
sigmas[i] = sqrt(sig_total * sig_total - sig_prev * sig_prev);
}
for (int o = 0; o < octaves; o++)
{
//每组多三层
for (int i = 0; i < intervals + 3; i++)
{
Mat mat;
if (o == 0 && i == 0)
{
mat=dst.clone();
}
else if (o != 0 && i == 0)
{
//前一组的倒数第三张图像:k^3*sigma=2*sigma,所以对它下采样会得到连续的尺度结果
//尺度虽然保持不变,但是相当于扩大到了2倍,等价于2*sigma,使得拉普拉斯尺度连续
//mat=DownSample(gauss_pyr[o * (intervals + 3) - 3]);
pyrDown(gauss_pyr[o*(intervals+3)-3],mat);
}
else
{
//每组中下一层由上一层高斯模糊得到
GaussianBlur(gauss_pyr[(o * (intervals + 3) + i - 1)], mat, Size(0,0),(sigmas[i]));
}
gauss_pyr.push_back(mat);
}
}
delete[] sigmas;
}
今天的文章高斯金字塔_高斯的资料「建议收藏」分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/75613.html