计算机视觉全系列实战教程 (十四):图像金字塔(高斯金字塔、拉普拉斯金字塔)

devtools/2024/10/21 3:44:44/

1.图像金字塔

在这里插入图片描述

(1)下采样

从G0 -> G1、G2、G3

  • step01:对图像Gi进行高斯核卷积操作(高斯滤波)
  • step02:删除所有的偶数行和列
void cv::pyrDown(cv::Mat &imSrc, //输入图像cv::Mat &imDst, //下采样后的输出图像cv::Size size = cv::Size(), //imDst的尺寸,默认是输入图像的1、2int borderType=4 //一般默认即可);

(2)上采样

从G3 -> G2、G1、G0

  • step01:将图像在每个方向上扩大为原图像的2倍,新增的行和列均用0来填充
  • step02:使用与“向下取样”相同的卷积核乘以4,再与放大后的图像进行卷积运算
void cv::pyrUp(cv::Mat &imSrc,cv::Mat &imDst,cv::Size size=cv::Size(), //默认位imSrc的2int borderType = 4);

2.高斯金字塔

(1)原理

高斯金字塔的构建就是迭代地对图像进行下采样,下采样的步骤如1中下采样的介绍

(2)How(如何构建高斯金字塔)

构建高斯金字塔函数如下(可直接使用):

/*@author @还下着雨ZG* @param[in] imSrc, 输入的源图像* @param[out] vPyrGaussian, 输出的图像金字塔* @param[in] iLayer, 金字塔的层数* @return int, 正数表示金字塔构建成功,负数表示金字塔构建失败
*/
int GetPyrGaussian(const cv::Mat &imSrc, std::vector<cv::Mat>& vPyrGaussian,int iLayer)
{if (imSrc.empty())return -1;if (!vPyrGaussian.empty()){vPyrGaussian.clear();}if (iLayer <= 0)return -2;//下采样vPyrGaussian.resize(iLayer);cv::Mat imTmp;for (int i = 0; i < iLayer; ++i){if (i == 0)vPyrGaussian[i] = imSrc;else {cv::pyrDown(vPyrGaussian[i-1], imTmp);vPyrGaussian[i] = imTmp;}}return 1;
}

3拉普拉斯图像金字塔

(1)What(什么是拉普拉斯图)

拉普拉斯图是基于高斯图的,拉普拉斯图的本质是残差,即第i层的高斯图 - 先缩小后放大的图;不明白可直接看下面构建拉普拉斯图像金字塔函数。

(2)How(如何构建拉普拉斯图像金字塔)

构建拉普拉是图像金字塔,可直接使用:

/*@author @还下着雨ZG* @param[in] vPyrGaussian, 输入的高斯图像金字塔* @param[out] vPyrLaplacian, 输出的拉普拉斯图像金字塔* @return int, 正数表示金字塔构建成功,负数表示金字塔构建失败
*/
int GetPyrLaplacian(const std::vector<cv::Mat>& vPyrGaussian,std::vector<cv::Mat>& vPyrLaplacian)
{/*对输入参数及其约束关系进行检查*/if (vPyrGaussian.empty())return -1;if (!vPyrLaplacian.empty())vPyrLaplacian.clear();/*构建拉普拉斯金字塔*/cv::Mat imLplTmp;for (int i = 0; i < vPyrGaussian.size()-1; ++i){cv::Mat imTmp(vPyrGaussian[i].size(), vPyrGaussian[i].type());cv::pyrUp(vPyrGaussian[i + 1], imTmp);imLplTmp = vPyrGaussian[i] - imTmp;vPyrLaplacian.push_back(imLplTmp);}return 1;
}

(3)使用opencv自带的函数获取拉普拉斯图像

void cv::Laplacian(cv::Mat &imSrc, //输入图像cv::Mat &imLpl, //输出的拉普拉斯图像int ddepth, //imLpl的数据格式int ksize =1, double scale=1, //拉普拉斯值的缩放值double delta = 0, //偏置值int borderType = BORDER_DEFAULT);

http://www.ppmy.cn/devtools/55821.html

相关文章

惯性级惯导的定位漂移估算

一般来说&#xff0c;惯性级陀螺仪指的是0.01度/小时的零偏稳定性&#xff08;是否可以作为等效常值漂移呢&#xff1f;&#xff09;&#xff0c;其定位误差大约为1海里每小时&#xff0c;其具体估算方法可见秦永元老师的《惯性导航》一书中静基座下系统误差传播特性分析一节内…

绕过命令过滤器:探索UnixLinux中的Bypass技术

前言 在Unix或Linux系统的安全测试和网络防御中&#xff0c;了解如何绕过命令过滤器是非常重要的。今天&#xff0c;我们将探讨几种利用shell命令绕过安全限制的技巧&#xff0c;这些技巧常用于渗透测试中&#xff0c;以检测系统的安全漏洞。 0x00 命令介绍 一般而言&#x…

Web前端基础知识

C/S结构 cilent 客户端 / Server 服务器 B/S结构 Brower 浏览器 / Server 服务器 java属于后端语言&#xff0c;多用于开发服务器端程序 学习一些网页知识&#xff0c;为程序提供操作页面 网页开发学习那些内容&#xff1f; html css JavaScript 两个框架 VUE.js E…

Web前端第四次作业

目录 一、编写一个函数&#xff0c;形参是一个数组&#xff0c;返回数组中所有数字的平均值 二、编写一个函数&#xff0c;形参是一个数组&#xff0c;返回数组中的最大值 三、编写一个函数&#xff0c;形参是一个字符串&#xff0c;统计该字符串中每个字母出现的次数&#…

idea添加文档注释

一、easy javadoc插件 在settings的plugins中下载easy javadoc插件。 安装完成后重启idea&#xff0c;再次打开settings界面。会出现easyDoc相关配置。 二、设置模版以及使用 类描述模版参考设置&#xff1a; /** * 类描述 -> * * Author: ywz * Date: $Date$ */ 方法描述…

Excel 将某个序列随机重排 N 次

A 列是个随机序列&#xff0c;B2 格是参数&#xff0c;表示重排的次数。 AB1ItemsReplicates2A23B4C5D 要求将 A 列重拍 N 次 D1Result2C3D4B5A6D7A8B9C 使用 SPL XLL&#xff0c;输入公式&#xff1a; spl("?2.conj(?1.sort(rand()))",A2:A5,B2)"整数.()…

cherry 笔记三(启动)

cherry启动很简单 app创建完 直接startup()就好了 func main() {app : cherry.Configure("./examples/config/profile-chat.json","chat-master",false,cherry.Cluster,)app.SetSerializer(cserializer.NewJSON())app.Startup() } Configure()--->N…

RockChip Android12 System之MultipleUsers

一:概述 System中的MultipleUsers不同于其他Preference采用system_dashboard_fragment.xml文件进行加载,而是采用自身独立的xml文件user_settings.xml加载。 二:Multiple Users 1、Activity packages/apps/Settings/AndroidManifest.xml <activityandroid:name="S…