Вейвлет-преобразование для N измерений - PullRequest
7 голосов
/ 20 июля 2011

Я столкнулся с этим удивительным ответом Применение idwt2 MATLAB несколько раз , которое я выполнил, чтобы понять это сам.Однако я не могу понять, как использовать то же самое при работе с изображением RGB.Итак, у меня есть 3 вопроса.

  1. Как будет применяться код к изображению RGB, когда на выходе отображается только преобразованное изображение, которое находится вместе с высокочастотными и низкочастотными компонентами вдоль строкии столбец, можно ли рассматривать объединение всех компонентов как одно изображение?Я знаю, что я должен поставить оператор cat, но я не могу понять, как это сделать.

  2. Во-вторых, я также получаю лабиринт изображения!Я сбит с толку, так как не могу понять причину.Я также приложил тот же код к оператору, показывающему, как было сгенерировано это изображение.

    3.Что означает термин db1 в сигнатуре функции 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);

1 Ответ

9 голосов
/ 21 июля 2011

Образец изображения, использованный в моем ответе на этот другой вопрос , представлял собой индексированное изображение , поэтому необходимо внести несколько изменений, чтобы этот код работал для RGB-изображение .

Сначала я отвечу на ваш вопрос об аргументе 'db1', переданном DWT2 . Здесь указывается тип вейвлета, который будет использоваться для разложения (в данном случае, вейвлет Добеши ). Более подробную информацию о доступных вейвлетах можно найти в документации по функциям WFILTERS и WAVEINFO .

Я отвечу на первые два вопроса и покажу, как изменить код из моего другого ответа для работы с изображением 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-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

Код для создания мозаичного изображения, показывающий горизонтальные, вертикальные и диагональные компоненты для каждого разложения, будет меняться из-за того, что мы сейчас работаем с трехмерными матрицами и должны использовать 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

Это даст следующее изображение, показывающее горизонтальные (вверху справа), вертикальные (внизу слева) и диагональные (внизу справа) компоненты для каждого шага разложения вместе с уменьшенным изображением (вверху слева):

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

И вы получите изображение, показывающее исходное изображение RGB (вверху слева), полностью восстановленное изображение с использованием всех сохраненных матриц коэффициентов детализации (вверху справа) и частично восстановленное изображение без использования сохраненного коэффициента детализации матрицы (внизу слева):

enter image description here

...