7

我目前正在研究小波,对某些事情有点困惑。

首先,这不是家庭作业。它仅用于娱乐编码。

为了更好地理解,我在 C 中实现了 LeGal 5/3 小波的提升方案。据我所知,它似乎有效。我可以将其反转,并且可以正确复制原始图像。在伪代码中,我的正向 dwt 如下所示:

// deinterleave splits the low band from the high band 
// (e.g. 1 0 3 0 6 0 8 1 11 becomes 1 3 6 8 11 | 0 0 0 1)

for each row in image:
     dwt1d(row)
     deinterleave(row)
for each col in image:
     dwt1d(col)
     deinterleave(col)

但我在一些事情上挣扎。

  1. 应用 dwt 时,我得到了转换后的图像,但值超出了 [0 - 255] 的范围。因此,我将它们存放在短裤中。有些是负数,有些非常大。现在我怎样才能显示它们以获得那些漂亮的图像,如下所示:(http://www.whydomath.org/node/wavlets/images/Largetoplevelwt.gif)?如果我在 Matlab 中使用imshow(image, [])显示我的图像,那么我的输出如下所示:http: //i.imgur.com/dNaYwEE.jpg。那么,我是否必须对我的子频段进行一些转换?如果是,有人可以指出我的解决方案或告诉我该怎么做吗?

  2. 在文献中,我有时会看到子频段的排序如下:[ LL LH; HL HH ] 有时像这样:[ LL HL; LHHH]。后者,我主要在论文是关于 JPEG2000 时看到的,这也是我的算法产生的。然而,在 Matlab 中,当使用 lwt2 函数时,它返回以前的布局。当我将输出与 Matlab 的输出进行比较时,我也看到了这一点。似乎LH和HL混淆了。这个怎么可能?有关系吗?它是否与使用提升而不是卷积有关?

  3. 如果一个人先行然后列或反之亦然,这真的很重要吗?切换订单时,我的输出没有任何差异。唯一不同的是,LH 变为 HL,HL 变为 LH。但是,这并不能解决我的第二个问题,因为输出是相同的。我猜它只是符号。那么这有关系吗?我看到他们做 col-row 的论文和他们做 row-col 的其他论文。两者都与 JPEG2000 有关。

非常感谢。如果有人能对我的问题有所了解,我将不胜感激。

亲切的问候,马库斯

4

1 回答 1

4

我写了一篇关于构建 WDR 图像压缩系统的博客。你可以在这里阅读更多:

http://trueharmoniccolours.co.uk/Blog/

(你会注意到我不是一个多产的博主;))。它应该包含实现您自己的 C++ 版本的 WDR 图像压缩所需的一切。如果没有,请随时解雇我并询问!

  1. 是的,这是我可以解决的一个真正记录不足的“功能”。从 DWT 返回的值实际上是一个 short 值,需要 -255 到 +255 的范围。现在当然 -255 在使用 8 位颜色时不能直接渲染。因此人们通常所做的就是将该值除以 2 并加上 128 进行显示(不要忘记显示只是一个调试工具)。这样,您将 0 移动为 128,因此在灰度图像上为“中灰色”。

  2. 只要您以与进行正向变换相同的方式进行逆变换,这并不重要。

  3. 不,它应该没有区别。在实现时,您决定在哪里写入目标像素,以便您可以自由地将其写入您喜欢的位置(例如,写入完全不同的图像)。

编辑:关于您的评论,涂抹 5/3 提升方程如下:

d = s[n + 1] - ((s[n + 0] + s[n + 2]) / 2);

因此,对于255, 0, 255... 的源图像,这将导致-255. 从开始0, 255, 0会给出最大值,255所以你绝对应该在范围内-255 to +255,否则你的实现有问题。

于 2015-07-16T10:39:42.743 回答