数字图像处理(21): 图像金字塔(高斯金字塔 与 拉普拉斯金字塔)

article/2025/10/22 4:52:37

目录

1 图像金字塔简介

2 向下取样——pyrDown()

2.1 基础理论

2.2 代码示例

3 向上取样——pyrUp()

3.1 基础理论

3.2 代码示例

4 Laplacian 金字塔

4.1 基础理论

4.2 代码示例

参考资料


 

1 图像金字塔简介

以多个分辨率来表示图像的一种有效且概念简单的结构是图像金字塔图像金字塔最初用于机器视觉和图像压缩,一个图像金字是一系列以金字塔形状排列的、分辨率逐步降低的图像集合。

如图下图所示,它包括了四层图像,将这一层一层的图像比喻成金字塔。图像金字塔可以通过梯次向下采样获得,直到达到某个终止条件才停止采样,在向下采样中,层级越高,则图像越小,分辨率越低。

 

生成图像金字塔主要包括两种方式:向下取样向上取样

如下图所示:

向下取样:将图像从G0转换为G1、G2、G3,图像分辨率不断降低的过程;

向上取样:将图像从G3转换为G2、G1、G0,图像分辨率不断增大的过程。

下面将依次介绍向下取样 和 向上取样

 


2 向下取样——pyrDown()

2.1 基础理论

在图像向下取样中,一般分两步:

(1)对图像Gi进行高斯卷积核(高斯滤波);

(2)删除所有的偶数行和列。

 

其中,高斯核卷积运算(高斯滤波)就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值(权重不同)经过加权平均后得到。常见的 3\times3 和 5\times5 高斯核如下:

                                                                              K(3,3)=\frac{1}{16}\times \left[ \begin{matrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{matrix} \right]

                                                                     K(5,5)=\frac{1}{273}\times \left[ \begin{matrix} 1 & 4 & 7 & 4 & 1 \\ 4 & 16 & 26 & 16 & 4 \\ 7 & 26 & 41 & 26 & 7 \\ 4 & 16 & 26 & 16 & 4 \\ 1 & 4 & 7 & 4 & 1 \\ \end{matrix} \right]

关于高斯滤波的详细过程,可以参见博客:图像平滑 (均值滤波、中值滤波和高斯滤波)

 

如下图所示,向下取样后,原始图像 G_i 具有 M\timesN 个像素,进行向下取样之后,所得到的图像 G_i+1 具有 M/2 \times N/2 个像素,只有原图的四分之一。通过对输入的原始图像不停迭代以上步骤就会得到整个金字塔。

:由于每次向下取样会删除偶数行和列,所以它会不停地丢失图像的信息。

 

下面是向下取样的图像,可以看到图像不断缩小。

 

 

2.2 代码示例

在OpenCV中,向下取样使用的函数为pyrDown(),其函数用法如下所示:

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

其中,参数:

src 表示输入图像;

dst 表示输出图像,和输入图像具有一样的尺寸和类型;

dstsize 表示输出图像的大小,默认值为Size();

borderType 表示像素外推方法,详见cv::bordertypes 。

 

(1)一次向下采样

代码如下所示:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取原始图像
img = cv2.imread('zxp.jpg')#图像向下取样
r = cv2.pyrDown(img)#显示图像
cv2.imshow('original', img)
cv2.imshow('PyrDown', r)cv2.waitKey()
cv2.destroyAllWindows()

 

运行结果如下图所示:

 

(2)多次向下采样

代码如下所示:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取原始图像
img = cv2.imread('zxp.jpg')#图像向下取样
r1 = cv2.pyrDown(img)
r2 = cv2.pyrDown(r1)
r3 = cv2.pyrDown(r2)#显示图像
cv2.imshow('original', img)
cv2.imshow('PyrDown1', r1)
cv2.imshow('PyrDown2', r2)
cv2.imshow('PyrDown3', r3)cv2.waitKey()
cv2.destroyAllWindows()

 

运行结果如下图所示:

 


3 向上取样——pyrUp()

3.1 基础理论

在图像向上取样是由小图像不断放图像的过程。它将图像在每个方向上扩大为原图像的2倍,新增的行和列均用0来填充,并使用与“向下取样”相同的卷积核乘以4,再与放大后的图像进行卷积运算,以获得“新增像素”的新值。

 

如图下图所示,它在原始像素45、123、89、149之间各新增了一行和一列值为0的像素。

 

如下图所示,为图像的向上采样和向下采样的例子。

注:向上取样和向下取样无法互逆的。

 

 

3.2 代码示例

在OpenCV中,向上取样使用 pyrUp() 函数,其函数用法如下所示:

dst = pyrUp(src[, dst[, dstsize[, borderType]]])

其中,参数:

src 表示输入图像;

dst 表示输出图像,和输入图像具有一样的尺寸和类型;

dstsize 表示输出图像的大小,默认值为Size();

borderType 表示像素外推方法,详见cv::bordertypes 。

 

代码如下所示:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取原始图像
img = cv2.imread('zxp_PyrDown2.jpg')#图像向上取样
r = cv2.pyrUp(img)#显示图像
cv2.imshow('original', img)
cv2.imshow('PyrUp', r)
cv2.waitKey()
cv2.destroyAllWindows()

 

运行结果如下图所示:

 


4 Laplacian 金字塔

4.1 基础理论

前面提到的均是高斯金字塔(使用高斯核),下面介绍拉普拉斯(Laplacian) 金字塔拉普拉斯(Laplacian) 金字塔是在高斯金字塔的基础上新的金字塔。

如下图所示,拉普拉斯(Laplacian) 金字塔的表达式:

 

拉普拉斯每一层表示如下图所示:

 

下图高斯金字塔和拉普拉斯金字塔 交叉使用得到不同的图像。

 

 

 

4.2 代码示例

 

(1) 拉普拉斯第0层

代码如下所示:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取原始图像
img = cv2.imread('lena.tiff')#图像向下取样
r1 = cv2.pyrDown(img)#图像向上取样
r2 = cv2.pyrUp(r1)# 拉普拉斯第0层
LapPyr0 =img-r2#显示图像
cv2.imshow('original', img)
cv2.imshow('LapPyr', LapPyr0)
cv2.waitKey()
cv2.destroyAllWindows()

 

运行结果如下图所示:

 

 

(2) 拉普拉斯第0层和拉普拉斯第1层

代码如下所示:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取原始图像
img = cv2.imread('lena.tiff')#图像向下取样
r1 = cv2.pyrDown(img)#图像向上取样
r2 = cv2.pyrUp(r1)# 拉普拉斯第0层
LapPyr0 =img-r2#图像向下取样
r3 = cv2.pyrDown(r1)#图像向上取样
r4 = cv2.pyrUp(r3)# 拉普拉斯第1层
LapPyr1 =r1-r4#显示图像
cv2.imshow('original', img)
cv2.imshow('LapPyr0', LapPyr0)
cv2.imshow('LapPyr1', LapPyr1)
cv2.waitKey()
cv2.destroyAllWindows()

 

运行结果如下图所示:

 


参考资料

[1] https://blog.csdn.net/Eastmount/article/details/89341077

[2] Python+OpenCV图像处理

[3] 冈萨雷斯. 数字图像处理(第三版) 


http://chatgpt.dhexx.cn/article/R4u52Zmo.shtml

相关文章

图像处理(二):图像金字塔

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效且概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。 高斯金字塔是常见的图像金字塔,如下所示:…

什么是图像金字塔

有些情况下,我们需要处理源自同一张图像的不同分辨率的图像集合。这些不同分辨率的图像组成的集合称为图像金字塔。 图像金字塔的主要类型可分为低通和带通 有两种常用图像金字塔: Gaussian Pyramid (低通)Laplacian Pyramids &…

OpenCV图像处理学习十三,图像金字塔——高斯金字塔和拉普拉斯金字塔

一.图像金字塔概念 我们在图像处理中常常会调整图像大小,最常见的就是放大(zoom in)和缩小(zoom out),尽管几何变换也可以实现图像放大和缩小,但是这里我们介绍图像金字塔 。 一个图像金字塔是由一系列的图像组成&…

图像金字塔

图像金字塔是图像处理和计算机视觉中的概念,常常用于多尺度处理领域(multiscale processing),尤其早年的图像匹配、识别等算法中都用到了图像金字塔 高斯金字塔(Gaussian pyramid) 金字塔的底层为原始图像&#xff0…

【OpenCV 学习笔记】第十一章: 图像金字塔

第十一章: 图像金字塔 一、什么是图像金字塔 同一张图片不同分辨率的子图的集合。 图像金字塔底部是待处理的高分辨率图像,也就是原始图像,顶部是低分辨率的近似图像。一般情况下,都是每向上移动一级,图像的宽和高都降低为原来的…

openCV——图像金字塔

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

第11章:图像金字塔

第11章:图像金字塔 一、理论基础:1. 向下采样:2. 向上采样: 二、pyrDown函数使用:三、pyrUp函数及使用:四、采样可逆性研究五、拉普拉斯金字塔1. 定义:2. 应用: 什么是图像金子塔&am…

C语言for语句简单打印心形。

C语言简单for语句打印心形 #include<stdio.h> int main() {int i;int j;int k;int n;int m;printf("\n\n\n\n\n\n\n\n表白朋友圈:\n\n\n\n");for (i 1; i < 3; i){if (i 1){printf(" ");printf(&quo…

C语言暴力解法:围圈报数(解析与思考)

围圈报数 题目 解题步骤 一.整体逻辑 1.从第&#xff11;个人开始报数&#xff0c; 2.数到第&#xff4d;个人出列&#xff0c; 3.然后从出列的下一个人开始报数&#xff0c; 4.数到第&#xff4d;个人又出列&#xff0c;…&#xff0c;如此反复到所有的人全部出列为止。 二…

html 一个圆圈一个c,如何用c语言程序画一个圆?

以一个空心圆来举例。 /* 判断是是否在圆上 */ int isAtCircle(int x, int y, int r) { /* 将(x, y)转换为相当圆心(r, r)的坐标 */ int rx x - r; int ry y - r; double d sqrt(rx*rx ry*ry) - r; /*计算到圆心的距离*/ if(fabs(d) < 0.5)""> return 1; e…

在HTML 页面中如何显示带圈圈的数字

数字外面有个圈圈&#xff0c; 或者圈圈里有反底色显示&#xff0c;效果类似&#xff1a; 带圈圈的数字示例&#xff1a; ① 反色圈圈数字示例&#xff1a; ❶ 要实现上面的效果&#xff0c;使用以下技术都可以达成&#xff1a; 方式1&#xff0c;. 使用图片 <image&…

C语言打印出心形表白,初学C语言也能看懂~(3)

例2&#xff1a;C语言实现打印出心形&#xff0c;初学者的表白神器。 解题思路&#xff1a;这道例题可以分成4部分&#xff0c;前3行一部分&#xff0c;4-6行一部分&#xff0c;7-13行一部分&#xff0c;最后一行一部分&#xff0c;读者请仔细阅读注释&#xff0c;小林写的很详…

C语言-报数出圈问题(链表实现)

问题描述&#xff1a;n个人围成一圈&#xff0c;顺序编号。从第一个人开始从1到m报数&#xff0c;凡报到m的人退出圈子&#xff0c;编程求解最后留下的人的初始编号。 程序运行示例&#xff1a; 6 3&#xff08;两个输入数据之间有空格&#xff09; 1输入格式&#xff1a;scanf…

蓝桥杯 小朋友崇拜圈 C语言

标题&#xff1a;小朋友崇拜圈 班里N个小朋友&#xff0c;每个人都有自己最崇拜的一个小朋友&#xff08;也可以是自己&#xff09;。 在一个游戏中&#xff0c;需要小朋友坐一个圈&#xff0c; 每个小朋友都有自己最崇拜的小朋友在他的右手边。 求满足条件的圈最大多少人&…

java 圈复杂度_详解圈复杂度

详解圈复杂度 圈复杂度概念 圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准。由托马斯J麦凯布(Thomas J. McCabe, Sr.)于1976年提出,用来表示程序的复杂度,其符号为VG或是M。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为…

控制台图形化打印二叉树(c/c++)

二叉树作为一种常见的数据结构,我们在学习的过程中会经常用到. 当我们做课设的时候,能把二叉树图形化的打印出来无疑是一个加分项,所以今天我们就来探讨一下如何图形化的打印出二叉树来. 目录 分析阶段 如何打印 如何将数据存入打印数组 代码实现 存储结构定义 二叉树的…

C语言:围圈报数游戏

游戏规则&#xff1a;有N个人围成一圈&#xff0c;顺序排号&#xff0c;从第一个人开始1到D报数&#xff0c;&#xff0c;凡报到D的人退出圈子&#xff08;下场&#xff09;&#xff0c;问最后留下来的是原来的第几号&#xff1f; 逻辑思想&#xff1a;用布尔数组记下每个人的…

c语言 打印共九行的菱形,用C语言打印图案的几种实现方法

循环的使用 维普资讯 http://doc.xuehai.net 科技伯. 1 1 0计算机与信息技术 0 S IN E I F R TO CE C N O MA I N 20 06年第 4期 用 C语言打印图案的几种实现方法 陈莹张青锋 (口师范学院计科系河南周口周 46 0 ) 60 0 摘要&#xff1a;经过几年来在 c语言教学中的实践&#xf…

C语言实现打印简易圣诞树

C语言实现打印简易圣诞树 引言想法的诞生一棵简易的圣诞树怎么构成梯形的代码梯形的叠加做一个长方形树干 总代码及其输出的简易圣诞树 引言 各位大佬好&#xff0c;我是一名大一的学生&#xff0c;目前只学习了C语言的语法基础&#xff0c;在CSDN这个平台上将自己所学的东西记…

HTML圈c怎么打出来,一种方便固定手表的展示C圈的制作方法

本实用新型属于展示C圈技术领域&#xff0c;具体涉及一种方便固定手表的展示C圈。 背景技术&#xff1a; 展示C圈是用来展示手表的必备器材&#xff0c;展示C圈采用耐用透明展示底座&#xff0c;方便工作人员为顾客展示手表的折光度。 原有展示C圈&#xff0c;手表固定在C圈上时…