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