前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CV学习笔记(十二):图像金字塔

CV学习笔记(十二):图像金字塔

原创
作者头像
云时之间
修改2020-03-10 09:49:01
7810
修改2020-03-10 09:49:01
举报
文章被收录于专栏:云时之间云时之间

在这一篇文章中我们将会学习在计算机视觉和图像压缩中经常使用的图像金字塔概念

一:什么是图像金字塔?

在说明什么是图像金字塔的过程之前,我们需要需要了解一个概念:尺度

尺度,顾名思义就是说图像的尺寸和分辨率。在我们进行图像处理的时候,会经常对源图像的尺寸进行放大或者缩小的变换,进而转换为我们指定尺寸的目标图像。在对图像进行放大和缩小的变换的这个过程,我们称为尺度调整。

而图像金字塔则是图像多尺度调整表达的一种重要的方式,图像金字塔方法的原理是:将参加融合的的每幅图像分解为多尺度的金字塔图像序列,将低分辨率的图像在上层,高分辨率的图像在下层,上层图像的大小为前一层图像大小的1/4。层数为0,1,2……N。将所有图像的金字塔在相应层上以一定的规则融合,就可得到合成金字塔,再将该合成金字塔按照金字塔生成的逆过程进行重构,得到融合金字塔。这个总的思路就是一下所有基于金字塔融合的算法过程,不同点就在于分解构造的金字塔不同,每层的融合规则不一样,重构的方法不同而已。

有两种类型的金字塔经常出现在文献和应用当中:

高斯金字塔(Gaussian pyramid): 用来向下采样(主要)

拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样图像,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。

接下来我们介绍一下这两种图像金字塔:

一:高斯金字塔

 高斯金字塔是最基本的图像塔。首先将原图像作为最底层图像G0(高斯金字塔的第0层),利用高斯核(5*5)对其进行卷积,然后对卷积后的图像进行下采样(去除偶数行和列)得到上一层图像G1,将此图像作为输入,重复卷积和下采样操作得到更上一层图像,反复迭代多次,形成一个金字塔形的图像数据结构,即高斯金字塔。

Opencv中使用pyrdown函数就可以获得高斯金字塔。

二:拉普拉斯金字塔

在高斯金字塔的运算过程中,图像经过卷积和下采样操作会丢失部分高频细节信息。为描述这些高频信息,人们定义了拉普拉斯金字塔(Laplacian Pyramid, LP)。用高斯金字塔的每一层图像减去其上一层图像上采样并高斯卷积之后的预测图像,得到一系列的差值图像即为 LP 分解图像。

在使用拉普拉斯金字塔操作中,实际上也就实现了上采样的过程

①:首先,将图像在每个方向扩大为原来的两倍,新增的行和列以0填充(0)

②:使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素” 的近似值。

二:图像金字塔的实现

代码如下:

代码语言:javascript
复制
import cv2 as cv
#高斯金字塔
def pyramid_demo(image):
    level = 3      #设置金字塔的层数为3
    temp = image.copy()  #拷贝图像
    pyramid_images = []  #建立一个空列表
    for i in range(level):
        dst = cv.pyrDown(temp)   #先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)
        pyramid_images.append(dst)  #在列表末尾添加新的对象
        cv.imshow("pyramid"+str(i), dst)
        temp = dst.copy()
    return pyramid_images
#拉普拉斯金字塔
def lapalian_demo(image):
    pyramid_images = pyramid_demo(image)    #做拉普拉斯金字塔必须用到高斯金字塔的结果
    level = len(pyramid_images)
    for i in range(level-1, -1, -1):
        if (i-1) < 0:
            expand = cv.pyrUp(pyramid_images[i], dstsize = image.shape[:2])
            lpls = cv.subtract(image, expand)
            cv.imshow("lapalian_down_"+str(i), lpls)
        else:
            expand = cv.pyrUp(pyramid_images[i], dstsize = pyramid_images[i-1].shape[:2])
            lpls = cv.subtract(pyramid_images[i-1], expand)
            cv.imshow("lapalian_down_"+str(i), lpls)
src = cv.imread('3.png')
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) #设置为WINDOW_NORMAL可以任意缩放
cv.imshow('input_image', src)
lapalian_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

opencv的pyrDown函数先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)。

其函数原型为:

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

src参数表示输入图像。 dst参数表示输出图像,它与src类型、大小相同。 dstsize参数表示降采样之后的目标图像的大小。它是有默认值的,如果我们调用函数的时候不指定第三个参数,那么这个值是按照 Size((src.cols+1)/2, (src.rows+1)/2) 计算的。而且不管你自己如何指定这个参数,一定必须保证满足以下关系式:|dstsize.width * 2 - src.cols| ≤ 2; |dstsize.height * 2 - src.rows| ≤ 2。也就是说降采样的意思其实是把图像的尺寸缩减一半,行和列同时缩减一半。 borderType参数表示表示图像边界的处理方式。

opencv的pyrUp函数先对图像进行升采样(将图像尺寸行和列方向增大一倍),然后再进行高斯平滑。

其函数原型为:

pyrUp(src[, dst[, dstsize[, borderType]]]) src参数表示输入图像。 dst参数表示输出图像,它与src类型、大小相同。 dstsize参数表示降采样之后的目标图像的大小。在默认的情况下,这个尺寸大小是按照 Size(src.cols*2, (src.rows*2) 来计算的。如果你自己要指定大小,那么一定要满足下面的条件: |dstsize.width - src.cols * 2| ≤ (dstsize.width mod 2); //如果width是偶数,那么必须dstsize.width是src.cols的2倍 |dstsize.height - src.rows * 2| ≤ (dstsize.height mod 2); borderType参数表示表示图像边界的处理方式。

三:实现的结果

注:拉普拉斯金字塔时,图像大小必须是2的n次方*2的n次方或图像长和宽相等,不然会报错!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

四:引用材料

一:OpenCV文档

图像金字塔 - OpenCV 2.3.2 documentation​www.opencv.org.cn

图标
图标

二:图像金字塔(高斯金字塔、拉普拉斯金字塔)

图像金字塔(高斯金字塔、拉普拉斯金字塔) - stardsd - 博客园​www.cnblogs.com

图标
图标

三:OpenCV笔记:pyrDown()函数和pryUp()函数的使用

CSDN-专业IT技术社区-登录​blog.csdn.net

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:什么是图像金字塔?
  • 二:图像金字塔的实现
  • 三:实现的结果
  • 四:引用材料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档