Bootstrap

【计算视觉算法与应用】金字塔,下采样Gaussian Pyramid. 上采用 Laplacian Pyramid (code: py)

金字塔(Pyramid)在图像处理中主要用于多尺度分析和图像压缩。常见的图像金字塔有两种:

  1. 高斯金字塔(Gaussian Pyramid):用于下采样图像,生成分辨率逐渐降低的图像序列。
  2. 拉普拉斯金字塔(Laplacian Pyramid):通过高斯金字塔生成,用于图像重建和细节增强。

以下是金字塔在图像处理中的作用以及代码实现和可视化:


1. 高斯金字塔

高斯金字塔通过不断下采样(减小分辨率),产生一系列从高分辨率到低分辨率的图像。

代码实现
import cv2
import matplotlib.pyplot as plt

# 加载图像
image = cv2.imread('image.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换为RGB
levels = 4  # 金字塔层数

# 构建高斯金字塔
gaussian_pyramid = [image]
for i in range(levels):
    image = cv2.pyrDown(image)  # 下采样
    gaussian_pyramid.append(image)

# 可视化
plt.figure(figsize=(12, 8))
for i, img in enumerate(gaussian_pyramid):
    plt.subplot(1, levels + 1, i + 1)
    plt.imshow(img)
    plt.title(f"Level {i}")
    plt.axis('off')
plt.show()

2. 拉普拉斯金字塔

拉普拉斯金字塔由高斯金字塔生成,通过将高斯金字塔中的图像与上采样后的低分辨率图像相减,得到细节信息。

代码实现
import cv2
import matplotlib.pyplot as plt

# 加载图像
image = cv2.imread('image.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转换为RGB
levels = 4  # 金字塔层数

# 构建高斯金字塔
gaussian_pyramid = [image]
for i in range(levels):
    image = cv2.pyrDown(image)  # 下采样
    gaussian_pyramid.append(image)

# 构建拉普拉斯金字塔
laplacian_pyramid = []
for i in range(levels, 0, -1):
    gaussian_expanded = cv2.pyrUp(gaussian_pyramid[i])  # 上采样
    # 确保尺寸一致,避免大小差异引发的错误
    gaussian_expanded = cv2.resize(gaussian_expanded, (gaussian_pyramid[i - 1].shape[1], gaussian_pyramid[i - 1].shape[0]))
    laplacian = cv2.subtract(gaussian_pyramid[i - 1], gaussian_expanded)  # 相减得到细节
    laplacian_pyramid.append(laplacian)

# 可视化高斯金字塔
plt.figure(figsize=(12, 8))
for i, img in enumerate(gaussian_pyramid):
    plt.subplot(2, levels + 1, i + 1)
    plt.imshow(img)
    plt.title(f"Gaussian Level {i}")
    plt.axis('off')

# 可视化拉普拉斯金字塔
for i, img in enumerate(laplacian_pyramid):
    plt.subplot(2, levels + 1, levels + 2 + i)
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    plt.title(f"Laplacian Level {i}")
    plt.axis('off')

plt.tight_layout()
plt.show()

金字塔在图像处理中的作用

  1. 多尺度特征提取:在不同分辨率下提取图像的局部特征。
  2. 图像压缩:金字塔结构可以用较少的数据表示图像的主要信息。
  3. 图像融合:通过拉普拉斯金字塔对图像进行融合,保留不同图像的细节信息。
  4. 对象检测:在金字塔的不同尺度上搜索目标,检测大小变化的对象。
  5. 图像重建:利用拉普拉斯金字塔将低分辨率的图像逐步还原为高分辨率。

3. 图像融合示例

基于拉普拉斯金字塔的图像融合,适用于不同曝光的图像组合。

代码实现
import cv2
import matplotlib.pyplot as plt

# 加载两张图像(大小相同)
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')

# 构建金字塔
gp_image1 = [image1]
gp_image2 = [image2]

for i in range(levels):
    gp_image1.append(cv2.pyrDown(gp_image1[-1]))
    gp_image2.append(cv2.pyrDown(gp_image2[-1]))

lp_image1 = [gp_image1[-1]]
lp_image2 = [gp_image2[-1]]

for i in range(levels - 1, 0, -1):
    lap1 = cv2.subtract(gp_image1[i - 1], cv2.pyrUp(gp_image1[i]))
    lap2 = cv2.subtract(gp_image2[i - 1], cv2.pyrUp(gp_image2[i]))
    lp_image1.append(lap1)
    lp_image2.append(lap2)

# 合并金字塔
pyramid_combined = []
for lap1, lap2 in zip(lp_image1, lp_image2):
    rows, cols, _ = lap1.shape
    lap_combined = np.hstack((lap1[:, :cols // 2], lap2[:, cols // 2:]))
    pyramid_combined.append(lap_combined)

# 重建图像
reconstructed_image = pyramid_combined[0]
for i in range(1, len(pyramid_combined)):
    reconstructed_image = cv2.pyrUp(reconstructed_image)
    reconstructed_image = cv2.add(reconstructed_image, pyramid_combined[i])

# 显示融合结果
plt.imshow(cv2.cvtColor(reconstructed_image, cv2.COLOR_BGR2RGB))
plt.title("Fused Image")
plt.axis('off')
plt.show()

通过上述代码和可视化,我们可以清晰地看到金字塔的应用和效果,同时能够理解其在多尺度分析和图像处理中的重要作用。

;