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.hqwc.cn/news/620200.html

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

相关文章

springboot上传模块到私服,再用pom引用下来

有时候要做一个公司的公共服务模块。不能说大家都直接把代码粘贴进去&#xff0c;因为会需要维护很多份&#xff1b;这样就剩下两个方式了。 方式一&#xff1a;自己独立部署一个公共服务的服务&#xff0c;全公司都调用&#xff0c;通过http、rpc或者grpc的方式&#xff0c;这…

用 Python 写 3D 游戏,太赞了!

vizard介绍 Vizard是一款虚拟现实开发平台软件&#xff0c;从开发至今已走过十个年头。它基于C/C&#xff0c;运用新近OpenGL拓展模块开发出的高性能图形引擎。当运用Python语言执行开发时&#xff0c;Vizard同时自动将编写的程式转换为字节码抽象层(LAXMI)&#xff0c;进而运…

msf后门流量分析

前言 分析msf后门的流量主要是分析其数据包的特征&#xff0c;然后msf后门有三种类型。分别是tcp、http、https&#xff0c;这里就说一下这三种类型的数据包的特征&#xff0c;其实也是比较简单的。还有一点&#xff0c;在实验之前记得把病毒防护关了&#xff0c;以防拦截流量…

The 0-1 Knapsack Problem KNAPSACK

Problem Let U {u1, u2, . . . , un} be a set of n items to be packed in a knapsack of size C. For 1 ≤ j ≤ n, let sj and vj be the size and value of the jth item, respectively. Here C and sj, vj , 1 ≤ j ≤ n, are all positive integers. Each item should e…

水库之大坝安全监测系统解决方案

一、系统介绍 水库之大坝安全监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置&#xff08;内置通信装置、防雷设备&#xff09;、附件&#xff08;电缆、通信线路、电源线路&#xff09;等组成&a…

node.js服务器静态资源处理

前言&#xff1a;node.js服务器动态资源处理见 http://t.csdnimg.cn/9D8WN 一、什么是node.js服务器静态资源&#xff1f; 静态资源服务器指的是不会被服务器的动态运行所改变或者生成的文件. 它最初在服务器运行之前是什么样子, 到服务器结束运行时, 它还是那个样子. 比如平…

github 双因素验证

环境 华为手机 下载app 华为应用市场下载 输入对应验证码&#xff0c;然后一路下一步即可 联系方式 手机&#xff1a;13822161573 微信&#xff1a;txsolarterms QQ&#xff1a;419396409

腾讯客户端开发实习一面

听说腾讯25年5000offer&#xff0c;我就去了...投完简历&#xff0c;当天晚上做完测评&#xff0c;第二天下午打电话约了第三天面试&#xff0c;额流程很快&#xff0c;快到第三天就寄了... 写在这里做个记录&#xff0c;也可以给学习学妹们经验&#xff0c;文末也有大厂面经合…

人工智能研究生前置知识—扩展程序库Pandas

人工智能研究生前置知识—扩展程序库Pandas pandas简介 Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;。Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。 pandas的官网&#xff1a;https://pandas.…

BGI | STCellBin:动植物组织细胞分割

简介 STCellbin 利用细胞核染色图像作为桥梁来获取与空间基因表达图谱对齐的细胞膜/壁染色图像。通过采用先进的细胞分割技术&#xff0c;可以获得准确的细胞边界&#xff0c;从而获得更可靠的单细胞空间基因表达谱。此次更新的增强功能为细胞内基因表达的空间组织提供了宝贵的…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5 第一阶段竞赛项目试题 本文件为信息安全管理与评估项目竞赛-第一阶段试题&#xff0c;第一阶段内容包括&#xff1a;网络平台搭建与设备安全防护。 本次比赛时间为180分钟。 介绍 竞赛阶段…

Web前端 Javascript笔记1

为什么学习 JavaScript? JavaScript 是 web 开发人员必须学习的 3 门语言中的一门&#xff1a; HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 JavaScript 是可插入 HTML 页面的编程代码。 JavaScript 插入 HTML 页面后&#xff0c;可由所有的现代浏…