matlab - 多次应用MATLAB的idwt2

标签 matlab image-processing wavelet

我正在使用 MATLAB 对图像应用离散小波变换。我多次应用它 (3) 以获得 3 级变换。我正在使用 MATLAB 提供的 dwt2 函数进行压缩,并使用 idwt2 进行解压。问题是我不知道如何多次解压缩,例如多次将 idwt2 应用于先前收到的输出,因为它返回一个矩阵。举个例子:

x = idwt2(scaled3, vertical3, horizontal3, diagonal3, Lo_R, Ho_R);

应该如何将idwt2应用于x?

最佳答案

查看 dwt2 的文档和 idwt2 ,看来您有 2 个通用选项来重建多重分解的图像:

  • 存储来自每个分解步骤的所有水平、垂直和对角细节系数矩阵,并在重建中使用它们。
  • 为您未从之前的分解步骤中保存的任何细节系数矩阵输入一个空矩阵 ([])。

因为这是一个缓慢的一天,这里有一些代码展示了如何做到这一点以及每种情况下的结果......

首先,加载示例图像并初始化一些变量:

load woman;              % Load image data
nLevel = 3;              % Number of decompositions
nColors = size(map, 1);  % Number of colors in colormap
cA = cell(1, nLevel);    % Approximation coefficients
cH = cell(1, nLevel);    % Horizontal detail coefficients
cV = cell(1, nLevel);    % Vertical detail coefficients
cD = cell(1, nLevel);    % Diagonal detail coefficients

现在,应用分解(在本例中为 3)并将每个步骤的细节系数矩阵存储在元胞数组中:

startImage = X;
for iLevel = 1:nLevel,
  [cA{iLevel}, cH{iLevel}, cV{iLevel}, cD{iLevel}] = dwt2(startImage, 'db1');
  startImage = cA{iLevel};
end

要查看最终分解图像的样子,以及沿途的所有细节系数矩阵,请运行以下代码(使用 wcodemat ):

tiledImage = wcodemat(cA{nLevel}, nColors);
for iLevel = nLevel:-1:1,
  tiledImage = [tiledImage                    wcodemat(cH{iLevel}, nColors); ...
                wcodemat(cV{iLevel}, nColors) wcodemat(cD{iLevel}, nColors)];
end
figure;
imshow(tiledImage, map);

你应该看到这样的东西:

enter image description here

现在是重建的时候了!以下代码执行“完全”重建(使用所有 存储的细节系数矩阵)和“部分”重建(使用),然后绘制图片:

fullRecon = cA{nLevel};
for iLevel = nLevel:-1:1,
  fullRecon = idwt2(fullRecon, cH{iLevel}, cV{iLevel}, cD{iLevel}, 'db1');
end
partialRecon = cA{nLevel};
for iLevel = nLevel:-1:1,
  partialRecon = idwt2(partialRecon, [], [], [], 'db1');
end
figure;
imshow([X fullRecon; partialRecon zeros(size(X))], map, ...
       'InitialMagnification', 50);

enter image description here

请注意,原始(左上)和“完整”重建(右上)看起来无法区分,但“部分”重建(左下)非常像素化。如果您应用较少的分解步骤(例如仅 1 或 2),差异就不会那么严重。

关于matlab - 多次应用MATLAB的idwt2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1119917/

相关文章:

c++ - 如何从 matlab 重写方程式以在 C++ 中使用

c++ - 将 alpha channel 添加到 opencv Mat

python - 找到分割区域的最大值

matlab - N维小波变换

matlab - 改进 MATLAB 矩阵构造代码 : Or, 代码 Vectorization for beginners

arrays - 在 Matlab 问题中使用 FFT 进行二维反卷积

matlab - X11 MATLAB显示图

matlab - 有没有办法绘制具有不同(交替)高度的轴值?

python - 将 PythonMagick Image 对象转换为 numpy 数组(用于 OpenCV),然后转换为 PIL 图像对象

c++ - 在多个查询的子数组中查找不同(唯一)值的数量