图像金字塔-Opencv实现

1.简介

图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像素采样的方式,生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底部,以金字塔形状排列,往上是一系列像素(尺寸)逐渐降低的图像,一直到金字塔的顶部只包含一个像素点的图像,这就构成了传统意义上的图像金字塔。获得图像金字塔一般包括二个步骤:1. 利用低通滤波器平滑图像 ;2. 对平滑图像进行抽样(采样)。有两种采样方式——上采样(分辨率逐级升高)和下采样(分辨率逐级降低)。
**用途:**图像压缩、图像融合。

2.高斯金字塔

在高斯金字塔中,同一尺寸的图像通过不同的高斯核进行不同程度的高斯平滑,这些影像构成一个八度(Octave), 而只对影像进行高斯平滑只会改变图像的清晰度,并不会改变图像的大小。因此只有高斯平滑并不能称作高斯金字塔。 还需要有一个下采样的过程,也就是使图片变小的过程。这样才能构成不同大小的图像,形成金字塔。 同一幅图片 不同高斯平滑得到的一组大小相同、清晰度不同的图像(Interval)组成一个八度(Octave),多个八度的集合组成高斯金字塔。
在这里插入图片描述
在这里插入图片描述
解释: 在同一组内,不同层图像的尺寸是一样的,后一层图像的高斯平滑因子σ是前一层图像平滑因子的k倍;在不同组内,后一组第一个图像是前一组倒数第三个图像的二分之一采样,图像大小是前一组的一半。
高斯金字塔从效果上看是对图片进行了缩小+模糊,这样做的目的又是什么呢?
高斯金字塔在模仿图像的不同尺度。 这个概念很容易理解,所谓尺度是指图像的不同大小。例如,同一幅画,我们站在1m之外和3m之外看到的内容是不同的。 这就是高斯金字塔模仿的过程。我们之前在图像处理的时候,只是关注图像的二维信息,并没有考虑过图像的尺度或者说 纵深。而高斯金字塔就是为了给图像增加第三维——纵深。这样做的好处是可以提取图像不同尺度的信息。可以理解为高斯金字塔越高层,其表达的信息即越概括和抽象。底层有最丰富的信息。

2.1尺度空间

图像的尺度空间解决的问题是如何对图像在所有尺度下描述的问题。在高斯金字塔中一共生成O组L层不同尺度的图像,这两个量合起来(O,L)就构成了高斯金字塔的尺度空间,也就是说以高斯金字塔的组O作为二维坐标系的一个坐标,不同层L作为另一个坐标,则给定的一组坐标(O,L)就可以唯一确定高斯金字塔中的一幅图像。
  尺度空间的形象表述:图中尺度空间中k前的系数n表示的是第一组图像尺寸是当前组图像尺寸的n倍
在这里插入图片描述

2.2 Opencv实现

"高斯金字塔实现"
import numpy as np
import cv2
gauss0 = cv2.imread("E:/ruanjianDM/jupyternoerbookDM/Opencv3/data/ii.jpg")
gauss1 = cv2.pyrDown(gauss0)
gauss2 = cv2.pyrDown(gauss1)
gauss3 = cv2.pyrDown(gauss2)
cv2.imshow("0", gauss0)
cv2.imshow("1", gauss1)
cv2.imshow("2", gauss2)
cv2.imshow("3", gauss3)
cv2.waitKey(0)

在这里插入图片描述

差分金字塔

差分金字塔,DOG(Difference of Gaussian)金字塔是在高斯金字塔的基础上构建起来的,其实生成高斯金字塔的目的就是为了构建DOG金字塔。DOG金字塔的第1组第1层是由高斯金字塔的第1组第2层减第1组第1层得到的。以此类推,逐组逐层生成每一个差分图像,所有差分图像构成差分金字塔。概括为DOG金字塔的第o组第l层图像是有高斯金字塔的第o组第l+1层减第o组第l层得到的。每一组在层数上,DOG金字塔比高斯金字塔少一层。后续Sift特征点的提取都是在DOG金字塔上进行的。
DOG金字塔的构建可以用下图描述:
在这里插入图片描述

拉普拉斯金字塔

在这里插入图片描述

Opencv实现

"拉普拉斯金字塔实现"
import numpy as np
import cv2
from matplotlib import pyplot as plt
"拉普拉斯金字塔在OpenCV中并没有直接的函数用于实现,但是由前面的计算公式,可以由高斯金字塔计算得来。"
def getLplacianSub(gauss, g):
    gauss_width = gauss.shape[0]
    gauss_height = gauss.shape[1]
    g_width = g.shape[0]
    g_height = g.shape[1]
    d_width = g_width - gauss_width
    d_height = g_height - gauss_height
    if d_width != 0 or d_height != 0:
        temp = cv2.copyMakeBorder(gauss, d_width, 0, d_height, 0, cv2.BORDER_REPLICATE)
    else:
        temp = gauss
    layer = cv2.subtract(temp, g)
    return layer

gauss0 = cv2.imread("E:/ruanjianDM/jupyternoerbookDM/Opencv3/data/ii.jpg")
# 首先生成高斯金字塔
gauss1 = cv2.pyrDown(gauss0)
gauss2 = cv2.pyrDown(gauss1)
gauss3 = cv2.pyrDown(gauss2)

# 然后利用上采样得到上一层图像
g2 = cv2.pyrUp(gauss3)
g1 = cv2.pyrUp(gauss2)
g0 = cv2.pyrUp(gauss1)

"""
图像的数据类型是uint8,没有负数。所以直接相减会导致出现负数,而一旦出现 负数就会“回滚”,也就是-1变成了最高的255。
这也就是为什么图像中本应该是黑色的地方有这么多白色的原因。
"""
l0 = getLplacianSub(gauss0, g0)
l1 = getLplacianSub(gauss1, g1)
l2 = getLplacianSub(gauss2, g2)

# 显示拉普拉斯金字塔
cv2.imshow("0", l0)
cv2.imshow("1", l1)
cv2.imshow("2", l2)

# 显示高斯金字塔
cv2.imshow("g0", gauss0)
cv2.imshow("g1", gauss1)
cv2.imshow("g2", gauss2)
cv2.waitKey(0)

下图左边是高斯金字塔,右边是拉普拉斯金字塔
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值