Matlab 小波系数阈值化

Matlab 小波系数阈值化,matlab,wolfram-mathematica,wavelet,Matlab,Wolfram Mathematica,Wavelet,我在Mathematica和Matlab中使用小波对图像数据进行了一些实验。我在Mathematica中找到了一段代码,它似乎基本上实现了我想要的功能,如下所示: dwd = DiscreteWaveletTransform[imagedata, HaarWavelet[]]; thr = WaveletThreshold[dwd, {"LargestCoefficients", 100}, Automatic]; out = InverseWaveletTransform[thr]; 上述方

我在Mathematica和Matlab中使用小波对图像数据进行了一些实验。我在Mathematica中找到了一段代码,它似乎基本上实现了我想要的功能,如下所示:

dwd = DiscreteWaveletTransform[imagedata, HaarWavelet[]];
thr = WaveletThreshold[dwd, {"LargestCoefficients", 100}, Automatic];
out = InverseWaveletTransform[thr];
上述方法通过仅保留100个最大系数来执行小波阈值化。然而,我更喜欢做相同事情(或或多或少做相同事情)的Matlab代码

我一直在尝试使用小波工具箱,但到目前为止没有太大的成功。到目前为止,我最接近的方法似乎是使用
wavedec2
。我一直在修补类似这样的东西:

[c,s] = wavedec2(imagedata, level, 'haar');
c1 = threshold(c, 100)  % a function that zeros everything but the 100 biggest coefficients in c.
out = waverec2(c1, s, 'haar');
结果有点类似,但这似乎不是正确的方法。我猜让我困惑的是这里使用的不同类型的系数(细节和近似值),我不确定在哪里(以及如何)进行阈值处理是合适的

我应该指出,小波对我来说是非常新的东西,因此任何指导都将非常感谢


编辑:应该注意的是,上面代码片段中的
threshold(c,100)
只不过是将
c
视为一个一维向量,并简单地将除前100个最大(绝对)值以外的所有值归零。

我看得很对。结果与您预期的不同吗?@Tobias:您的意思是使用
dwt
idwt
函数吗?@Phonon:嗯,我不太确定。看起来,如果增加保留系数的数量,mathematica片段将更快地开始看起来像原始图像。这就是为什么我觉得我遗漏了一些东西。@yoda:我一直在尝试使用
dwt2
。但我不确定我是否只想进行单级分解。我想我要做的事情是从多个分解层次中全局地选取最大的系数。你有阈值函数的代码吗?它基本上应该是
csorted=sort(c,'down');c=c.*(c>c排序(100))