图像金字塔

图像金字塔(MATLAB 版本)

目录

  • [图像金字塔(MATLAB 版本)](#图像金字塔(MATLAB 版本))
    • [一、 生成图像金字塔](#一、 生成图像金字塔)
    • [二、 Matlab实践操作](#二、 Matlab实践操作)
    • 三、实践问题

一、 生成图像金字塔

在 MATLAB 中,可以使用 impyramid 函数来生成图像金字塔。

代码示例:

matlab

c 复制代码
% 读取图像
image = imread('test.jpg');
% 生成低分辨率图像(向下金字塔)
down = impyramid(image, 'reduce');
% 生成高分辨率图像(向上金字塔)
up = impyramid(down, 'expand');
% 显示图像
figure;
imshow(image);
title('Original Image');
figure;
imshow(down);
title('Down-sampled');
figure;
imshow(up);
title('Up-sampled');

说明:

• impyramid(image, 'reduce'):将图像向下采样(分辨率降低一半)。

• impyramid(down, 'expand'):将图像向上采样(分辨率恢复为原来的两倍)。

二、 Matlab实践操作

在实践操作中通过上面的代码,将一张图的原图、向下金字塔图、向上金字塔图分别处理后展示出来,此时发现向下金字塔之后图像分辨率确实变小了,向上金字塔后图像并没有视觉上变得更清晰,只是将分辨率又恢复到了原图的大小,但是此时丢失了一些图像质量细节。

三、实践问题

Q:为什么在实际的代码操作中向上金字塔后的图像细节丢失没有原图清晰?

图像金字塔:向上金字塔与分辨率提升

  1. 向上金字塔与分辨率提升

    向上金字塔(Up Pyramid) 是指通过上采样(Upsampling)将图像的分辨率从低分辨率恢复到高分辨率。在 OpenCV 中,cv::pyrUp 函数默认会将图像的尺寸放大一倍(即宽度和高度各增加一倍,分辨率提升四倍)。然而,向上金字塔的图像通常不会比原始图像更清晰,因为上采样过程无法恢复丢失的高频细节。

  2. 为什么向上金字塔的图像不清晰

    在图像金字塔中,向上金字塔的过程通常包括以下步骤:

    1. 上采样(Upsampling) :将低分辨率图像放大到高分辨率。这通常是通过插值(如双线性插值或双三次插值)来实现的。
    2. 细节恢复(Detail Recovery) :通过结合高斯金字塔的信息,恢复部分高频细节。
      然而,向上金字塔的图像通常不如原始图像清晰,原因如下:
      • 信息丢失 :在向下金字塔(Down Pyramid)过程中,图像经过模糊和下采样,高频细节已经被丢失。即使通过上采样恢复到高分辨率,丢失的细节也无法完全恢复。
      • 插值的局限性 :上采样过程依赖于插值算法(如双线性插值),这些算法无法生成新的细节,只能通过已有的像素值进行估计。
      • 噪声放大 :如果图像中存在噪声,上采样过程可能会放大噪声,导致图像更加模糊。
  3. 拉普拉斯金字塔(Laplacian Pyramid)

    为了更准确地恢复图像细节,可以使用 拉普拉斯金字塔 。拉普拉斯金字塔结合了高斯金字塔的信息和细节图像(Detail Image),从而能够更清晰地恢复图像细节。

    3.1 拉普拉斯金字塔的原理

    1. 高斯金字塔(Gaussian Pyramid) :通过模糊和下采样生成低分辨率图像。
    2. 细节图像(Detail Image) :通过原始图像和上采样的高斯金字塔图像之间的差异,提取高频细节。
    3. 拉普拉斯金字塔(Laplacian Pyramid) :通过结合高斯金字塔和细节图像,逐步恢复图像的高频细节。
      3.2 MATLAB 实现
      以下是使用拉普拉斯金字塔恢复图像细节的 MATLAB 示例代码:
      matlab
c 复制代码
% 读取图像
original = imread('test.jpg');
original = rgb2gray(original); % 转换为灰度图像
% 生成高斯金字塔
gaussian = original;
gaussian_pyr = cell(1, 3); % 存储金字塔的每一层
gaussian_pyr{1} = gaussian;
for i = 2:3
gaussian = impyramid(gaussian, 'reduce');
gaussian_pyr{i} = gaussian;
end
% 生成拉普拉斯金字塔
laplacian_pyr = cell(size(gaussian_pyr));
laplacian_pyr{end} = gaussian_pyr{end}; % 最低分辨率层直接存储
for i = length(gaussian_pyr)-1:-1:1
up = impyramid(gaussian_pyr{i+1}, 'expand');
laplacian = gaussian_pyr{i} - up;
laplacian_pyr{i} = laplacian;
end
% 恢复图像
reconstructed = laplacian_pyr{1};
for i = 2:length(laplacian_pyr)
up = impyramid(reconstructed, 'expand');
reconstructed = up + laplacian_pyr{i};
end
% 显示结果
figure;
imshow(original);
title('Original Image');
figure;
imshow(reconstructed, []);
title('Reconstructed Image');

说明:

• impyramid:生成高斯金字塔。

• laplacian_pyr:存储拉普拉斯金字塔的每一层。

• reconstructed:通过拉普拉斯金字塔逐步恢复图像细节。

相关推荐
火山引擎开发者社区2 小时前
火山 DTS 正式支持 MySQL 同步到 Milvus , 解决业务库到向量库最后一公里
人工智能
火山引擎开发者社区3 小时前
@开发者,提前解锁 FORCE 原动力大会五大看点,限时赢取门票福利
人工智能
火山引擎开发者社区4 小时前
这个 Skill 让 Agent 从会理解到会执行,补齐移动 APP 执行最后一公里
人工智能
JieE2125 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
火山引擎开发者社区7 小时前
Agent Plan、Coding Plan限时优惠:2.5折畅享多模型!
人工智能
冬奇Lab8 小时前
AI Workflow 定义的四次演进:从 Markdown 到 JS 脚本,再到分布式多 Agent
javascript·人工智能·agent
冬奇Lab8 小时前
每日一个开源项目(第136篇):OpenMemory - 给 AI Agent 真正的认知记忆引擎
人工智能
黄啊码8 小时前
【黄啊码】微信 AI 把聊天功能和 Vibe Coding打通了,创业者:我又白干了
人工智能
IT_陈寒9 小时前
React的useState居然还有这种坑?我差点删库跑路
前端·人工智能·后端