【问题标题】:Wavelet Transform for N dimensionsN维的小波变换
【发布时间】:2011-07-20 17:50:57
【问题描述】:

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

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

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

    3.dwt的函数签名中的db1是什么意思?

代码:

    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);

【问题讨论】:

  • 你今天早些时候不是已经问过这个了吗?我再也看不到原来的问题了 - 你删除它并重新发布还是什么?
  • 是的,我确实做到了,但一整天都没有引起注意和答复。所以,我猜可能是再次转发它以突出它。我如果至少你可以弄出一些答案而不是重新编辑它,那将会有很大的帮助,尽管我保持你之前编辑的版本完好无损。感谢您的付出!
  • 我所做的只是修复标签 - 我没有编辑问题本身。为了将来参考,如果您没有得到任何回复,您应该尝试改进原始问题,而不是重新发布。
  • @RiaGeorge 我删除了有关上传图像的信誉要求的文字。现在你有足够的声望,请上传它。如果您在任何时候都没有足够的声誉来上传图片,请无论如何添加链接,并且有足够声誉的人会为您编辑它。

标签: matlab image-processing wavelet


【解决方案1】:

my answer to that other question 中使用的示例图像是indexed image,因此需要进行一些更改才能使该代码适用于RGB image

我将首先解决您关于传递给DWT2'db1' 参数的问题。这指定了用于分解的小波类型(在本例中为Daubechies wavelet)。有关可用小波的更多信息,请参阅函数 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 图像(左上)、使用所有存储的细节系数矩阵(右上)的完全重建的图像,以及不使用任何存储的细节系数的部分重建的图像矩阵(左下):

【讨论】:

  • 谢谢,但是否也可以只查看不包括所有组件的最终分解图像?只有一张显示辣椒图像小波变换的平铺图像。此外,变量 X 似乎是内置的这意味着除了使用 X 之外没有其他变量起作用。
  • @Ria:您可以像这样查看转换后的图像:imshow(uint8(wcodemat(cA{N},nColors)-1));N 的值是 1、2 或 3,具体取决于您要查看已分解一次、两次还是三次的图像。 X 只是我选择用于存储图像数据的变量。您可以轻松地将代码中的 X 替换为您想要调用该变量的任何内容。
  • :我在第一个 for 循环之后包含了上述行。但它显示的是原始图像而不是转换后的图像。我尝试了不同级别的 N,但都给出了原始图像。 :(
  • @Ria:你确定它显示的是原始图像吗?您可能认为它显示的是原始图像,但每个变换后的图像实际上是原始图像的 较小 版本,每次小波变换后图像尺寸都会减小 2。
  • 是的,它正是原始图像。实际上,我打算查看我们进行快速傅里叶变换时出现的输出。那么,在这种情况下,输出应该是平铺结果中显示的任何一张图像吗?
猜你喜欢
  • 2012-10-30
  • 2016-02-18
  • 2016-04-06
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2013-12-03
相关资源
最近更新 更多