Вопрос

Я использую MATLAB для применения дискретного вейвлет-преобразования к изображению.Я применяю его несколько раз (3), чтобы получить 3-уровневое преобразование.Я использую dwt2 функция, предоставляемая MATLAB для того, чтобы сжимать и idwt2 чтобы произвести декомпрессию.Проблема в том, что я не знаю, как выполнить распаковку несколько раз, как в apply 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top