OpenCV4.9图像金字塔

2024-04-15 16:44
文章标签 图像 金字塔 opencv4.9

本文主要是介绍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

这篇关于OpenCV4.9图像金字塔的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/906357

相关文章

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

HalconDotNet中的图像特征与提取详解

文章目录 简介一、边缘特征提取二、角点特征提取三、区域特征提取四、纹理特征提取五、形状特征提取 简介   图像特征提取是图像处理中的一个重要步骤,用于从图像中提取有意义的特征,以便进行进一步的分析和处理。HalconDotNet提供了多种图像特征提取方法,每种方法都有其特定的应用场景和优缺点。 一、边缘特征提取   边缘特征提取是图像处理中最基本的特征提取方法之一,通过检

超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。

阿里提出UniPortrait,能根据用户提供的文本描述,快速生成既忠实于原图又能灵活调整的个性化人像,用户甚至可以通过简单的句子来描述多个不同的人物,而不需要一一指定每个人的位置。这种设计大大简化了用户的操作,提升了个性化生成的效率和效果。 UniPortrait以统一的方式定制单 ID 和多 ID 图像,提供高保真身份保存、广泛的面部可编辑性、自由格式的文本描述,并且无需预先确定的布局。