具有提升的离散小波变换LeGal 5/3(负值,可视化,LH HL混淆)

mar*_*s_p 7 c matlab video-encoding jpeg2000 wavelet

我目前正在深入研究Wavelets并对某些事情感到有些困惑.

首先,这不是功课.它仅用于娱乐编码.

为了更好地理解,我在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)
Run Code Online (Sandbox Code Playgroud)

但我很挣扎.

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

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

  3. 如果先行然后是列,反之亦然,这实际上是否重要?我在切换订单时看到输出没有区别.唯一不同的是LH变为HL而HL变为LH.但是,这并不能解决我的第二个问题,因为输出是相同的.我猜它只是符号.那重要吗?我看到他们在那里做文章和他们做排队的其他人.两者都与JPEG2000有关.

非常感谢.如果有人能对我的问题有所了解,那么我将非常感激.

亲切的问候,马库斯

Goz*_*Goz 4

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

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

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

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

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

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

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

d = s[n + 1] - ((s[n + 0] + s[n + 2]) / 2);
Run Code Online (Sandbox Code Playgroud)

因此,如果源图像为255, 0, 255...,则将导致广告为-255。从 开始0, 255, 0将给出最大值,255因此您绝对应该在该范围内-255 to +255,否则您的实现会出现问题。