Глядя на документацию для 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);
Вы должны увидеть что-то вроде этого:
Теперь пришло время восстановить! Следующий код выполняет «полную» реконструкцию (используя все сохраненных матриц коэффициентов детализации) и «частичную» реконструкцию (используя none из них), а затем строит изображения:
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 или 2.