目录
1--图像金字塔的原理
2--图像金字塔的用途
3--Opencv API
3-1--拉普拉斯金字塔上采样
3-2--高斯金字塔下采样
3-3--代码实例
4--参考
1--图像金字塔的原理
图像金字塔常用于图像缩放(resize)和图像分割当中,不同分辨率的图像以金字塔的形状排列。层级越高,图像越小,分辨率越低;层级越低、图像越大、分辨率越高;
图像金字塔是一副图像的多尺度表现,上采样得到尺寸较大的图像,分辨率逐渐提高,下采样得到尺寸较小的图像,分辨率逐渐降低;
2--图像金字塔的用途
① 用于特征点提取,赋予特征点尺度不变性特点:
相同的物体在不同距离下拍摄,在图像上呈现不同尺度的大小。那么在原图中构建图像金字塔,模拟这种不同距离拍摄的现象,由此提取的特征点也具有尺度不变性。
② 用于模板匹配,减少匹配时间,提高效率:
对模板和待匹配图像分别做图像金字塔,先从金字塔尖的图像开始匹配,由于分辨率较小,所以匹配时间较短,接着在此位置基础上,在下一层该位置周围局部区域继续进行匹配,直到最后一层完成匹配。整体思路为course-to-fine。
③ 用于光流跟踪,解决前后两帧相对运动距离过大的问题。
在使用光流法进行图像特征点跟踪时,存在由于两帧图像运动过大,导致两帧图像相同的特征点不能被正确跟踪。为解决此问题可以引入图像金字塔,对两帧图像分别构建金字塔,从塔顶图像开始跟踪(例如原图两特征点相差16个像素,不能被跟踪,塔顶图像缩小8倍,那么塔顶的两帧图像的对应特征点对就相差2个像素,可以被跟踪),确定大概位置后,将该位置做为下一层金字塔图像的初值进行跟踪,直到金字塔最后一层。整体思路也可看做course-to-fine。
3--Opencv API
3-1--拉普拉斯金字塔上采样
cv::pyrUp() 用于拉普拉斯金字塔上采样:
3-2--高斯金字塔下采样
cv::pyrDown() 用于高斯金字塔下采样:
3-3--代码实例
#include <opencv2/opencv.hpp>
# include<cstdio>
int main(int argc, char** argv){
cv::Mat src;
src = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/test1.jpg");
if (src.empty()){
printf("could not load image..\n");
return -1;
}
cv::imshow("input", src);
cv::Mat up_dst, down_dst;
cv::pyrUp(src, up_dst); // 上采样
cv::pyrDown(src, down_dst); // 下采样
cv::imshow("pyrUp", up_dst);
cv::imshow("pyrDown", down_dst);
cv::waitKey(0);
return 0;
}
4--参考
图像金字塔的几种用途
图像金字塔----高斯和拉普拉斯