赞
踩
古人有句成语,叫做“一叶障目”,那是因为叶子放在眼前了,如果叶子离着很远,自然就不会障目了。下面引入本篇的话题:图像处理中的多尺度分析。
首先要有的概念就是:多尺度是真实存在的,而不是凭空臆想出来的。人眼在观察事物时,如果离着太远(尺度太小),就看不清细节;如果离着太近(尺度太大),细节是看清了,但可能局限于细节了。所以,为了观察到感兴趣的区域,多尺度是很有必要的。可以详见维基对"scale space"的解释:https://en.wikipedia.org/wiki/Scale_space.
传统的图像金字塔是通过降采样加平滑得到的。首先将原始图像作为最底层图像G0(第0层),利用高斯核函数对其进行卷积,然后对卷积后的图像进行下采样,得到上一层的图像G1(第1层),重复上面的卷积和下采样操作,反复迭代多次,便得到一个金字塔形的多层图像。自下而上每一层的像素数都不断减少,变得越来越粗糙,进行高斯平滑操作是为了降采样后的像素点能更好地代表原图像的像素点。
上图中,左边为高斯卷积核,右边为图像金字塔的形象说明,图像金字塔中所有图像来源于同一张原始图像,通过多次向下采样获得,直到达到某个终止条件。常用的图像金字塔有两种:高斯金字塔和拉普拉斯金字塔。
高斯金字塔的当前层图像就是对其前一层图像首先进行高斯低通滤波,然后再隔行和隔列降采样生成。前一层图像大小依次为当前层图像大小的4倍,多次向下采样得到的图像序列。Opencv中pyrdown函数可以获得高斯金字塔。
- bool buildGaussianPyramid(const cv::Mat &img,
- const int levels,
- std::vector<cv::Mat_<cv::Vec3f> > &pyramid)
- {
- if (levels < 1){
- perror("Levels should be larger than 1");
- return false;
- }
- pyramid.clear();
- cv::Mat currentImg = img;
- for (int l=0; l<levels; l++) {
- cv::Mat down;
- cv::pyrDown(currentImg, down);
- pyramid.push_back(down);
- currentImg = down;
- }
- return true;
- }
高斯金字塔的每一层图像减去上一层图像上采样+高斯卷积之后的图像,得到的差值图像即为拉普拉斯金字塔当前层图像。opencv中pyrup函数可以得到拉普拉斯金字塔。
- bool buildLaplacianPyramid(const cv::Mat &img, const int levels,
- std::vector<cv::Mat_<cv::Vec3f> > &pyramid)
- {
- if (levels < 1){
- perror("Levels should be larger than 1");
- return false;
- }
- pyramid.clear();
- cv::Mat currentImg = img;
- for (int l=0; l<levels; l++) {
- cv::Mat down,up;
- pyrDown(currentImg, down);
- pyrUp(down, up, currentImg.size());
- cv::Mat lap = currentImg - up;
- pyramid.push_back(lap);
- currentImg = down;
- }
- pyramid.push_back(currentImg);
- return true;
- }
2.1高斯金字塔:
Sift算法中提出的高斯金字塔不同于上面提到的传统金字塔结构,它是由很多组(Octave)构成,每组都包含若干层(Interval)。sift算法中高斯金字塔的构建过程为:
1. 将原图像扩大一倍之后作为高斯金字塔的第1组第1层,将第1组第1层图像经高斯卷积之后作为第1组金字塔的第2层,高斯卷积函数为:
对于参数σ,在Sift算子中取的是固定值1.6。
2. 将σ乘以比例系数k,新的平滑因子σ=k*σ,用它来平滑第1组第2层图像,得到第3层。
3. 重复第2步操作,直到得到第L层图像。在同一组中,每一层图像的尺寸是一样的,平滑系数不一样。平滑系数分别为:0,σ,kσ,k^2σ,k^3σ……k^(L-2)σ。
4. 将第1组倒数第三层图像作比例因子为2的降采样,得到的图像作为第2组的第1层,然后对第2组的第1层图像做平滑因子为σ的高斯平滑,得到第2组的第2层,就像步骤2中一样,如此得到第2组的L层图像,同组内它们的尺寸是一样的,对应的平滑系数分别为:0,σ,kσ,k^2σ,k^3σ……k^(L-2)σ。但是在尺寸方面第2组是第1组图像的一半。
反复执行,就可以得到一共O组,每组L层,共计O*L个图像,这些图像一起就构成了高斯金字塔,如下:
特别注意:传统金字塔与sift算法提到的金字塔,最最重要的区别在于多尺度与多分辨率的区分。传统金字塔的层与层之间的图像结构分辨率是不同的,sift算法中,同一组(octave)中的多层图像分辨率是相同的,只是高斯平滑时使用的参数不同,但这并不影响分辨率。
目前多尺度在图像处理方面有很多的应用,诸如图像融合,细节增强,Sift算法等。这里提一个很有趣的应用,是MIT的牛人用传统金字塔用于提取细微变化,具体请参见:《Eulerian Video Magnification for Revealing Subtle Changes in the World》
没有做过图像融合这方面的测试,暂时在网上找到的关于金字塔算法在图像融合方面的应用:
http://blog.csdn.net/touch_dream/article/details/62419496
http://blog.csdn.net/abcjennifer/article/details/7628655
看sift算法的介绍,评价很高,可以说是里程碑式的算法,后面认真研究研究,这里po几篇sift算法的介绍和算法实现:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。