OpenCV进阶操作:图像金字塔
文章目录
- 前言
- 一、图像金字塔
- 1、什么是图像金字塔
- 2、金字塔类型
- 1) 高斯金字塔 (Gaussian Pyramid)
- 2)拉普拉斯金字塔 (Laplacian Pyramid)
- 3、图像金字塔的作用
- 二、图像金字塔中的操作
- 1、向下采样
- 步骤
- 2、向上采样
- 步骤
- 3、拉普拉斯金字塔
- 4、结论
- 三、代码实现
- 1、高斯金字塔向下采样
- 2、高斯金字塔向上采样
- 3、向下采样再向上采样
- 4、拉普拉斯金字塔
- 总结
前言
在计算机视觉领域,图像金字塔是一种重要的多尺度表示方法。通过构建图像金字塔,我们可以高效地处理不同分辨率下的图像特征。OpenCV作为最流行的计算机视觉库,提供了便捷的图像金字塔实现方法。本文将深入解析图像金字塔的原理,并通过Python代码演示其实际应用
一、图像金字塔
1、什么是图像金字塔
图像金字塔是通过对原始图像进行多尺度**下采样(缩小)和上采样(放大)**得到的图像集合。其名称来源于金字塔状的分层结构,每一层都是对前一层分辨率按比例缩放的结果。这种结构可以帮助我们在不同尺度下分析图像特征,常用于目标检测、图像融合等任务。
2、金字塔类型
1) 高斯金字塔 (Gaussian Pyramid)
- 原理:通过不断进行高斯模糊和下采样生成
向下采样(缩小):
应用高斯滤波器(5×5卷积核)
删除偶数行和列(分辨率减半)
向上采样(放大):
将图像尺寸扩大两倍(新增像素初始化为0)
应用高斯滤波器进行近似插值
2)拉普拉斯金字塔 (Laplacian Pyramid)
-
原理:通过高斯金字塔不同层级的差值构建,用于图像重建
-
公式:L_i = G_i - PyrUp(G_{i+1})
-
存储的是不同尺度下的细节信息
3、图像金字塔的作用
- 特征点提取
图像金字塔允许在不同尺度下检测特征点,提高特征点检测的尺度不变性。
- 模板匹配
图像金字塔帮助处理不同尺度的模板匹配问题,提高匹配的准确性。
- 光流跟踪
通过在不同尺度层中估计光流,图像金字塔帮助处理大范围的运动,提高光流估计的精度。
二、图像金字塔中的操作
1、向下采样
向金字塔顶部移动时,图像的尺寸和分辨率都不断地降低。通常情况下,每向上移动一级,图像的宽和高都降低为原来的1/2。
步骤
- 高斯滤波(减少高频噪声)
- 删除其偶数行和偶数列(所以所用图像一般高宽都是偶数)
- OpenCV函数cv2.pyrDown()
2、向上采样
通常将图像的宽度和高度都变为原来的2倍。这意味着,向上采样的结果图像的大小是原始图像的4倍。因此,要在结果图像中补充大量的像素点。对新生成的像素点进行赋值的行为,称为插值。
步骤
- 插值
- 高斯滤波(减少由于插值产生的人工边界和不自然的过渡)
- OpenCV函数cv2.pyrUp()
3、拉普拉斯金字塔
为了在向上采样是能够恢复具有较高分辨率的原始图像,就要获取在采样过程中所丢失的信息,这些丢失的信息就构
成了拉普拉斯金字塔。也是拉普拉斯金字塔是有向下采样时丢失的信息构成。
4、结论
通过以上分析可知,向上采样和向下采样是相反的两种操作。但是,由于向下采样会丢失像素值,所以这两种操作并不
是可逆的。也就是说,对一幅图像先向上采样、再向下采样,是无法恢复其原始状态的;同样,对一幅图像先向下采样、
再向上采样也无法恢复到原始状态。
三、代码实现
-
关键API说明
-
cv2.pyrDown(src):向下采样
-
cv2.pyrUp(src):向上采样
-
注意:pyrUp不是pyrDown的完美逆运算,会丢失部分信息。
1、高斯金字塔向下采样
使用cv2.pyrDown()函数实现向下采样
import cv2
import numpy as np
from matplotlib import pyplot as plt
def cv_show(name,image):cv2.imshow(name,image)cv2.waitKey(0)
'''------------高斯金字塔操作中的向下采样-------------'''face = cv2.imread('pyy.jpg',cv2.IMREAD_GRAYSCALE)#G0
cv_show('face',face)
face_down_1 = cv2.pyrDown(face)#下采样G1
cv_show('down_1',face_down_1)
face_down_2 = cv2.pyrDown(face_down_1)
cv_show('down_2',face_down_2)
可以看出逐层递减的效果非常明显
2、高斯金字塔向上采样
```python
import cv2 # opencv读取的格式是BGR2# 高斯金字塔操作中的向上采样
# dst = cv2.pyrUp(src [,dst, dstsize [, borderType] ])
# dst:目标图像
# #src:原始图像
# dstsize:目标图像的大小
face = cv2.imread('face.jpg') # G0
face = cv2.resize(face, (400, 400))
cv2.imshow('face', face)
cv2.waitKey(0)
face_up_1 = cv2.pyrUp(face)
cv2.imshow('face_up_1', face_up_1) # G1
cv2.waitKey(0)
face_up_2 = cv2.pyrUp(face_up_1)
cv2.imshow('face_up_2', face_up_2) # G2
cv2.waitKey(0)
cv2.destroyAllWindows()
向上采样之后的图像宽高逐层变成2倍
3、向下采样再向上采样
- 对下采样后图像进行上采样,图像变模糊,无法复原
- 对上采样后图像进行下采样,图像变模糊,无法复原
face_down_1_up = cv2.pyrUp(face_down_1) # 下采样G1
face_up_1_down = cv2.pyrDown(face_up_1) # 上采样G1
cv2.imshow('yuantu', face)
cv2.imshow('down_1_up', face_down_1_up)
cv2.imshow('up_1_down', face_up_1_down)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 处理后的图像与原图相比变得模糊
4、拉普拉斯金字塔
L0 = face - face_down_1_up
L1 = face_down_1 - face_down_2_upfuyuan = face_down_1_up + L0
cv_show('L0',L0)
cv_show('l1',L1)
cv_show('fuyuan',fuyuan)
- 可以看到拉普拉斯金字塔的复原效果还是不错的
- 我这里使用的是彩色图片,所以拉普拉斯图像是彩色的
- 如果使用的图片是灰度图,那么就是黑白的
总结
图像金字塔为多尺度图像处理提供了高效解决方案。通过OpenCV的简单API,我们可以轻松实现:
-
创建不同分辨率的图像层级
-
提取多尺度特征
-
实现自然的图像融合效果
实际开发中,金字塔技术常与特征检测算法(如SIFT、ORB)结合使用。读者可以尝试调整金字塔层数,或结合边缘检测算法探索更多应用场景