Вейвлет-преобразование для N измерений

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

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

  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 ответ

Решение

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

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

Этапы реконструкции не отличаются от другого ответа. Только код для отображения окончательных изображений должен быть изменен:

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 (вверху слева), полностью восстановленное изображение с использованием всех сохраненных матриц коэффициентов детализации (вверху справа) и частично восстановленное изображение без использования сохраненных матриц коэффициентов детализации (внизу) оставил):

Другие вопросы по тегам