Opencv(C++)笔记--图像金字塔

目录

1--图像金字塔的原理

2--图像金字塔的用途

3--Opencv API

3-1--拉普拉斯金字塔上采样

3-2--高斯金字塔下采样

3-3--代码实例

4--参考


1--图像金字塔的原理

        图像金字塔常用于图像缩放(resize)和图像分割当中,不同分辨率的图像以金字塔的形状排列。层级越高,图像越小,分辨率越低;层级越低、图像越大、分辨率越高;

Opencv(C++)笔记--图像金字塔_第1张图片

         图像金字塔是一副图像的多尺度表现,上采样得到尺寸较大的图像,分辨率逐渐提高,下采样得到尺寸较小的图像,分辨率逐渐降低;

2--图像金字塔的用途

① 用于特征点提取,赋予特征点尺度不变性特点:

        相同的物体在不同距离下拍摄,在图像上呈现不同尺度的大小。那么在原图中构建图像金字塔,模拟这种不同距离拍摄的现象,由此提取的特征点也具有尺度不变性。

② 用于模板匹配,减少匹配时间,提高效率:

        对模板和待匹配图像分别做图像金字塔,先从金字塔尖的图像开始匹配,由于分辨率较小,所以匹配时间较短,接着在此位置基础上,在下一层该位置周围局部区域继续进行匹配,直到最后一层完成匹配。整体思路为course-to-fine。

③ 用于光流跟踪,解决前后两帧相对运动距离过大的问题。

        在使用光流法进行图像特征点跟踪时,存在由于两帧图像运动过大,导致两帧图像相同的特征点不能被正确跟踪。为解决此问题可以引入图像金字塔,对两帧图像分别构建金字塔,从塔顶图像开始跟踪(例如原图两特征点相差16个像素,不能被跟踪,塔顶图像缩小8倍,那么塔顶的两帧图像的对应特征点对就相差2个像素,可以被跟踪),确定大概位置后,将该位置做为下一层金字塔图像的初值进行跟踪,直到金字塔最后一层。整体思路也可看做course-to-fine。         

3--Opencv API

3-1--拉普拉斯金字塔上采样

cv::pyrUp() 用于拉普拉斯金字塔上采样:

Opencv(C++)笔记--图像金字塔_第2张图片

3-2--高斯金字塔下采样

cv::pyrDown() 用于高斯金字塔下采样:

Opencv(C++)笔记--图像金字塔_第3张图片

3-3--代码实例

#include 
# include

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--参考

图像金字塔的几种用途

图像金字塔----高斯和拉普拉斯

你可能感兴趣的:(Opencv(C++)学习笔记,opencv,计算机视觉,人工智能)