构建拉普拉斯金字塔时如何实现一致的上采样与下采样?
拉普拉斯金字塔上下采样正确实现方案
核心实现原则
拉普拉斯金字塔的残差计算要求每一层低分辨率图上采样后的尺寸,必须和上一层高分辨率图尺寸完全一致,同时要避免下采样的混叠效应、上采样的能量损失,才能实现完美重建。
下采样实现步骤
- 先记录输入图像的原始高、宽,作为后续对应层上采样的目标尺寸,避免通过下采样结果反推尺寸带来的不匹配问题
- 对输入图像做边界填充:如果图像高度为奇数,在底部补1行;如果宽度为奇数,在右侧补1列,优先选择镜像填充、边缘复制填充,避免边缘突变带来的伪影
- 对填充后的图像做高斯模糊:使用3x3或5x5高斯核进行卷积,消除下采样带来的频率混叠
- 取模糊后图像的偶数行、偶数列,得到下采样结果,存入高斯金字塔
上采样实现步骤
- 以上一层记录的原始尺寸为目标,创建相同尺寸的全0矩阵
- 将下采样得到的低分辨率图像的所有像素,依次放入全0矩阵的偶数行、偶数列位置
- 使用和下采样阶段完全相同的高斯核对矩阵做卷积,卷积结果乘以4做能量补偿(插0操作会导致整体能量降低为原来的1/4),得到最终上采样结果
示例伪代码(Python)
import cv2 import numpy as np # 下采样方法 def gaussian_pyr_down(orig_img): orig_h, orig_w = orig_img.shape[:2] target_size = (orig_h, orig_w) # 边界填充为偶数尺寸 pad_bottom = orig_h % 2 pad_right = orig_w % 2 padded_img = cv2.copyMakeBorder(orig_img, 0, pad_bottom, 0, pad_right, cv2.BORDER_REFLECT) # 高斯模糊去混叠 blurred_img = cv2.GaussianBlur(padded_img, ksize=(5,5), sigmaX=1, sigmaY=1) # 下采样取偶数行列 down_img = blurred_img[::2, ::2] return down_img, target_size # 上采样方法 def gaussian_pyr_up(low_res_img, target_size): up_img = np.zeros(target_size, dtype=low_res_img.dtype) # 低分辨率像素放入偶数位置 up_img[::2, ::2] = low_res_img # 高斯卷积+能量补偿 up_img = cv2.GaussianBlur(up_img, ksize=(5,5), sigmaX=1, sigmaY=1) * 4 return up_img
按上述流程实现后,上采样输出尺寸与上一层原始图像完全一致,直接做差即可得到拉普拉斯金字塔层,逐层累加就能完美重建原始图像。如果不需要保留边缘的原始值,也可以选择裁剪重建后图像的填充像素,得到和输入完全一致的原始尺寸图像。
内容的提问来源于stack exchange,提问作者Luis Fernández
相关产品推荐
相关产品推荐

