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)
但我很挣扎.
当应用dwt时,我得到了我的变换图像,但值超出了范围[0 - 255].因此我将它们存放在短裤中.有些是负面的,有些是非常大的.现在我如何显示它们以获得如下所示的那些漂亮的图像:(http://www.whydomath.org/node/wavlets/images/Largetoplevelwt.gif)?如果我使用imshow(image,[])在Matlab中显示我的图像,那么我的输出如下所示:http://i.imgur.com/dNaYwEE.jpg.那么,我是否必须对子频段进行一些转换?如果是,有人可以指出我的解决方案或告诉我该怎么做?
在文献中,我有时看到子带是这样排序的:[LL LH; HL HH],有时也像这样:[LL HL; LH HH].后者,我看到的主要是当论文是关于JPEG2000时,也是我的算法产生的.但是在Matlab中,当使用lwt2函数时,它返回前一个布局.当我将输出与Matlab的输出进行比较时,我也看到了这一点.似乎LH和HL混在一起.怎么可能?有关系吗?是否必须使用提升而不是卷积来做某事?
如果先行然后是列,反之亦然,这实际上是否重要?我在切换订单时看到输出没有区别.唯一不同的是LH变为HL而HL变为LH.但是,这并不能解决我的第二个问题,因为输出是相同的.我猜它只是符号.那重要吗?我看到他们在那里做文章和他们做排队的其他人.两者都与JPEG2000有关.
非常感谢.如果有人能对我的问题有所了解,那么我将非常感激.
亲切的问候,马库斯
我写了一篇关于构建 WDR 图像压缩系统的博客。你可以在这里阅读更多:
http://trueharmoniccolours.co.uk/Blog/
(你会注意到我不是一个多产的博主;))。它应该包含实现您自己的 C++ 版本的 WDR 图像压缩所需的所有内容。如果没有,请随时给我留言并询问!
是的,根据我的研究,这确实是一个记录不足的“功能”。从 DWT 返回的值实际上是一个短值,需要范围 -255 到 +255。当然,现在使用 8 位颜色时 -255 不能直接渲染。因此,人们通常会将该值除以2并加128进行显示(不要忘记显示只是一个调试工具)。这样,您将 0 移动为 128,从而在灰度图像上得到“中灰色”。
只要您以与正向变换相同的方式进行逆变换,这并不重要。
不,应该没有什么区别。实施时,您决定在哪里写入目标像素,以便您可以自由地将其写入您喜欢的位置(例如,写入完全不同的图像)。
编辑:关于您的评论,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
,否则您的实现会出现问题。
归档时间: |
|
查看次数: |
1021 次 |
最近记录: |