7

我遇到了这个惊人的响应Applying MATLAB's idwt2several times我自己执行来理解它。但是,我无法了解如何将其用于处理 RGB 图像。所以,我有3个问题。

  1. 如何将代码应用于仅在输出中显示转换后的图像以及沿行和列的高频和低频分量的 RGB 图像,是否可以将所有分量的融合视为单个图像?我知道我必须使用 cat 运算符,但我不明白该怎么做。

  2. 其次,我也得到了一个迷宫般的图像!我很困惑,因为我似乎无法理解原因。我还附上了相同的代码以及显示该图像是如何生成的语句。

    db13.函数签名中的术语是什么意思dwt

代码:

    load woman;             % Load image data
%startImage=imread('pic_rgb.jpg');  % IF I WANT TO WORK WITH RGB IMAGE
    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
    startImage = X;
    for iLevel = 1:nLevel,
      [cA{iLevel},cH{iLevel},cV{iLevel},cD{iLevel}] = dwt2(startImage,'db1');



     startImage = cA{iLevel};
    end

    figure;colormap(map);
    imagesc(dwt2(startImage,'db1')); %THIS GIVES THE MAZED IMAGE INSTEAD OF THE TRANSFORMED IMAGE
    figure;
    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);

    %reconstruct
    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);
4

1 回答 1

9

在我对其他问题的回答中使用的示例图像是索引图像,因此需要进行一些更改才能使该代码适用于RGB 图像

我将首先解决您关于'db1'传递给DWT2的参数的问题。这指定了用于分解的小波类型(在本例中为Daubechies 小波)。有关可用小波的更多信息可以在函数WFILTERSWAVEINFO的文档中找到。

我将通过向您展示如何修改我的其他答案中的代码以适用于 RGB 图像来解决您的前两个问题。我将使用示例'peppers.png'图像。您首先要加载图像并定义每个颜色组件具有的值的数量。由于示例图像是无符号 8 位整数类型(最常见的情况),nColors将是 256:

X = imread('peppers.png');  %# Load sample image
nColors = 256;              %# Number of values per color component

如果您的图像是较大的无符号整数类型(例如'uint16'),查找颜色值数量的一般方法是使用函数INTMAX,如下所示:

nColors = double(intmax(class(X)))+1;

对于随后的代码,'uint8'假设图像类型为。

应用分解与索引图像的情况没有什么不同。系数矩阵将只是 M×N×3 矩阵,而不是 M×N 矩阵:

nLevel = 3;             %# Number of decompositions
cA = cell(1,nLevel);    %# Approximation coefficient storage
cH = cell(1,nLevel);    %# Horizontal detail coefficient storage
cV = cell(1,nLevel);    %# Vertical detail coefficient storage
cD = cell(1,nLevel);    %# Diagonal detail coefficient storage
startImage = X;
for iLevel = 1:nLevel,  %# Apply nLevel decompositions
  [cA{iLevel},cH{iLevel},cV{iLevel},cD{iLevel}] = dwt2(startImage,'db1');
  startImage = cA{iLevel};
end

由于我们现在使用 3-D 矩阵并且必须使用CAT函数而不是连接运算符,因此创建平铺图像以显示每个分解的水平、垂直和对角线分量的代码将发生变化[]

tiledImage = wcodemat(cA{nLevel},nColors);
for iLevel = nLevel:-1:1
  tiledImage = cat(1,cat(2,tiledImage,...
                           wcodemat(cH{iLevel},nColors)),...
                     cat(2,wcodemat(cV{iLevel},nColors),...
                           wcodemat(cD{iLevel},nColors)));
end
figure;
imshow(uint8(tiledImage-1));  %# Convert to unsigned 8-bit integer to display

这将给出以下图像,显示每个分解步骤的水平(右上)、垂直(左下)和对角线(右下)分量,以及缩小的图像(左上):

在此处输入图像描述

重建步骤与其他答案相同。只需要修改显示最终图像的代码:

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;
tiledImage = cat(1,cat(2,X,uint8(fullRecon)),...
                   cat(2,uint8(partialRecon),zeros(size(X),'uint8')));
imshow(tiledImage,'InitialMagnification',50);

您将获得一张显示原始 RGB 图像(左上)、使用所有存储的细节系数矩阵(右上)的完全重建的图像,以及不使用任何存储的细节系数矩阵的部分重建的图像(下剩下):

在此处输入图像描述

于 2011-07-21T16:59:05.070 回答