当前位置: 首页 > news >正文

OpenCV(十六):高斯图像金字塔

目录

1.高斯图像金字塔原理

2.高斯图像金字塔实现


1.高斯图像金字塔原理

高斯图像金字塔是一种用于多尺度图像表示和处理的重要技术。它通过对图像进行多次高斯模糊和下采样操作来生成不同分辨率的图像层级,每个层级都是原始图像的模糊和降采样版本。

以下是高斯图像金字塔的原理和步骤:

  1. 高斯模糊(Gaussian Blurring):首先,对原始图像应用高斯滤波器进行模糊处理。高斯滤波器是一种线性低通滤波器,可以在空域上对图像进行平滑,去除图像中的高频细节。

  2. 下采样(Subsampling):对模糊后的图像进行下采样操作,即将图像尺寸缩小一半。下采样操作可以通过选择每隔一定像素进行采样来实现,或者使用插值技术(如平均值、最近邻等)生成新尺寸更小的图像。

  3. 重复步骤1和2:以缩小的图像为输入,重复执行高斯模糊和下采样步骤来构建金字塔的下一层。每一层都是前一层的模糊和降采样版本。

  4. 金字塔构建:重复进行高斯模糊和下采样操作,直到到达所需的金字塔层级或图像尺寸小于一定阈值。每个层级的下采样图像作为金字塔的一层,并按顺序排列形成金字塔结构。

通过构建高斯图像金字塔,可以获取到原始图像的不同分辨率版本,其中高层级的图像具有较低的分辨率,低层级的图像具有较高的分辨率。这样的金字塔结构允许在不同尺度上进行图像处理和分析任务,例如特征提取、目标检测、图像融合等。

2.高斯图像金字塔实现

在OpenCV中,可以使用cv::pyrDown()和cv::pyrUp()函数来实现高斯图像金字塔的构建。高斯图像金字塔是一种多尺度表示的图像结构,通过不断对图像进行降采样(下采样)和上采样操作,获得不同分辨率的图像层级。

  1. cv::pyrDown()函数:

    • 函数原型:void pyrDown(InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT)

    • 参数说明:

      • src:输入图像,可以是单通道或多通道的图像,数据类型为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。

      • dst:输出图像,下采样后的图像。

      • dstsize:可选参数,输出图像的尺寸,默认情况下,输出图像的尺寸为输入图像尺寸的一半,也可以手动指定输出图像的尺寸。

      • borderType:可选参数,用于边缘填充的类型,默认为 BORDER_DEFAULT。

    • 功能:执行高斯金字塔的下采样操作,将输入图像的尺寸减半,并生成一个尺寸更小的图像。

  2. cv::pyrUp()函数:

    • 函数原型:void pyrUp(InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT)

    • 参数说明:

      • src:输入图像,可以是单通道或多通道的图像,数据类型为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。

      • dst:输出图像,上采样后的图像。

      • dstsize:可选参数,输出图像的尺寸,默认情况下,输出图像的尺寸为输入图像尺寸的两倍,也可以手动指定输出图像的尺寸。

      • borderType:可选参数,用于边缘填充的类型,默认为 BORDER_DEFAULT。

    • 功能:执行高斯金字塔的上采样操作,将输入图像的尺寸增大一倍,并生成一个尺寸更大的图像。

这两个函数结合使用可以实现图像金字塔的构建。通过多次使用cv::pyrDown()进行下采样,可以生成金字塔的较低层级图像。然后,如果需要,可以使用cv::pyrUp()进行上采样,将图像恢复到原始分辨率。

下面是一个使用OpenCV实现高斯图像金字塔的示例代码:

#include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image = cv::imread("image.jpg");// 构建高斯图像金字塔std::vector<cv::Mat> Guass;int level=3;Guass.push_back(image);for(int i=0;i<level;i++){Mat guass;cv::pyrDown(Guass[i], guass);Guass.push_back(guass);}// 显示金字塔图像for (int i = 0; i < level; i++) {cv::imwrite("/sdcard/DCIM/guass" + std::to_string(i)+".png", Guass[i]);}return 0;
}

在这个示例中,我们首先使用cv::imread()函数读取一张图像。然后,我们创建一个std::vector<cv::Mat>类型的变量Guass来保存金字塔图像的每一层。我们将原始图像作为金字塔的第一层。

接下来,我们使用一个循环来对guass图像进行下采样操作。在每次迭代中,使用cv::pyrDown()函数将guass图像降采样,并将降采样后的图像添加到Guass向量中。

最后,我们通过遍历Guass向量将每一层金字塔图像显示出来,使用cv::imwrite()函数显示每一层图像。

需要注意的是,高斯图像金字塔的构建可以通过不断的下采样和上采样操作来实现。其中cv::pyrDown()用于下采样操作,将图像尺寸减半,而cv::pyrUp()用于上采样操作,将图像尺寸扩大一倍。你可以根据需求使用cv::pyrUp()函数来实现高斯图像金字塔的上采样操作。

http://www.lryc.cn/news/150564.html

相关文章:

  • Nginx配置及优化3
  • 网络直播源码UDP协议搭建:为平台注入一份力量
  • Ubuntu/linux系统环境变量配置详解
  • kafka配置SASL/PLAIN 安全认证
  • pdf加密如何解除?这样解除加密很简单
  • Ubuntu18.04使用Systemback制作系统镜像并还原
  • OpenCV(十五):拷贝图像
  • 原神世界中的顺序表:派蒙的趣味数据结构讲解
  • 电脑入门:路由器 基本设置操作说明
  • 搜索与图论-拓扑序列
  • 「MySQL-05」MySQL Workbench的下载和使用
  • 编译期jni类型转换成字符串
  • 优秀的ui设计作品(合集)
  • 【c/c++】c和cpp混合编译
  • springboot定制banner
  • Qt 入门实战教程(目录)
  • Ceph入门到精通-Lunix性能分析工具汇总
  • 服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写的参考笔记
  • 【考研数学】线性代数第四章 —— 线性方程组(2,线性方程组的通解 | 理论延伸)
  • go读取文件的几种方法
  • ChatGPT癌症治疗“困难重重”,真假混讲难辨真假,准确有待提高
  • docker打包vue vite前端项目
  • zookeeper 查询注册的 dubbo 服务
  • 【每日一题】57. 插入区间
  • youtubu视频下载和yt-dlp 使用教程
  • ——滑动窗口
  • 【C++进阶】模板进阶
  • Vim如何清空文件
  • 问道管理:什么信号?煤飞色舞钢花溅
  • C# PaddleDetection yolo 印章检测