10.1高斯金字塔-向下取样

在OpenCV中,高斯金字塔(Gaussian Pyramid)是一种用于表示同一图像在不同分辨率下的图像结构。高斯金字塔在计算机视觉和图像处理中非常有用,特别是在特征检测、图像匹配、物体检测等任务中。高斯金字塔的构建通常包括两步:先对图像进行高斯滤波,然后进行向下取样。

高斯金字塔的构建过程

1. 高斯滤波:对原始图像进行高斯滤波,以平滑图像并去除高频噪声。

2. 向下取样:对滤波后的图像进行降采样,通常是通过每隔一个像素取一个像素点来实现。

高斯金字塔的应用

高斯金字塔在计算机视觉中有广泛的应用,例如:

1. 特征检测:在不同尺度上检测特征点,例如 SIFT、SURF 等。

2. 图像融合:在不同分辨率下进行图像融合,以获得高质量的图像。

3. 图像压缩:通过多分辨率表示图像,可以进行更高效的图像压缩。

4. 图像匹配:在不同尺度上匹配图像,提高匹配的鲁棒性。

高斯金字塔的具体实现

在OpenCV中,高斯金字塔的实现主要依赖于 cv::pyrDown 函数,该函数用于从一个层生成下一个层的图像。下面是一个详细的示例代码,展示如何构建高斯金字塔并进行向下取样。

示例代码1

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    // 读取原始图像
    cv::Mat img = cv::imread("path/to/image.jpg");
    if (img.empty())
    {
        std::cerr << "Error loading image." << std::endl;
        return -1;
    }

    // 创建高斯金字塔
    std::vector<cv::Mat> pyramids;
    cv::Mat currentLayer = img;

    // 构建金字塔
    int numLevels = 3; // 定义金字塔的层数
    for (int level = 0; level < numLevels; ++level)
    {
        // 高斯滤波并向下取样
        cv::pyrDown(currentLayer, currentLayer);

        // 将当前层添加到金字塔中
        pyramids.push_back(currentLayer);

        // 显示当前层
        cv::namedWindow("Level " + std::to_string(level), cv::WINDOW_NORMAL);
        cv::imshow("Level " + std::to_string(level), currentLayer);

        cv::waitKey(0); // 等待用户按键继续
    }

    // 等待用户按键退出
    cv::waitKey(0);

    return 0;
}

代码解释
1. 读取图像:使用 cv::imread 函数读取原始图像。
2. 初始化金字塔:创建一个向量 pyramids 用于存储金字塔的每一层。
3. 构建金字塔:循环构建多个层次的金字塔。
在每次迭代中:
•对当前层进行高斯滤波并降采样(使用 cv::pyrDown 函数)。
•将当前层添加到金字塔向量中。
•显示当前层的图像。
4. 显示图像:在每次构建完一层后,使用 cv::imshow 函数显示当前层的图像,并使用 cv::waitKey(0) 等待用户按键继续。
cv::pyrDown 

函数cv::pyrDown 函数用于将图像向下采样,通常将图像尺寸减半。
该函数的原型如下:


void cv::pyrDown(InputArray src, OutputArray dst, 
        const Size& dstsize = Size(), int borderType = BORDER_DEFAULT);

•src:输入图像。
•dst:输出图像。
•dstsize:输出图像的尺寸,默认为输入图像尺寸的一半。
•borderType:边界处理类型,默认为 BORDER_DEFAULT。

运行结果1

可以看到放大后一次比一次模糊

高斯金字塔的示例

假设我们有一个原始图像,我们可以构建一个包含三个层次的高斯金字塔:

1. 原始图像:尺寸为 W \times H。

2. 第一层:尺寸为 \frac{W}{2} \times \frac{H}{2}。

3. 第二层:尺寸为 \frac{W}{4} \times \frac{H}{4}。

4. 第三层:尺寸为 \frac{W}{8} \times \frac{H}{8}。

总结

通过上述方法,你可以使用OpenCV在C++中构建高斯金字塔,并对其进行逐层向下取样。这对于后续的图像处理任务,如特征检测、图像匹配等非常有用。

注意事项

•层数:可以根据需要调整金字塔的层数。

•显示图像:在每次构建完一层后,可以使用 cv::imshow 函数显示当前层的图像,以便观察金字塔的构建过程。

•边界处理:默认的边界处理类型为 BORDER_DEFAULT,可以根据需要调整边界处理方式。通过构建高斯金字塔,你可以有效地处理多分辨率图像,这对于提高算法的鲁棒性和效率非常重要。

示例代码2

10.1图像向下采样一次

// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;
using namespace std;

//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 

int main()
{
	Mat img, dst;
	//读取原始图像
	img = imread("3.jpeg", IMREAD_COLOR);
	if (img.empty())
	{
		cout << "图像读取错误!" << endl;
	}
	//图像向下取样
	pyrDown(img, dst);
	//显示图像
	namedWindow("original", WINDOW_NORMAL);
	imshow("original", img);
	namedWindow("PyrDown", WINDOW_NORMAL);
	imshow("PyrDown", dst);
	waitKey(0);
	destroyAllWindows();
} 

运行结果3

示例代码3

10.2向下多次采样

#include "pch.h"
#include <iostream>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;
using namespace std;

//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 

int main()
{
	Mat img, r1,r2,r3;
	img = imread("4.png", IMREAD_COLOR); 	//读取原始图像
	if (img.empty())
	{
		cout << "读取图像错误!" << endl;
	}

	pyrDown(img, r1);  	//图像向下取样
	pyrDown(r1, r2);
	pyrDown(r2, r3);

	namedWindow("original", WINDOW_NORMAL);
	imshow("original", img);  	//显示图像
	namedWindow("PyrDown1", WINDOW_NORMAL);
	imshow("PyrDown1", r1);
	namedWindow("PyrDown2", WINDOW_NORMAL);
	imshow("PyrDown2", r2);
	namedWindow("PyrDown3", WINDOW_NORMAL);
	imshow("PyrDown3", r3);

	waitKey(0);
	destroyAllWindows(); //销毁所有窗口
}

运行结果3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值