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

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

相关推荐
xiaohouzi1122331 天前
OpenCV的cv2.VideoCapture如何加GStreamer后端
人工智能·opencv·计算机视觉
小关会打代码1 天前
计算机视觉案例分享之答题卡识别
人工智能·计算机视觉
天天进步20151 天前
用Python打造专业级老照片修复工具:让时光倒流的数字魔法
人工智能·计算机视觉
荼蘼1 天前
答题卡识别改分项目
人工智能·opencv·计算机视觉
IT古董1 天前
【第五章:计算机视觉-项目实战之图像分类实战】1.经典卷积神经网络模型Backbone与图像-(4)经典卷积神经网络ResNet的架构讲解
人工智能·计算机视觉·cnn
张子夜 iiii1 天前
4步OpenCV-----扫秒身份证号
人工智能·python·opencv·计算机视觉
潮汐退涨月冷风霜1 天前
数字图像处理(1)OpenCV C++ & Opencv Python显示图像和视频
c++·python·opencv
paid槮1 天前
机器视觉之图像处理篇
图像处理·opencv·计算机视觉
通街市密人有1 天前
IDF: Iterative Dynamic Filtering Networks for Generalizable Image Denoising
人工智能·深度学习·计算机视觉
sali-tec1 天前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#