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 image
 Mat src = imread( samples::findFile( filename ) );
 
 // Check if image is loaded fine
 if(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 image
 Mat src = imread( samples::findFile( filename ) );
 
 // Check if image is loaded fine
 if(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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CleanMyMac一键释放Mac潜力的智能助手

在数字化时代&#xff0c;我们的Mac电脑承载着日益增多的数据和文件&#xff0c;使得系统性能逐渐下降&#xff0c;运行缓慢。为了解决这个问题&#xff0c;我们需要一款能够深度清理、优化Mac性能的软件。CleanMyMac&#xff0c;作为Mac系统清理领域的佼佼者&#xff0c;凭借其…

Go语言入门|包、关键字和标识符

目录 Go语言 包文件 规则 关键字 规则 标识符 规则 预定义标识符 Go语言 Go语言是一种静态类型、编译型和并发型的编程语言&#xff0c;由Google开发。Go的源代码文件以.go为扩展名&#xff0c;文件名通常与包名保持一致。一个Go文件可以包含多个顶级声明&#xff0c;…

【opencv】示例-train_HOG.cpp 训练和测试基于支持向量机(SVM)的行人检测器

#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理头文件 #include "opencv2/highgui.hpp" // 包含OpenCV高层GUI&#xff08;图形用户界面&#xff09;头文件 #include "opencv2/ml.hpp" // 包含OpenCV机器学习模块头文件 #includ…

jupyter切换不同的内核(虚拟环境)(anaconda 24.1.2)

jupyter切换不同的内核&#xff08;anaconda 24.1.2&#xff09; 主要的两条命令&#xff1a; conda install ipykernel python -m ipykernel install --user --name 环境名称 anaconda的版本号 conda --version实例&#xff1a; 一、首先可以看到已经创…

【JDBC入门学习】

JDBC简介 注意&#xff1a;1.注册驱动可以不写了 2.导入jar包时要注意点击右键添加 package com.wudreamer.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;/* * jdbc 入门 * */ public class JdbcDemo {public static v…

软考中级工程师网络技术第二节网络体系结构

OSPF将路由器连接的物理网络划分为以下4种类型&#xff0c;以太网属于&#xff08;25&#xff09;&#xff0c;X.25分组交换网属于&#xff08;非广播多址网络NBMA&#xff09;。 A 点对点网络 B 广播多址网络 C 点到多点网络 D 非广播多址网络 试题答案 正确答案&#xff1a; …

SDUT lab5-2

7-2 sdut-JAVA-Credit Card Number Validation 分数 10 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 Each type of credit card begins with a prefix or range of prefixes and is of a certain length. Table 1 shows the details of two commonly used credit ca…

LeetCode-31-下一个排列问题

题目说明 实现获取下一个排列的函数&#xff0c;算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列&#xff0c;则将数字重新排列成最小的排列&#xff08;即升序排列&#xff09;。 必须原地修改&#xff0c;只允许使用额外常数空间。…

论文笔记:SmartPlay : A Benchmark for LLMs as Intelligent Agents

iclr 2024 reviewer评分 5688 引入了 SmartPlay&#xff0c;一种从 6 种不同游戏中提取的基准 衡量LLM作为智能体的能力 1 智能代理所需的能力 论文借鉴游戏设计的概念&#xff0c;确定了智能LLM代理的九项关键能力&#xff0c;并为每项能力确定了多个等级&#xff1a; 长文…

JVM虚拟机(五)强引用、软引用、弱引用、虚引用

目录 一、强引用二、软引用三、弱引用四、虚引用五、总结 引文&#xff1a; 在 Java 中一共存在 4 种引用&#xff1a;强、软、弱、虚。它们主要指的是&#xff0c;在进行垃圾回收的时候&#xff0c;对于不同的引用垃圾回收的情况是不一样的。下面我们就一起来看一下这 4 种引用…

白话微机:10.民风淳朴的MCS-51小镇(小镇方言:汇编)

1. 基本结构与周期 MCS-51系列单片机属于8位单片机用 8051单片机构成最小应用系统时&#xff0c;只要将单片机接上时钟电路和复位电路即可MCS-51单片机由CPU、存储器和I/O三部分组成CPU是指&#xff1a;运算器和控制器 “PC CPU 3BUS RAM I/O” 在执行指令过程中&#xff…

Java-Scanner类进阶+题目

Scanner进阶 接收整数数据时&#xff1a; 接收小数数据时&#xff1a; 例子&#xff1a; 可以先这样弄出scanner的框架&#xff1a; 未完待续... ...

介绍set和map容器

文章目录 1.什么是关联式容器2.什么是键值对3.树形结构的关联式容器3.1set3.1.2set的使用set的构造set的迭代器set的容量set的常用操作set的简单使用 3.2 mapmap的构造map的迭代器map的容量map的常用操作map的使用 3.3multiset3.4 multimap 在介绍set和map容器前先了解什么是关…

《GVL》论文笔记

原文链接 [2303.06378] Learning Grounded Vision-Language Representation for Versatile Understanding in Untrimmed Videos (arxiv.org) 原文笔记 What 《Learning Grounded Vision-Language Representation for Versatile Understanding in Untrimmed Videos》 全文一…

编曲知识19:自动化处理 发送原理 混响 延迟

自动化处理 发送原理 混响 延迟小鹅通-专注内容付费的技术服务商https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_661a68eae4b023c0a96a8b36?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 自动化处理 自动化 鼠标挪动到轨道左下角打开自动化轨道 或右键轨道-左键单击…

Node.js 中的 RSA 加密、解密、签名与验证详解

引言 在现代的网络通信中&#xff0c;数据安全显得尤为重要。RSA加密算法因其非对称的特性&#xff0c;广泛应用于数据的加密、解密、签名和验证等安全领域。本文将详细介绍RSA算法的基本原理&#xff0c;并结合Node.js环境&#xff0c;展示如何使用内置的crypto模块和第三方库…

RT-Thread 多级目录 scons 构建

前言 RT-Thread 默认使用 scons 进行工程的构建&#xff0c;虽然 RT-Thread BSP 中的 hello world 例程比较简单&#xff0c;实际项目开发&#xff0c;可能源码的工程会由多级目录&#xff0c;如何让多级的目录参与构建&#xff1f; scons 构建时&#xff0c;除了依赖工程的根…

libbpf-bootstrap库的代码结构介绍(用户层接口介绍),编译链接语句详细介绍,.skel.h文件介绍+示例,bpf程序的后续处理+文件关系总结

目录 libbpf-bootstrap 代码结构介绍 用户层函数 编译 查看 生成内核层的.o文件 第一模块 第二模块 第三模块 第四模块 第五模块 生成辅助文件(.skel.h) 介绍 示例 生成代码层的.o文件 第一模块 第二模块 第三模块 链接出可执行文件 后续总结 libbpf-bootst…

云服务器web环境之mariadb

1.安装mariadb服务 yum install mariadb-server 启动mariadb服务 systemctl start mariadb.service 输入mysql就能使用数据库了。 2.服务相关操作 systemctl stop mariadb.service systemctl restart mariadb.service 2.配置开机自启动 systemctl enable mariadb.serv…

AI克隆语音(基于GPT-SoVITS)

概述 使用GPT-SoVITS训练声音模型&#xff0c;实现文本转语音功能。可以模拟出语气&#xff0c;语速。如果数据质量足够高&#xff0c;可以达到非常相似的结果。相比于So-VITS-SVC需要的显卡配置更低&#xff0c;数据集更小&#xff08;我的笔记本NVIDIA GeForce RTX 4050 Lap…