尺度空间和图像金字塔
- 尺度并非指图像的大小,而是指图像的模糊程度,从近距离到远距离图像越来越模糊的过程,也是图像的尺度越来越大的过程。
- 尺度空间是图像在不同尺度下的连续表示。其中最常见的是使用高斯核对图像进行卷积。随着高斯滤波核尺度的增加,图像变得越来越模糊,直到只剩下最基本的特征。
- 图像金字塔是尺度空间的一种具体实现方式。它是由一系列不同分辨率的图像组成,这些图像以金字塔的形状排列。
常见的金字塔有以下几种:
- 高斯金字塔(Gaussian Pyramid):高斯金字塔是通过对图像进行高斯滤波和下采样来构建的。高斯滤波可以平滑图像,下采样可以降低图像的分辨率。高斯金字塔具有尺度不变性,可以用于尺度不变的图像处理任务。
- DoG 金字塔(Difference of Gaussians Pyramid):DoG 金字塔是通过对高斯金字塔同一层中的不同图像进行差分来构建的。DoG 金字塔可以捕捉图像的局部特征,可以用于目标检测和边缘检测等任务。
- 拉普拉斯金字塔(Laplacian Pyramid):拉普拉斯金字塔是通过对高斯金字塔不同分辨率图像进行差分来构建的。拉普拉斯金字塔可以捕捉图像的边缘和细节信息,可以用于图像融合和特征提取等任务。
图像金字塔通常通过对图像进行下采样或上采样来构建。
下采样可以降低图像的分辨率,上采样可以提高图像的分辨率。
下采样缩小原图,使得图像符合对应的显示区域。把一个位于原始图像上的s*s的窗口变成一个像素,若原图为x*y,则下采样之后的原图的尺寸为(x/s)(y/s)。实现方法有池化(pooling),卷积步长调整等。
上采样放大图像,可以在更高分辨率的显示设备上显示,但是会对图像的质量进行影响,实现方法有插值,反卷积,反池化。
高斯金字塔
高斯金字塔通过对图像进行高斯滤波和下采样获得一系列下采样图像。高斯金字塔的下采样是对高斯滤波后的图像进行,以降低图像的分辨率。
下采样可以通过以下几种方式实现:
- 平均池化:对图像的每个局部区域进行平均操作,从而得到一个像素值。
- 最大池化:对图像的每个局部区域进行最大值操作,从而得到一个像素值。
- 双线性插值:通过对相邻像素进行插值来得到新的像素值。
高斯金字塔的构建过程:
- 将原图作为高斯金字塔的第 0 层图像
- 对高斯金字塔的第 i 层(i = 0,1,2...)图像进行高斯滤波,可以用不同的平滑系数(σ):
- 对高斯滤波后的图像进行下采样,生成高斯金字塔的第 i+1 层图像
- 高斯金字塔的第 i 层图像的尺寸为:
其中,width_0 和 height_0 是原始图像的宽度和高度。
重复前面两步,直到达到预定的金字塔层数。
DoG 金字塔
DoG 金字塔(Difference of Gaussians Pyramid)是指通过对高斯金字塔同一层中的不同图像进行差分来构建的图像金字塔。
DoG 金字塔的构建过程:
- 对原始图像进行高斯滤波,得到不同尺度的高斯金字塔
- 对相邻尺度的高斯金字塔进行差分,得到 DoG 金字塔 DoG 金字塔的第i层第 j 张可以表示为: DoG(i, j) = G(i, j) - G(i, j-1)
- 确定极值点,对 DoG 金字塔进行极值点检测,找到图像的局部特征点。
拉普拉斯金字塔
拉普拉斯金字塔它可以捕捉图像的边缘和细节信息,它也是基于高斯金字塔构建的。
拉普拉斯金字塔的构建过程:
- 构建高斯金字塔。
- 对高斯金字塔进行差分,得到拉普拉斯金字塔。拉普拉斯金字塔的第 i 层可以表示为:Laplacian(i) = G(i) - Expand(G(i+1))
- 其中,G(i) 是高斯金字塔的第 i 层,Expand(i) 是图像的上采样操作。拉普拉斯金字塔捕捉了高斯金字塔连续层之间的细节差异,强调了原始图像中存在的边缘和高频分量。
比较
金字塔类型 | 特性 | 构建方式 | 应用 |
高斯金字塔 | 提供图像的多尺度表示 | 高斯模糊和下采样 | 尺度不变形,图像压缩 |
DoG金字塔 | 比较高斯金字塔的相邻级别,强调牧户差异并且捕获角点和斑点等局部特征 | 高斯金字塔中的相邻层的差异 | 目标检测,边缘检测 |
拉普拉斯金字塔 | 关注不同尺度下图像中存在的所用边缘和细节 | 通过获取高斯金字塔中相邻级别之间的差异来计算拉普拉斯金字塔,涉及对上一层的金字塔图像进行上采样 | 图像融合,增强,纹理分析 |
代码部分
高斯金字塔
import cv2
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
def build_gaussian_pyramid(image, levels):
pyramid = [image] #列表
temp = image
for i in range(1,levels):
# 高斯滤波
blurred = cv2.GaussianBlur(temp,(5,5),0 )
# 下采样
width,height=temp.shape[:2]
down_sampled = cv2.resize(blurred, (width//2,height//2), interpolation=cv2.INTER_AREA)
pyramid.append(down_sampled) #加入到列表
temp = down_sampled #作为下一次下采样的对象
return pyramid
image = cv2.imread('g:\lena.jpg')
pyramid = build_gaussian_pyramid(image,3)
#窗口显示
for i, layer in enumerate(pyramid):
window_name = f'Gaussian Pyramid Level {i}'
cv2.imshow(window_name, layer)
cv2.waitKey(0)
拉普拉斯金字塔
import cv2
from pylab import *
def build_gaussian_pyramid(image, levels):
pyramid = [image] # 列表
temp = image
for i in range(1, levels):
# 高斯滤波
blurred = cv2.GaussianBlur(temp, (5, 5), 0)
# 下采样
width, height = temp.shape[:2]
down_sampled = cv2.resize(blurred, (width // 2, height // 2), interpolation=cv2.INTER_AREA)
pyramid.append(down_sampled) # 加入到列表
temp = down_sampled # 作为下一次下采样的对象
return pyramid
def build_laplacian_pyramid(image, levels):
# 构建高斯金字塔
gaussian_pyramid = build_gaussian_pyramid(image, levels)
# 构建拉普拉斯金字塔列表
laplacian_pyramid = []
for i in range(len(gaussian_pyramid)-1):
# 上采样
up_sampled = cv2.resize(gaussian_pyramid[i+1], (gaussian_pyramid[i].shape[1],gaussian_pyramid[i].shape[0]), interpolation=cv2.INTER_LINEAR)
# 相减
laplacian_layer = cv2.subtract(gaussian_pyramid[i], up_sampled)
laplacian_pyramid.append(laplacian_layer)
return laplacian_pyramid
image = cv2.imread('g:\lena.jpg')
pyramid = build_laplacian_pyramid(image,4)
#窗口显示
for i, layer in enumerate(pyramid):
window_name = f'Gaussian Pyramid Level {i}'
cv2.imshow(window_name, layer)
cv2.waitKey(0)