图像金字塔技术通过对原始图像按不同分辨率进行多层次表示,不仅能提升计算效率,还能为图像融合、检测与识别提供多尺度特征。高斯金字塔 (Gaussian Pyramid
) 用于构建多级低通图像,拉普拉斯金字塔 (Laplacian Pyramid
) 则提取各层之间的细节信息。本节将深入介绍如何使用 OpenCV
构建高斯与拉普拉斯金字塔,并以经典的图像融合案例,展示图像金字塔在特征缩放与融合中的强大应用。
高斯金字塔通过不断下采样与高斯平滑,将图像分解为一系列分辨率逐渐降低的图像,用于多尺度分析与加速算法。
cv2.GaussianBlur
做一次适度平滑ksize = 2·⌈3*alpha⌉ + 1
,一般 alpha
取 1.0~1.5
cv2.pyrDown
会自动结合 5 × 5
高斯滤波与采样,对比手动 GaussianBlur + resize
更高效且抗混叠import cv2
import numpy as np
# 1. 读取并预平滑
img = cv2.imread('1.jpeg')
alpha = 1.2
ksize = int(2 * np.ceil(3*alpha) + 1)
blur = cv2.GaussianBlur(img, (ksize, ksize), alpha)
# 2. 构建高斯金字塔(5 层)
gp = [blur]
for i in range(1, 5):
gp.append(cv2.pyrDown(gp[i-1]))
# 3. 显示各层
for idx, layer in enumerate(gp):
cv2.imshow(f'Gaussian Level {idx}', layer)
cv2.waitKey(0)
cv2.destroyAllWindows()
关键函数解析:
cv2.pyrDown(src)
:对输入图像做高斯滤波后,下采样至宽高各自减半cv2.GaussianBlur(src, ksize, sigma)
:在下采样前做平滑,减少高频信息引发的混叠效应拉普拉斯金字塔通过相邻两层高斯金字塔的差分,提取出各尺度的细节信息,可用于图像重建与增强。
gp
pyrUp
),使其尺寸与第 i − 1 i-1 i−1 层对齐import cv2
import numpy as np
# 1. 读取并预平滑
img = cv2.imread('1.jpeg')
alpha = 1.2
ksize = int(2 * np.ceil(3*alpha) + 1)
blur = cv2.GaussianBlur(img, (ksize, ksize), alpha)
# 2. 构建高斯金字塔(5 层)
gp = [blur]
for i in range(1, 5):
gp.append(cv2.pyrDown(gp[i-1]))
# 3. 构建拉普拉斯金字塔
lp = []
for i in range(4):
up = cv2.pyrUp(gp[i+1], dstsize=(gp[i].shape[1], gp[i].shape[0]))
lap = cv2.subtract(gp[i], up)
lp.append(lap)
lp.append(gp[-1]) # 顶层
# 4. 重建图像
recon = lp[-1]
for i in range(3, -1, -1):
recon = cv2.pyrUp(recon, dstsize=(lp[i].shape[1], lp[i].shape[0]))
recon = cv2.add(recon, lp[i])
cv2.imshow('Reconstructed', recon)
cv2.waitKey(0)
cv2.destroyAllWindows()
关键函数解析:
cv2.pyrUp(src, dstsize)
:将图像上采样至目标尺寸,并做插值平滑cv2.subtract(src1, src2)
:逐像素相减,提取细节层cv2.add(src1, src2)
:逐像素相加,用于图像重建接下来,利用拉普拉斯金字塔将两幅图像在多尺度上分解,逐层融合细节,再重建,实现平滑且无明显接缝的混合效果。
HDR
效果Homography
) 校正gp1
, gp2
lp1
, lp2
L = M·L1 + (1−M)·L2
import cv2
import numpy as np
# 1. 读取与对齐
img1 = cv2.imread('1.jpeg')
img2 = cv2.imread('2.jpeg')
img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))
# 2. 构建高斯金字塔
def build_gp(img, levels=6):
gp = [img]
for _ in range(levels):
gp.append(cv2.pyrDown(gp[-1]))
return gp
gp1, gp2 = build_gp(img1), build_gp(img2)
# 3. 构建拉普拉斯金字塔
def build_lp(gp):
lp = []
for i in range(len(gp)-1):
up = cv2.pyrUp(gp[i+1], dstsize=(gp[i].shape[1], gp[i].shape[0]))
lp.append(cv2.subtract(gp[i], up))
lp.append(gp[-1])
return lp
lp1, lp2 = build_lp(gp1), build_lp(gp2)
# 4. 生成渐变掩码金字塔
mask = np.zeros_like(img1, dtype=np.float32)
# 中心向左右平滑过渡
cols = img1.shape[1]
mask[:, :cols//2] = 1.0
mask = cv2.GaussianBlur(mask, (51,51), 0)
gp_mask = build_gp((mask*255).astype(np.uint8), levels=6)
# 5. 融合拉普拉斯层
lp_fused = []
for l1, l2, gm in zip(lp1, lp2, gp_mask):
gm_f = gm.astype(np.float32)/255
fused = (l1.astype(np.float32)*gm_f + l2.astype(np.float32)*(1-gm_f))
lp_fused.append(fused.astype(np.uint8))
# 6. 重建融合图
fused = lp_fused[-1]
for i in range(len(lp_fused)-2, -1, -1):
fused = cv2.pyrUp(fused, dstsize=(lp_fused[i].shape[1], lp_fused[i].shape[0]))
fused = cv2.add(fused, lp_fused[i])
# 7. 全局微调
fused = cv2.detailEnhance(fused, sigma_s=10, sigma_r=0.15)
cv2.imshow('Pyramid Blended', fused)
cv2.waitKey(0)
cv2.destroyAllWindows()
关键函数解析:
cv2.GaussianBlur
将硬掩码平滑,实现层级软混合build_gp
/ build_lp
:封装高斯与拉普拉斯金字塔构建流程,便于复用cv2.detailEnhance(src, sigma_s, sigma_r)
:调节融合后细节与对比度,OpenCV
的画龙点睛在本节中,我们介绍了如何在 OpenCV
中构建图像金字塔、提取多尺度特征,并应用于无缝图像融合。掌握这些技术,能够为图像处理、计算机视觉和深度学习任务提供强有力的多尺度支持。
OpenCV计算机视觉实战(1)——计算机视觉简介
OpenCV计算机视觉实战(2)——环境搭建与OpenCV简介
OpenCV计算机视觉实战(3)——计算机图像处理基础
OpenCV计算机视觉实战(4)——计算机视觉核心技术全解析
OpenCV计算机视觉实战(5)——图像基础操作全解析
OpenCV计算机视觉实战(6)——经典计算机视觉算法
OpenCV计算机视觉实战(7)——色彩空间详解
OpenCV计算机视觉实战(8)——图像滤波详解
OpenCV计算机视觉实战(9)——阈值化技术详解
OpenCV计算机视觉实战(10)——形态学操作详解
OpenCV计算机视觉实战(11)——边缘检测详解