DWT 边缘/索引问题

信息处理 小波
2022-02-17 10:11:16

我正在根据 Mallat 的书实现一个非常基本的正向和反向 DWT。没有什么花哨的、简单低效的 matlab 代码(概念证明比运行时更重要,所以我不专注于优化)。几乎可以工作。我在顶部和左侧边缘出现失真。我将发布一些 lichtenstein 的图片的链接(需要 10 分才能发布)以展示这种行为。

http://postimg.org/image/igy8cv7hn/
从上到下:
* 5 次迭代后。
* 经过一些拆包迭代后,您可以看到顶部和左侧边缘的失真在增长。
* 解压和扭曲。

我正在使用对称边界条件(我已经实现了整体和一半,它没有太大的区别)和 Haar。尽管使用 CDF 具有相同的效果(失真略有不同,但沿整个边缘的位置相同)。由于图片的其余部分被完美地转换和反转,因此整个实现很可能没有任何问题。它必须是某种索引偏移量。很明显,失真的扩展是双向的——在逆循环的每一步中,它的大小都会翻倍。两天多的指数变化导致没有突破。

我在这里粘贴了代码(我意识到人们不太可能想要预先使用 100 行外国代码,但我有点绝望)。运行起来非常简单(尽管就像我说的那样很慢 - 可能需要一分钟才能运行):

runbackward(runforward(rgb2gray(imread('lichtenstein.png')), 5),5)

任何基于代码的帮助或高级诊断想法将不胜感激。

2个回答

Bjorne,我不确定您要做什么,但我可以向您保证,最简单的 DWT 代码在 Matlab 中不超过 10 行。这是如何做到的:

approx = zeros(1, cols);
details = zeros(1, cols);

%for Haar Wavelet, Use filterbanks in Matlab, google it!

hi = ...
lo = ...

for i = 1: Level

   a = conv2(signal, lo);
   d = conv2(signal, hi);


   detail() =  downsample(d);
   approx() =  downsample(a);
   signal = downsample(a);

end

这几乎是计算 DWT 所需的一切。括号内的数值详细和近似值,填写索引即可。

问题确实是索引。由于 matlab 以“数学方式”从 1 开始索引事物,因此零索引的公式存在一些差异。这里有一些加号,那里有一些减号。

出于后代的原因,我正在回答而不是仅仅删除帖子。如果不通过代码,问题可能已经被诊断为这些问题,因为就像我说的那样,问题不可能完全是实现的基础,因为它大部分是成功的。此外,它可能与边界条件无关,因为四个边界中只有两个受到影响。有趣的是,失真模式纯粹与索引相关。