目录
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--参考
转载:https://blog.csdn.net/weixin_43863869/article/details/128366238