【OpenCV】第十一章: 图像金字塔

这篇具有很好参考价值的文章主要介绍了【OpenCV】第十一章: 图像金字塔。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第十一章: 图像金字塔

一、什么是图像金字塔¶

同一张图片不同分辨率的子图的集合。图像金字塔的作用,opencv,学习,计算机视觉

图像金字塔底部是待处理的高分辨率图像,也就是原始图像,顶部是低分辨率的近似图像。一般情况下,都是每向上移动一级,图像的宽和高都降低为原来的1/2 。

二、为什么要生成图像金字塔,图像金字塔能干啥?

  • 1、我们可以提取更'有用'的特征。如果一张图片是1024x1024大小的,那么它就有100万多个像素点,如果我们把图片的原始数据喂入神经网络模型,光输入的神经元数量都要100多万个,计算资源会迅速崩掉。图像金字塔是对图像尺寸进行的处理,这样有利于我们提取最'有用'的特征,或者说进行降维操作。
  • 2、可以避免模型过拟合。在某些图像处理的算法中,图像金字塔这种的多分辨率运算可以避免陷入局部点,增强模型鲁棒性。
  • 3、图像金字塔底层是清晰的原始图像,越往上图像越模糊,因此我们可以通俗的理解:在底层可以看清楚更多的图像细节,在高层只可以看到轮廓。所以,在目标检测领域,图像中的物体通常很可能是远近不一,大小不一的,此时我们就可以利用金字塔来检测不同尺度下的物体。这种方法要比使用不同大小的sliding window在原图上做检测节省太多的算力!并且效果也要好很多!
  • 4、对一张图像构建不同的尺度空间,这种操作在目标检测中非常有用,比如最简单的Viola的人脸检测器就是用的这个技术。
  • 5、图像金字塔从另外一个角度理解就是:它将原图像分别分解到不同的空间频带上,所以可以用在多分辨率融合算法中,融合过程是在各空间频率层上分别进行的,这样就可以针对不同分解层的不同频带上的特征与细节,采用不同的融合算子以达到突出特定频带上特征与细节的目的。也就是有可能将来自不同图像的特征与细节融合在一起。
  • 6、图像金字塔用的最多的就是用在SIFT算法中,在SIFT提取的时候,因为template上的局部特征跟目标图像上的实际特征可能存在尺度上的差异,使用尺度空间是为了达到尺度不变性
  • 7、在ORB的改进算法中也可以运用图像金字塔解决尺度不变换特性。
  • 8、SURF算法中也用到了图像金字塔的思想。

    小结:要找原因,原因很多,也说明图像金字塔应用很广泛,是一个基础理论和技术。其实在计算机视觉里,很多看似直观且简单的东西往往有层出不穷用法,除了本章的金字塔,还有比如直方图,比如二值化,比如卷积,比如积分图,比如距离变换……等等。虽然都不是什么高级的难以理解的东西,但一旦用到巧处,就非常耐人寻味!

三、理论基础:下采样、上采样、滤波器

  • 下采样:自下而上生成一个图像金字塔,最下面一般就是原图,依次往上的图片尺寸减半。
  • 上采样:自上而下生成一个图像金字塔,最上面一般是一个尺寸较小的特征图,依次往下的图片尺寸变为原来的二倍。

如果我们通过下采样生成一个金字塔,最简单的做法就是:不断地删除图像的偶数行和偶数列,重复这个过程,就得到一个金字塔。
如果我们通过上采样生成一个金字塔,最简单的就是:在每列像素点的右边插入值为0的列,在每行像素点下面插入值为0的行,不断重复,就生成一个金字塔了。
小结:
1、下采样是图像不断变小的过程,上采样是图像不断变大的过程。
2、一个图像下采样一次,在执行一次上采样,虽然尺寸恢复到原图像的尺寸,但像素值已经改变!!!也就是这两种操作是不可逆的。

  • 滤波器
    为什么要用滤波器?
    我们下采样生成金字塔图像时,是直接删除偶数行偶数列的操作,但这种操作意味着直接丢弃图像中的信息!为了减轻图像信息的丢失,我们在下采样操作之前先用滤波器对原始图像滤波操作一遍,这样滤波后的图像就是原始图像的近似图像,此时我们在删偶数行偶数列,就没有直接的信息损失了。而对原始图像进行滤波操作有很多方法,比如我们可以用邻域滤波器进行操作,这样生成的图像就是平均金字塔。如果我们用高斯滤波器处理,我们就生成的是高斯金字塔 。
    同理,当我们上采样生成图像金字塔时,我们直接右插入列下插入行操作,这种操作会生成大量的0值像素点,这些0值像素点毫无意义,我们就需要对0值像素点进行赋值。而赋值就是插值处理。插值处理也有很多方法,比如用区域均值补充,那生成的就是平均金字塔,如果用高斯核填充就是高斯金字塔

四、上下采样API:

下采样:cv2.pyrDown(img [, dstsize, borderType])
上采样:cv2.pyrUp(img [, dstsize, borderType])
默认的尺寸都是一半一半的减小,或者一倍一倍的增加。
默认的滤波器都是高斯滤波器。

五、高斯金字塔图像金字塔的作用,opencv,学习,计算机视觉

#例11.1 对lena进行下采样
import cv2
import numpy as np
import matplotlib.pyplot as plt

lena0 = cv2.imread(r'C:\Users\25584\Desktop\lena.bmp', 0)
lena1 = cv2.pyrDown(lena0)
lena2 = cv2.pyrDown(lena1)
lena3 = cv2.pyrDown(lena2)
lena4 = cv2.pyrDown(lena3)

Fig=plt.figure(figsize=(16,10))
Grid=plt.GridSpec(33,33)
axes1=Fig.add_subplot(Grid[:17,:17]), plt.imshow(lena0, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes2=Fig.add_subplot(Grid[:9,17:25]), plt.imshow(lena1, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes3=Fig.add_subplot(Grid[:5,25:29]), plt.imshow(lena2, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes4=Fig.add_subplot(Grid[:3,29:31]), plt.imshow(lena3, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes5=Fig.add_subplot(Grid[:1,31:32]), plt.imshow(lena4, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
plt.show()

图像金字塔的作用,opencv,学习,计算机视觉

#例11.2 对lena进行上采样
import cv2
import numpy as np
import matplotlib.pyplot as plt

lena0 = cv2.imread(r'C:\Users\25584\Desktop\lena.bmp', 0)   #512
lena1 = cv2.pyrUp(lena0)  #1024
lena2 = cv2.pyrUp(lena1)  #2048
lena3 = cv2.pyrUp(lena2)  #4096


Fig=plt.figure(figsize=(16,10))
Grid=plt.GridSpec(16,16)
axes1=Fig.add_subplot(Grid[0,0]), plt.imshow(lena0, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes2=Fig.add_subplot(Grid[0:3,1:3]), plt.imshow(lena1, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes3=Fig.add_subplot(Grid[0:5,3:7]), plt.imshow(lena2, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes4=Fig.add_subplot(Grid[0:9,7:15]), plt.imshow(lena3, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
plt.show()

图像金字塔的作用,opencv,学习,计算机视觉

#例11.3 对lena先下采样再上采样,看结果图核原始图的差异,然后再lena先上采样再下采样,看结果图和原始图的差异
import cv2
import numpy as np
import matplotlib.pyplot as plt

lena0 = cv2.imread(r'C:\Users\25584\Desktop\lena.bmp', 0)   #512
lena1 = cv2.pyrDown(lena0)  #216
lena2 = cv2.pyrUp(lena1)  #512
diff1 = lena2-lena0

lena11 = cv2.pyrUp(lena0)  #1024
lena22 = cv2.pyrDown(lena11)  #512
diff2 = lena22-lena0

Fig=plt.figure(figsize=(16,10))
Grid=plt.GridSpec(6,10)
axes1=Fig.add_subplot(Grid[:2,:2]), plt.imshow(lena0, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes2=Fig.add_subplot(Grid[0,2]), plt.imshow(lena1, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes3=Fig.add_subplot(Grid[:2,3:5]), plt.imshow(lena2, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes4=Fig.add_subplot(Grid[:2,5:7]), plt.imshow(diff1, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes21=Fig.add_subplot(Grid[2:4,:2]), plt.imshow(lena0, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes22=Fig.add_subplot(Grid[2:6,2:6]), plt.imshow(lena11, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes23=Fig.add_subplot(Grid[2:4,6:8]), plt.imshow(lena22, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes24=Fig.add_subplot(Grid[2:4,8:10]), plt.imshow(diff2, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
plt.show()

图像金字塔的作用,opencv,学习,计算机视觉

六、拉普拉斯金字塔

拉普拉斯金字塔是在高斯金字塔的基础上生成的。
为啥要发明拉普拉斯金字塔?还是因为高斯金字塔,虽然它用高斯核过滤了一遍,但或多或少还是有信息丢失,而这些丢失的信息就是拉普拉斯金字塔 。所以拉普拉斯金字塔的作用就在于能够恢复图像的细节,就是我们从高层的尺寸小的特征图中提取特征后,我们还能通过拉普拉斯金字塔数据找回高层像素点对应的底层清晰度更高的图像,就是返回来找到更多图像的细节。
Li = Gi - PyrUp( PyrDown(Gi) )
其中,Gi:原始图像 ; Li:拉普拉斯金字塔图像图像金字塔的作用,opencv,学习,计算机视觉

#例11.4 对lena图片构造拉普拉斯金字塔
import cv2
import numpy as np
import matplotlib.pyplot as plt

lena = cv2.imread(r'C:\Users\25584\Desktop\lena.bmp', 0)   #512

G0 = lena
G1 = cv2.pyrDown(G0)
G2 = cv2.pyrDown(G1)
G3 = cv2.pyrDown(G2)
L0 = G0 - cv2.pyrUp(G1)
L1 = G1 - cv2.pyrUp(G2)
L2 = G2 - cv2.pyrUp(G3)

Fig=plt.figure(figsize=(16,10))
Grid=plt.GridSpec(33,33)
axes1=Fig.add_subplot(Grid[:17,:17]), plt.imshow(G0, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes2=Fig.add_subplot(Grid[:9,17:25]), plt.imshow(G1, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes3=Fig.add_subplot(Grid[:5,25:29]), plt.imshow(G2, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes4=Fig.add_subplot(Grid[:3,29:31]), plt.imshow(G3, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])

Fig=plt.figure(figsize=(16,10))
Grid=plt.GridSpec(33,33)
axes1=Fig.add_subplot(Grid[:17,:17]), plt.imshow(L0, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes2=Fig.add_subplot(Grid[:9,17:25]), plt.imshow(L1, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
axes3=Fig.add_subplot(Grid[:5,25:29]), plt.imshow(L2, cmap='gray'), plt.box(), plt.xticks([]), plt.yticks([])
plt.show()

图像金字塔的作用,opencv,学习,计算机视觉文章来源地址https://www.toymoban.com/news/detail-768572.html

#例11.5 使用拉普拉斯金字塔和高斯金字塔恢复原始图像
import cv2
import numpy as np
import matplotlib.pyplot as plt

lena = cv2.imread(r'C:\Users\25584\Desktop\lena.bmp', 0)   #512
#生成高斯金字塔
G0 = lena
G1 = cv2.pyrDown(G0)
G2 = cv2.pyrDown(G1)
G3 = cv2.pyrDown(G2)
#生成拉普拉斯金字塔
L0 = G0 - cv2.pyrUp(G1)
L1 = G1 - cv2.pyrUp(G2)
L2 = G2 - cv2.pyrUp(G3)
#恢复原始图像
G0_1 = L0 + cv2.pyrUp(G1)
G1_1 = L1 + cv2.pyrUp(G2)
G2_1 = L2 + cv2.pyrUp(G3)
#确认每层是否真的复原
f0 = G0_1 - G0
f1 = G1_1 - G1
f2 = G2_1 - G2
print(np.sum(abs(f0)))
print(np.sum(abs(f1)))
print(np.sum(abs(f2)))
0
0
0

到了这里,关于【OpenCV】第十一章: 图像金字塔的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV(十六):高斯图像金字塔

    目录 1.高斯图像金字塔原理 2.高斯图像金字塔实现 1.高斯图像金字塔原理 高斯图像金字塔是一种用于多尺度图像表示和处理的重要技术。它通过对图像进行多次高斯模糊和下采样操作来生成不同分辨率的图像层级,每个层级都是原始图像的模糊和降采样版本。 以下是高斯图

    2024年02月09日
    浏览(43)
  • 图像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码

    图像金字塔是对图像进行多分辨率表示的一种有效且简单的结构。 一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像。图像金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率表示。 图像金字塔有什么作用? 图像金字塔常用于图像缩放、图像重

    2024年02月04日
    浏览(62)
  • Python Opencv实践 - 图像金字塔

     

    2024年02月12日
    浏览(45)
  • OpenCV图像金字塔pyrDown下采样

    2024年02月13日
    浏览(42)
  • 【OpenCV实现平滑图像金字塔,轮廓:入门】

    文章内容的概要: 平滑图像金字塔: 轮廓: 使用图像金字塔去创造一个新的水果,“橘果(Orapple)” 函数:cv.pyrUp(), cv.pyrDown() 通常,我们处理图像时使用的是固定分辨率。然而,在某些情况下,我们需要在不同的分辨率下处理同一张图像。例如,在搜索图像中的某些内容(

    2024年02月08日
    浏览(49)
  • OpenCV官方教程中文版 —— 图像金字塔

    • 学习图像金字塔 • 使用图像创建一个新水果:“橘子苹果” • 将要学习的函数有:cv2.pyrUp(),cv2.pyrDown()。 一般情况下,我们要处理是一副具有固定分辨率的图像。但是有些情况下,我们需要对同一图像的不同分辨率的子图像进行处理。比如,我们要在一幅图像中查找某

    2024年02月07日
    浏览(53)
  • Opencv 图像金字塔----高斯和拉普拉斯

    原文:图像金字塔----高斯和拉普拉斯 图像金字塔 是图像中多尺度表达的一种,最初用于机器视觉和图像压缩,最主要用于图像的分割、融合。 高斯金字塔是由底部的最大分辨率图像逐次向下采样得到的一系列图像。最下面的图像分辨率最高,越往上图像分辨率越低。 高斯

    2024年02月09日
    浏览(46)
  • 构建图像金字塔:探索 OpenCV 的尺度变换技术

    在计算机视觉领域,图像金字塔是一种强大的技术,可用于在不同尺度下对图像进行分析和处理。金字塔的概念借鉴了古埃及的金字塔形状,其中每一级都是前一级的缩小版本。本篇博客将深入探讨如何构建图像金字塔,以及如何在实际应用中利用金字塔来解决各种计算机视

    2024年02月08日
    浏览(47)
  • OpenCV基础补充自适应阈值及图像金字塔

    对于OpenCV知识点还有很多,基础的大家可以参考前面几节。 OpenCv基础之绘图及几何变换实例 OpenCV基础操作之图像的形态学运算 OpenCV基础操作之边界填充、图像阈值以及图像平滑处理 OpenCV基础之边缘检测与轮廓描绘 OpenCV基础之模板匹配与直方图 OpenCV图像处理之傅里叶变换

    2024年02月02日
    浏览(45)
  • Python-OpenCV中的图像处理-图像金字塔

    同一图像的不同分辨率的子图集合,如果把最大的图像放在底部,最小的放在顶部,看起来像一座金字塔,故而得名图像金字塔。 cv2.pyrUp():上采样 cv2.pyrDown():下采样 高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。顶部图像中的每个像素值等于下一层图

    2024年02月13日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包