opencv基础45-图像金字塔01-高斯金字塔cv2.pyrDown()

news2024/10/6 9:07:08

什么是图像金字塔?

图像金字塔(Image> Pyramid)是一种用于多尺度图像处理和分析的技术,它通过构建一系列不同分辨率的图像,从而使得图像可以在不同尺度下进行处理和分析。图像金字塔在计算机视觉、图像处理和计算机图形学等领域中广泛应用,可以用于目标检测、特征提取、图像匹配、尺度不变特征变换(SIFT)等任务。

图像金字塔通常分为两种类型:高斯金字塔和拉普拉斯金字塔。

  1. 高斯金字塔(Gaussian Pyramid):高斯金字塔通过不断降采样(缩小)原始图像来构建,每一层图像都是前一层图像的一半大小。降采样可以通过平均像素值或使用高斯滤波器来实现。高斯金字塔在图像缩放、分割、模糊等任务中有用。

  2. 拉普拉斯金字塔(Laplacian Pyramid):拉普拉斯金字塔是通过从高斯金字塔中的每一层图像减去其上一层的上采样图像得到的。这一过程使得每一层图像包含了高频成分,即图像细节。拉普拉斯金字塔在图像增强、压缩、图像融合等方面有用。

使用图像金字塔,可以在不同尺度下对图像进行处理,从而能够更好地应对图像中存在的不同尺度的特征。例如,在目标检测中,可以使用图像金字塔来检测不同大小的目标物体。在SIFT等特征提取方法中,金字塔可以帮助提取出尺度不变的特征点。

总之,图像金字塔是一种重要的多尺度处理工具,能够在图像分析和处理中提供更丰富的信息,以适应不同尺度的特征和任务。

应用场景:

图像金字塔在计算机视觉、图像处理和计算机图形学等领域中有许多应用场景,下面列举了一些常见的应用场景:

  1. 目标检测:在目标检测任务中,物体可能以不同的尺度出现在图像中。使用图像金字塔可以在不同尺度下进行检测,从而识别不同大小的目标物体。

  2. 特征提取:一些特征提取方法,如尺度不变特征变换(SIFT)、尺度不变特征点检测(SURF)等,需要在不同尺度下提取特征。图像金字塔可以帮助提取出尺度不变的特征点和描述符。

  3. 图像匹配与对准:在图像配准和匹配任务中,图像可能存在缩放、旋转等变换。使用图像金字塔可以在不同尺度下进行匹配和对准,提高匹配的准确性和鲁棒性。

  4. 图像融合:将两幅图像融合成一幅图像时,可能需要考虑图像的尺度和细节。图像金字塔可以帮助在不同尺度下融合图像,实现平滑的过渡和自然的融合效果。

  5. 图像增强与去噪:在图像增强和去噪任务中,可以通过图像金字塔在不同尺度下对图像进行处理,实现局部增强和噪声抑制。

  6. 缩放与旋转:对于图像的缩放和旋转操作,图像金字塔可以帮助实现平滑的过渡和保留图像细节。

  7. 纹理分析:在纹理分析任务中,不同尺度下的纹理特征可能会影响分析结果。图像金字塔可以用于提取不同尺度下的纹理特征。

  8. 图像压缩:在图像压缩中,可以使用金字塔结构来分析图像的不同尺度特征,从而更有效地进行压缩编码。

实现原理:

图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合。该组图像是由单个图像通过不断地降采样所产生的,最小的图像可能仅仅有一个像素点。
图 11-1 是一个图像金字塔的示例。从图中可以看到,图像金字塔是一系列以金字塔形状排列的、自底向上分辨率逐渐降低的图像集合。

在这里插入图片描述

通常情况下,图像金字塔的底部是待处理的高分辨率图像(原始图像),而顶部则为其低分辨率的近似图像。向金字塔的顶部移动时,图像的尺寸和分辨率都不断地降低。通常情况下,每向上移动一级,图像的宽和高都降低为原来的二分之一。

图像金字塔是同一图像不同分辨率的子图集合,是通过对原图像不断地向下采样而产生的,即由高分辨率的图像(大尺寸)产生低分辨率的近似图像(小尺寸)。

最简单的图像金字塔可以通过不断地删除图像的偶数行和偶数列得到。例如,有一幅图像,其大小是 NN,删除其偶数行和偶数列后得到一幅(N/2)(N/2)大小的图像。经过上述处理后,图像大小变为原来的四分之一,不断地重复该过程,就可以得到该图像的图像金字塔。

也可以先对原始图像滤波,得到原始图像的近似图像,然后将近似图像的偶数行和偶数列删除以获取向下采样的结果。有多种滤波器可以选择。例如:

  • 邻域滤波器:采用邻域平均技术求原始图像的近似图像。该滤波器能够产生平均金字塔。
  • 高斯滤波器:采用高斯滤波器对原始图像进行滤波,得到高斯金字塔。这是 OpenCV 函数 cv2.pyrDown()所采用的方式。

高斯金字塔是通过不断地使用高斯金字塔滤波、采样所产生的,其过程如图 11-2 所示。

在这里插入图片描述
经过上述处理后,原始图像与各次向下采样所得到的结果图像共同构成了高斯金字塔
例如,可以将原始图像称为第 0 层,第 1 次向下采样的结果图像称为第 1 层,第 2 次向下采样的结果图像称为第 3 层,以此类推。上述图像所构成的高斯金字塔如图 11-3 所示。在本章中为了便于表述,统一将图像金字塔中的底层称为第 0 层,底层上面的一层称为第 1 层,并以此类推。

在这里插入图片描述
---------------------------------------------------------------------
在向上采样的过程中,通常将图像的宽度和高度都变为原来的 2 倍。这意味着,向上采样的结果图像的大小是原始图像的 4 倍。因此,要在结果图像中补充大量的像素点。对新生成的像素点进行赋值,称为插值处理,该过程可以通过多种方式实现,例如最临近插值就是用最邻
近的像素点给当前还没有值的像素点赋值。

有一种常见的向上采样,对像素点以补零的方式完成插值。通常是在每列像素点的右侧插入值为零的列,在每行像素点的下方插入值为零的行。在图 11-4 中,左侧是要进行向上采样的4 个像素点,右侧是向上采样时进行补零后的处理结果。

在这里插入图片描述
接下来,使用向下采样时所用的高斯滤波器(高斯核)对补零后的图像进行滤波处理,以获取向上采样的结果图像。但是需要注意,此时图像中四分之三像素点的值都是零。所以,要将高斯滤波器系数乘以 4,以保证得到的像素值范围在其原有像素值范围内。

例如,针对图 11-4 右侧的像素点,其对应的是 8 位图像,像素值的范围是[0, 255]。由于其中四分之三的像素点的值都为零,如果直接使用高斯滤波器对其进行卷积计算,会导致像素值的范围变为[0, 255*1/4]。
所以,要将所使用的高斯滤波器系数乘以 4,以保证得到像素值的范围仍旧在[0, 255]内。

或者,从另一个角度理解,在原始图像内每个像素点的右侧列插入零值列,在每个像素点的下一行插入零值行,将图像变为原来的两倍宽、两倍高。接下来,将补零后的图像用向下采样时所使用的高斯滤波器进行卷积运算。最后,将图像内每个像素点的值乘以 4,以保证像素值的范围与原始图像的一致。

通过以上分析可知,向上采样和向下采样是相反的两种操作。但是,由于向下采样会丢失像素值,所以这两种操作并不是可逆的。也就是说,对一幅图像先向上采样、再向下采样,是无法恢复其原始状态的;同样,对一幅图像先向下采样、再向上采样也无法恢复到原始状态。

pyrDown 函数及使用

OpenCV 提供了函数 cv2.pyrDown(),用于实现图像高斯金字塔操作中的向下采样,其语法形式为:

dst = cv2.pyrDown( src[, dstsize[, borderType]] )

其中:

  • dst 为目标图像。
  • src 为原始图像。
  • dstsize 为目标图像的大小。
  • borderType 为边界类型, 默认值为 BORDER_DEFAULT , 且这里仅 支 持BORDER_DEFAULT。
    默认情况下,输出图像的大小为 Size((src.cols+1)/2, (src.rows+1)/2)。在任何情况下,图像尺寸必须满足如下条件:
|dst. width ∗ 2 − src. cols|≤2
|dst. height ∗ 2 − src. rows|≤2

cv2.pyrDown()函数首先对原始图像进行高斯滤波变换,以获取原始图像的近似图像。比如,高斯滤波变换所使用的核(高斯滤波器)为:

在这里插入图片描述
在获取近似图像后,该函数通过抛弃偶数行和偶数列来实现向下采样。

代码示例

使用函数 cv2.pyrDown()对一幅图像进行向下采样,观察采样的结果。

import cv2
o=cv2.imread("lena.png",cv2.IMREAD_GRAYSCALE)
r1=cv2.pyrDown(o)
r2=cv2.pyrDown(r1)
r3=cv2.pyrDown(r2)
print("o.shape=",o.shape)
print("r1.shape=",r1.shape)
print("r2.shape=",r2.shape)
print("r3.shape=",r3.shape)
cv2.imshow("original",o)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)
cv2.waitKey()
cv2.destroyAllWindows()

使用 cv2.pyrDown()函数进行了 3 次向下采样,并且用 print()函数输出了每次采样结果图像的大小。cv2.imshow()函数显示了原始图像和经过 3 次向下采样后得到的结果图像。
运行结果:

o.shape= (512, 512)
r1.shape= (256, 256)
r2.shape= (128, 128)
r3.shape= (64, 64)

在这里插入图片描述
从上述结果可知,经过向下采样后,图像的行和列的数量都会变为原来的二分之一,图像整体的大小会变为原来的四分之一。这里为了便于比较,将它们调整成了等高格式展示。通过图像的比例关系,可以推断出各个图像的大致尺寸比例

pyrUp 函数及使用

OpenCV 中,使用函数 cv2.pyrUp()实现图像金字塔操作中的向上采样,其语法形式如下:
dst = cv2.pyrUp( src[, dstsize[, borderType]] )
其中:

  • dst 为目标图像。
  • src 为原始图像。
  • dstsize 为目标图像的大小。
  • borderType 为边界类型, 默认值为 BORDER_DEFAULT , 且这里仅 支 持BORDER_DEFAULT。

默认情况下,目标图像的大小为 Size(src.cols*2, src.rows*2)
在任何情况下,图像尺寸需要满足下列条件:

|dst. width − src. cols ∗ 2|≤mod(dst. widh, 2)
|dst. height − src. rows ∗ 2|≤mod(dst. height, 2)

对图像向上采样时,在每个像素的右侧、下方分别插入零值列和零值行,得到一个偶数行、偶数列(即新增的行、列)都是零值的新图像 New。接下来,用向下采样时所使用的高斯滤波器对新图像 New 进行滤波,得到向上采样的结果图像。需要注意的是,为了确保像素值区间在向上采样后与原始图像保持一致,需要将高斯滤波器的系数乘以 4。
上一段描述的是 OpenCV 函数 cv2.pyrUp()所实现的向上采样过程。了解上述过程,有助于我们更好地理解和使用该函数。

但是,OpenCV 库的目的就是要让我们忽略这些细节,直接使
用函数 cv2.pyrUp()完成向上采样。所以,在刚开始的学习阶段,我们也可以先忽略这些细节。

代码示例:

import cv2
o=cv2.imread("lena.png")
r1=cv2.pyrUp(o)
r2=cv2.pyrUp(r1)
r3=cv2.pyrUp(r2)
print("o.shape=",o.shape)
print("r1.shape=",r1.shape)
print("r2.shape=",r2.shape)
print("r3.shape=",r3.shape)
cv2.imshow("original",o)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)
cv2.imshow("r3",r3)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

o.shape= (512, 512, 3)
r1.shape= (1024, 1024, 3)
r2.shape= (2048, 2048, 3)
r3.shape= (4096, 4096, 3)

从上述输出结果可知,经过向上采样后,图像的宽度和高度都会变为原来的 2 倍,图像整体大小会变为原来的 4 倍。

采样可逆性的研究

图像在向上采样后,整体尺寸变为原来的 4 倍;在向下采样后,整体尺寸变为原来的四分之一。

图 11-7 展示了图像在采样前后的大小变化关系。一幅 MN 大小的图像经过向下采样后大小会变为(M/2)(N/2);一幅 MN 大小的图像经过向上采样后大小会变为(2M)(2N)。

在这里插入图片描述
一幅图像在先后经过向下采样和向上采样后,会恢复为原始大小,如图 11-8 所示。

在这里插入图片描述

虽然一幅图像在先后经过向下采样、向上采样后,会恢复为原始大小,但是向上采样和向下采样不是互逆的。也就是说,虽然在经历两次采样操作后,得到的结果图像与原始图像的大小一致,肉眼看起来也相似,但是二者的像素值并不是一致的

代码示例:

使用函数 cv2.pyrDown()和 cv2.pyrUp(),先后将一幅图像进行向下采样、向上采样,观察采样的结果及结果图像与原始图像的差异。

import cv2
o=cv2.imread("lena.png")
down=cv2.pyrDown(o)
up=cv2.pyrUp(down)
diff=up-o #构造 diff 图像,查看 up 与 o 的区别
print("o.shape=",o.shape)
print("up.shape=",up.shape)
cv2.imshow("original",o)
cv2.imshow("up",up)
cv2.imshow("difference",diff)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

o.shape= (512, 512, 3)
up.shape= (512, 512, 3)

在这里插入图片描述

  • 左图是原始图像 o。
  • 中间图是对图像 down(通过对原始图像 o 向下采样得到)进行向上采样后获得的结果图
    像 up。
  • 右图是对图像 up 和原始图像 o 进行减法运算的结果(差值)图像 diff。图像 diff 反映的是图像 up 和原始图像 o 的差值。

本例在尝试向大家说明,原始图像先后经过向下采样、向上采样后,所得到的结果图像与原始图像的大小一致,看起来也很相似,但是它们的像素值并不是一致的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

就地程控站控制柜与斗轮机之间无线通讯

一、应用背景 马钢的前身是成立于1953年的马鞍山铁厂,2019年马钢集团正式成为中国宝武控股子公司。马钢产品以建筑用型线材为主,满足重型工业厂房、轻钢结构、高层建筑、桥梁结构、工业管道等构件的加工需要。目前马钢在岗员工4.8万人,具备了…

三菱PLC与变频器通讯-ModbusRTU协议

Modbus是Modicon公司为其PLC与主机之间的通讯而发明的串行通讯协议。其物理层采用RS232、485等异步串行标准。由于其开放性而被大量的PLC及RTU厂家采用。Modbus通讯方式采用主从方式的查询-相应机制,只有主站发出查询时,从站才能给出响应&…

【快应用】list组件属性的运用指导

【关键词】 list、瀑布流、刷新、页面布局 【问题背景】 1、 页面部分内容需要瀑布流格式展示,在使用lsit列表组件设置columns进行多列渲染时,此时在里面加入刷新动画时,动画只占了list组件的一列,并没有完全占据一行宽度&…

Node.js新手在哪儿找小项目练手?

前言 可以参考一下下面的nodejs相关的项目,希望对你的学习有所帮助,废话少说,让我们直接进入正题>> 1、 NodeBB Star: 13.3k 一个基于Node.js的现代化社区论坛软件,具有快速、可扩展、易于使用和灵活的特点。它支持多种数…

数字孪生技术:建筑环境的智能化革命

在数字化时代,科技的飞速发展正在深刻影响着建筑行业。数字孪生技术作为数字化转型的重要组成部分,正在为建筑环境带来革命性的变革。数字孪生技术通过将现实世界与虚拟模型实时同步,为建筑规划、施工、运营和维护等各个环节提供了更智能、高…

准备三个月,终拿快手offer!薪资28k*16

昨天有VIP小伙伴给小孟说:拿到了快手的offer。 聊了半个小时,待遇还不错。准备去了!28k,16薪。 快手的k3c职级可对标阿里的P7。 前面我说过:能去大厂就去大厂,有机会就去争取,年纪轻轻的&a…

电脑怎么备份文件?学会这4招!

“由于我是个比较粗心的人,平常很容易把一些文件弄不见。因此,我想把电脑中一些比较重要的文件进行备份,有没有朋友知道电脑怎么备份文件呢?求解答!” 在使用电脑时,可能经常会由于各种突然原因导致我们的文…

RDMA服务类型(二)

参考IB协议版本V1.4:https://download.csdn.net/download/zz2633105/88148107 参考知乎文章《RDMA基本服务类型》:https://zhuanlan.zhihu.com/p/144099636 可靠服务 何为可靠服务呢,引用IB协议中的原话(IB V1.4版本9.7章节&am…

专业服务管理软件推荐:提升效率的强大工具

借助Zoho Projects的多功能专业服务管理平台,将服务交付提升到一个新的水平。 一、提高利润并满足每一位客户 Zoho Projects的多功能专业服务管理系统使您和您的团队能够更好地管理您的所有工作,以提高客户满意度。优化沟通、与同事协作并监控项目的每个…

Kendo UI for jQuery,一个现代的jQuery UI组件!

Kendo UI for jQuery是什么? Kendo UI for jQuery是完整的jQuery UI组件库,可快速构建出色的高性能响应式Web应用程序。Kendo UI for jQuery提供在短时间内构建现代Web应用程序所需要的工具,从多个UI组件中选择,并轻松地将它们组…

亿发江西中小型制造企业信息化建设解决方案,2023数字化转型升级

实体经济在经济中的重要性愈发凸显,江西省作为制造业强省,要实现制造业经济高质量发展,信息技术与制造业的深度汇合是不可或缺的关键路径。在这个制造业转型升级的浪潮中,中小企业成为了江西省制造业转型的焦点。让我们深入探讨一…

C++学习笔记总结练习:正则表达式

正则表达式 目录 regex正则表达式的定义regex_match/search/replace正则表达式的三个操作smatch、sregex_iterator正则表达式的结果对象以及与其配套的迭代器。 参考文献 正则表达式总结 1 正则表达式基础 不考虑子表达式的内容 头文件 #include<regex>库组件 库组件作…

Kubernetes kubectl管理命令使用方法

陈述式资源管理方法&#xff08;通过命令行&#xff09; 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化…

开发者如何预防及解决应用内的无效流量问题?

对开发者而言&#xff0c;当APP应用内被发现存在大量的无效流量时&#xff0c;存在被广告平台限流甚至封号的风险。 广告平台的“无效流量”政策是为了保护广告主、媒体、用户免受欺诈和不良广告体验的侵害&#xff0c;开发者如何预防和解决无效流量的问题呢&#xff1f; 一、…

动力节点|Docker教程,入门到高阶即学即用

Docker是当今云计算领域最热门的技术之一&#xff0c;也是IT从业人员的必备技能之一 学习Docker可以让你更好地了解和应用容器化技术&#xff0c;实现软件运环境的快速部署和管理。 如何系统全面掌握Docker&#xff1f; 推荐一套天花板级Docker教程&#xff0c;动力节点的动力哥…

C语言笔试训练【第五天】

文章目录 1、如下程序的功能是&#xff08; &#xff09; 2、对于代码段&#xff0c;下面描述正确的是&#xff08; &#xff09; 3、以下程序运行时&#xff0c;若输入 1abcedf2df<回车> 输出结果是&#xff08; &#xff09; 4、下列条件语句中&#xff0c;功能与其…

成功解决Android设备adb连接后显示device unauthorized

一、提出问题 在电脑通过USB连接新的Android设备&#xff0c;想要通过adb来进行一些操作时&#xff0c;却发现命令提示符上在输入下面命令后显示设备未授权的信息也就是"unauthorized" adb devices二、不可行的解决方案 有人提出的解决方案是打开Android设备的开发…

西瓜书读书笔记整理(五)—— 第四章 决策树

第四章 决策树 4.1 基本流程4.1.1 什么是决策树算法4.1.2 决策树学习的目的4.1.3 决策树学习基本过程4.1.4 决策树学习基本算法4.1.5 递归结束的三种情况 4.2 划分选择4.2.1 信息增益&#xff08;information gain&#xff09;—— ID3 决策树学习算法属性划分准则4.2.2 信息增…

在工作中使用ChatGPT需要担心泄密问题吗?

​OpenAI的ChatGPT可以通过自动简化繁琐的任务&#xff0c;针对挑战性问题的提供创造性的解决方案来提高员工的生产力。但随着这项技术被整合到人力资源平台和其他工作场所中&#xff0c;它给各个企业带来了巨大的挑战。苹果、Spotify、Verizon和三星等大公司已禁止或限制员工在…

【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…