Вейвлет-преобразование для N измерений
Я наткнулся на этот удивительный ответ Применение MATLAB idwt2
несколько раз, которые я выполнил, чтобы понять это сам. Однако я не могу понять, как использовать то же самое при работе с RGB-изображением. Итак, у меня есть 3 вопроса.
Каким образом код будет применен к изображению RGB с отображением на выходе только преобразованного изображения, которое находится вместе с высокочастотными и низкочастотными компонентами вдоль строки и столбца, можно ли рассматривать объединение всех компонентов как одно изображение? Я знаю, что я должен поставить кошку оператора, но я не могу понять, как это сделать.
Во-вторых, я также получаю лабиринт изображения! Я сбит с толку, так как не могу понять причину. Я также приложил тот же код к заявлению, показывающему, как это изображение было сгенерировано.
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 (вверху слева), полностью восстановленное изображение с использованием всех сохраненных матриц коэффициентов детализации (вверху справа) и частично восстановленное изображение без использования сохраненных матриц коэффициентов детализации (внизу) оставил):