OpenCV4.9图像金字塔

目标

在本教程中,您将学习如何:

  • 使用 OpenCV 函数 pyrUp()和 pyrDown()对给定图像进行下采样或上采样。

理论

注意

下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书。

  • 通常,我们需要将图像转换为与原始图像不同的大小。为此,有两种可能的选择:
    1. 放大图像(放大)或
    2. 缩小它(缩小)。
  • 尽管 OpenCV 中有一个几何变换函数,可以从字面上调整图像大小(调整大小,我们将在以后的教程中展示),但在本节中,我们首先分析了图像金字塔的使用,它广泛应用于广泛的视觉应用。

图像金字塔

  • 图像金字塔是图像的集合 - 所有图像都来自单个原始图像 - 这些图像被连续下采样,直到达到某个所需的停止点。
  • 图像金字塔有两种常见的类型:
    • 高斯金字塔:用于对图像进行缩减采样
    • 拉普拉斯金字塔:用于从金字塔下部的图像(分辨率较低)重建上采样图像
  • 在本教程中,我们将使用高斯金字塔

高斯金字塔

  • 将金字塔想象成一组层,其中层越高,尺寸越小。

  • 每一层都从下到上编号,因此层(i+1)(表示为 G_(i+1)小于层I(Gi)。
  • 为了在高斯金字塔中生成层(I+1)我们执行以下操作:

    • 用高斯核卷积Gi:
    • 删除每个偶数行和列。
    • 您可以很容易地注意到,生成的图像将恰好是其前身的四分之一。在输入图像 \(G_{0}\)(原始图像)上迭代此过程将生成整个金字塔。
    • 上述过程对于图像的缩减采样非常有用。如果我们想让它变大怎么办?:用零填充的列 ( \(0 \))
      • 首先,将图像在每个维度上放大到原始图像的两倍,使用新的偶数行和
      • 使用上面显示的相同内核(乘以 4)执行卷积,以近似“缺失像素”的值
    • 这两个过程(如上所述的下采样和上采样)由 OpenCV 函数 pyrUp() 和 pyrDown() 实现,我们将在下面代码的示例中看到:

注意

当我们减小图像的大小时,我们实际上丢失了图像的信息。

演示代码:

C++

本教程代码如下所示。

您也可以从这里下载

#include "iostream"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"using namespace std;
using namespace cv;const char* window_name = "Pyramids Demo";int main( int argc, char** argv )
{cout << "\n Zoom In-Out demo \n ""------------------ \n"" * [i] -> Zoom in \n"" * [o] -> Zoom out \n"" * [ESC] -> Close program \n" << endl;const char* filename = argc >=2 ? argv[1] : "chicky_512.png";// Loads an imageMat src = imread( samples::findFile( filename ) );// Check if image is loaded fineif(src.empty()){printf(" Error opening image\n");printf(" Program Arguments: [image_name -- default chicky_512.png] \n");return EXIT_FAILURE;}for(;;){imshow( window_name, src );char c = (char)waitKey(0);if( c == 27 ){ break; }else if( c == 'i' ){ pyrUp( src, src, Size( src.cols*2, src.rows*2 ) );printf( "** Zoom In: Image x 2 \n" );}else if( c == 'o' ){ pyrDown( src, src, Size( src.cols/2, src.rows/2 ) );printf( "** Zoom Out: Image / 2 \n" );}}return EXIT_SUCCESS;
}

解释

C++

让我们检查一下程序的一般结构:

加载图像

 const char* filename = argc >=2 ? argv[1] : "chicky_512.png";// Loads an imageMat src = imread( samples::findFile( filename ) );// Check if image is loaded fineif(src.empty()){printf(" Error opening image\n");printf(" Program Arguments: [image_name -- default chicky_512.png] \n");return EXIT_FAILURE;}

创建窗口

 imshow( window_name, src );

消息循环:

 for(;;){imshow( window_name, src );char c = (char)waitKey(0);if( c == 27 ){ break; }else if( c == 'i' ){ pyrUp( src, src, Size( src.cols*2, src.rows*2 ) );printf( "** Zoom In: Image x 2 \n" );}else if( c == 'o' ){ pyrDown( src, src, Size( src.cols/2, src.rows/2 ) );printf( "** Zoom Out: Image / 2 \n" );}}

执行无限循环,等待用户输入。如果用户按 ESC,我们的程序将退出。此外,它有两个选项:

  • 执行上采样 - 缩放 'i'n(按下“i”后)

    我们使用带有三个参数的函数 pyrUp():

    • src:当前和目标图像(显示在屏幕上,应该是输入图像的双倍)
    • Size( tmp.cols*2, tmp.rows*2 ) :目标大小。由于我们是上采样,pyrUp() 的大小是输入图像的两倍(在本例中为 src)。
 else if( c == 'i' ){ pyrUp( src, src, Size( src.cols*2, src.rows*2 ) );printf( "** Zoom In: Image x 2 \n" );}
  • 执行缩减采样 - 缩放 'o'ut(按下 'o' 后)

    我们使用带有三个参数的函数 pyrDown() (类似于 pyrUp()):

    • src:当前和目标图像(显示在屏幕上,应该是输入图像的一半)
    • Size(tmp.cols/2, tmp.rows/2 ) :目标大小。由于我们正在缩减采样,pyrDown() 需要输入图像的一半大小(在本例中为 src)。
 else if( c == 'o' ){ pyrDown( src, src, Size( src.cols/2, src.rows/2 ) );printf( "** Zoom Out: Image / 2 \n" );}

请注意,输入图像可以除以 2 倍(在两个维度上)非常重要。否则,将显示错误。

结果

  • 默认情况下,samples/data程序调用文件夹中的图像chicky_512.png。请注意,此图像是 \(512 \times 512\),因此下采样不会生成任何错误 ( \(512 = 2^{9}\))。原图如下图所示:

  • 首先,我们通过按“d”来应用两个连续的 pyrDown()操作。我们的输出是:

  • 注意,由于我们正在减小图像的大小,我们应该会失去一些分辨率。在我们应用 pyrUp() 两次(按“u”)后,这一点很明显。我们现在的输出是:

参考文献:

1、《Image Pyramids》-----Ana Huamán

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/309819.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot 集成rocketMq + 基本使用

1. RocketMq基本概念 1. NameServer 每个NameServer结点之间是相互独立&#xff0c;彼此没有任何信息交互 启动NameServer。NameServer启动后监听端口&#xff0c;等待Broker、Producer、Consumer连接&#xff0c; 相当于一个路由控制中心。主要是用来保存topic路由信息&#…

Blender表面细分的操作

在使用Blender的过程中,刚开始创建的模型,都会比较少面,这样操作起来比较流畅,减少电脑的计算量,当设计快要完成时,就会增加表面细分,这样更加圆滑,看起来更加顺眼。 比如创建一个猴头,它会默认显示如下: 从上图可以看到,有一些表面会比较大,棱角很多。 这时候你…

微商商城源码小程序好用么?

商城APP作为电子商务行业的重要组成部分&#xff0c;已经成为了人们购物的主要方式之一。为了在竞争激烈的市场中脱颖而出&#xff0c;开发一款专业且思考深度的商城APP方案显得尤为关键。本文将从专业性和思考深度两个方面&#xff0c;探讨商城APP的开发方案。 一、专业性的重…

CloudCompare——win11配置CloudComPy

CloudComPy配置 1 基本环境介绍2 安装Anaconda2.1 下载anaconda2.2 安装anaconda2.3 配置镜像源2.4 更改虚拟环境的默认创建位置2.5 其他问题2.5.1 激活自己创建的环境提示&#xff1a;系统找不到指定的路径2.5.2 InvalidVersionSpecError: Invalid version spec: 2.72.5.3 卸载…

如何解决网站建设打开速度慢的问题?

如何解决网站建设打开速度慢的问题&#xff1f;在浏览网站的时候&#xff0c;网站打开速度的快慢也是能够直接影响到用户的体验感的。因为网站打开速度太慢&#xff0c;不仅浪费了大家的时间&#xff0c;同时还容易消耗浏览者的很大一部分耐心。 所以说不管是对于企业来说&…

hive了解系列一

“ 随着智能手机的普及&#xff0c;互联网时代红利的爆发&#xff0c;用户数量和产生的数据也越发庞大。为了解决这个问题&#xff0c;提高数据的使用价值。 Hadoop生态系统就被广泛得到应用。 在早期&#xff0c;Hadoop生态系统就是为处理如此大数据集而产生的一个合乎成本效益…

C++ 红黑树模拟实现

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C知识分享⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 前言 前面我们实现了AVL树&#xff0c;发明AVL树…

蓝桥杯备赛刷题——css

新鲜的蔬菜 这题需要使用grid 我不会 去学一下 一.什么是grid Grid 布局与 Flex 布局有一定的相似性&#xff0c;都可以指定容器内部多个项目的位置。但是&#xff0c;它们也存在重大区别。 Flex 布局是轴线布局&#xff0c;只能指定"项目"针对轴线的位置&#…

使用冒泡排序模拟实现qsort函数

目录 冒泡排序qsort函数的使用1.使用qsort函数排序整型数据2.使用qsort函数排序结构数据 冒泡排序模拟实现qsort函数今日题目1. 字符串旋转结果2.杨氏矩阵3.猜凶手4.杨辉三角 总结 冒泡排序 冒泡排序的核心思想是:两两相邻的元素进行比较 代码如下: //⽅法1 void bubble_so…

第四百五十四回

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容&#xff0c;本章回中将介绍关于MediaQuery的优化.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 问题描述 我们在…

头歌-机器学习 第13次实验 特征工程——共享单车之租赁需求预估

第1关&#xff1a;数据探索与可视化 任务描述 本关任务&#xff1a;编写python代码&#xff0c;完成一天中不同时间段的平均租赁数量的可视化功能。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 读取数据数据探索与可视化 读取数据 数据保存在./step1/…

Linux C应用编程:MQTT物联网

1 MQTT通信协议 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传 输&#xff09;是一种基于客户端-服务端架构的消息传输协议&#xff0c;如今&#xff0c;MQTT 成为了最受欢迎的物联网协议&#xff0c;已广泛应用于车联网、智能家居、即时聊…

不想升级到win11要怎么取消,怎么拒绝升级win11

微软公布了一个会导致win11数据损坏的罪魁祸首,受到影响的win11系统,是搭载了支持最新VAES指令集的处理器。这次的bug是坑了intel用户呀,Intel从10代酷睿(Ice Lake )和第三代至强可扩展处理器(IceLake-SP)开始才添加了对VAES的支持,AMD这边则是Zen 3锐龙5000,它也是AVX-51…

太好玩了,我用 Python 做了一个 ChatGPT 机器人

毫无疑问&#xff0c;ChatGPT 已经是当下编程圈最火的话题之一&#xff0c;它不仅能够回答各类问题&#xff0c;甚至还能执行代码&#xff01; 或者是变成一只猫 因为它实在是太好玩&#xff0c;我使用Python将ChatGPT改造&#xff0c;可以实现在命令行或者Python代码中调用。…

手动实现简易版RPC(上)

手动实现简易版RPC(上) 前言 什么是RPC&#xff1f;它的原理是什么&#xff1f;它有什么特点&#xff1f;如果让你实现一个RPC框架&#xff0c;你会如何是实现&#xff1f;带着这些问题&#xff0c;开始今天的学习。 本文主要介绍RPC概述以及一些关于RPC的知识&#xff0c;为…

【电子通识】吸锡带/线的作用和替代方法

吸锡带简介 吸锡带(或称吸锡线、脱焊织物)是手工焊接的好助手,手焊或维修时吸锡带能够去除电路板上多余焊锡,减少了电子产品的返工和修理的时间,降低了烙铁对电路板造成过热损伤的危险,因此是一个既廉价又有效的物品。 市面上卖的最多的的吸锡带类型如下所示: 吸锡带的选型…

普乐蛙VR神州飞船设备VR太空舱体验馆VR博物馆

中国航天式浪漫知多少&#xff1f;千百年来古人对浩瀚宇宙有着无尽的浪漫想象&#xff0c;而在一代又一代中国航天事业奋斗者的努力中&#xff0c;远古神话不再是幻想&#xff0c;它终被照进现实——中国载人飞船“神舟”、中国载人空间站“天宫”、中国绕月人造卫星“嫦娥一号…

二叉树例题分享

文章目录 二叉树例题分享[235. 二叉搜索树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/)[701. 二叉搜索树中的插入操作](https://leetcode.cn/problems/insert-into-a-binary-search-tree/)[108. 将有序数组转换为二叉搜索树…

python怎么输出小数

先将整型转换成float型&#xff0c;再进行计算&#xff0c;结果就有小数了。 >>> a 10 >>> b 4 >>> c a/b >>> a,b,c (10, 4, 2) >>> a float(a) >>> d a/b >>> a,b,d (10.0, 4, 2.5) >>> 注意&…

LabVIEW闭环步进电机运动系统设计及精度分析

LabVIEW闭环步进电机运动系统设计及精度分析 在自动化设备不断发展的当代&#xff0c;闭环步进电机以其高精度和可靠性成为了自动化设备的重要组成部分。以LabVIEW软件为核心&#xff0c;结合运动控制卡及驱动器模块&#xff0c;设计并实现了一个闭环步进电机的多轴运动控制系…