【计算视觉算法与应用】金字塔,下采样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()

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

相关推荐
YRr YRr2 小时前
理解 Python PIL库中的 convert(‘RGB‘) 方法:为何及如何将图像转换为RGB模式
人工智能·python·计算机视觉
只怕自己不够好7 小时前
《高斯金字塔与拉普拉斯金字塔原理、操作及实用经验分享》
计算机视觉
cainiaomyf12 小时前
【论文阅读】Multi-level Semantic Feature Augmentation for One-shot Learning
论文阅读·人工智能·深度学习·机器学习·计算机视觉
百度Geek说13 小时前
基于PP-ShiTuv2新增PaddleX图像识别模型产线,显著提升商品识别等细粒度开放域产业场景检索性能
人工智能·计算机视觉·目标跟踪
只怕自己不够好14 小时前
霍夫变换:原理剖析与 OpenCV 应用实例
计算机视觉
hongel11014 小时前
debian12 利用mingW-w64为Windows编译opencv
人工智能·opencv·计算机视觉
花生糖@15 小时前
使用 OpenCV 进行视频中的行人检测
人工智能·opencv·音视频·人行检测
Industio_触觉智能15 小时前
Android11修改摄像头前后置方法,触觉智能RK3568开发板演示
android·图像处理·开发板·rk3568·嵌入式开发·安卓开发·前置后置摄像头
不会代码的小林16 小时前
深度学校目标分割
计算机视觉