Дискретное вейвлет-преобразование Matlab

Я пытаюсь использовать функции, предоставленные в Matlab Wavelet Toolbox, для создания многоуровневого дискретного вейвлет-разложения изображения, извлечения коэффициентов, манипулирования ими и их повторной компоновки обратно в изображение.

Я пытался использовать ряд функций, но ни одна из них не делает то, что мне нужно. Это шаги, чтобы сделать это.

  1. Используйте wavedec2, чтобы разложить изображение на [C, S]. [C,S] = wavedec2(X,N,Lo_D,Hi_D)

  2. Затем я должен использовать detcoef2 для извлечения коэффициентов детализации из [C,S]. [C,S] — это «структура вейвлет-разложения», она не представляет фактические коэффициенты, такие как cD, cH, cV. [H,V,D] = detcoef2('all',C,S,N)

  3. Манипулировать данными

  4. Реконструировать [C,S] ???? никакая функция этого не делает.

  5. Используйте waverec2 для перекомпоновки исходного изображения. X = waverec2(C,S,Lo_R,Hi_R)

Проблема связана с шагом 4. Нет функции, которая воссоздает [C, S], и я не могу вызвать функцию waverec2, потому что ей нужна модифицированная версия C и S.

Разве мне не нужны wavedec2 и waverec2? Возможно, я должен просто использовать detcoef2 и upcoef2?

Кто-то, имеющий некоторый опыт работы с DWT, может решить это за минуту, я в этом новичок.

Спасибо


person bonapart3    schedule 12.03.2015    source источник


Ответы (1)


Мне любопытно, почему вы не можете использовать dwt2 для вычислений 2D DWT изображений. То, что у вас есть, намного больше работы, чем то, что вы должны делать. dwt2 гораздо больше подходит для того, чтобы делать то, что вы хотите. Вы бы назвали dwt2 так:

[LL,LH,HL,HH] = dwt2(X,Lo_D,Hi_D);

X — это ваше изображение, а Lo_D и Hi_D — фильтры нижних и верхних частот, которые вы хотите применить к изображению. LL — версия изображения с низкими частотами, где горизонтальное и вертикальное направления проходят через низкие частоты, LH — вертикальное направление с низкими частотами и горизонтальное направление с высокими частотами, HL — вертикальное направление с высокими частотами и горизонтальное направление проходит через низкие частоты, а HH - это то место, где оба направления проходят через высокие частоты. Таким образом, LH, HL и HH являются коэффициентами детализации, а LL содержит структуру.

Вы также можете указать нужный фильтр со строкой в ​​качестве второго параметра:

[LL,LH,HL,HH] = dwt2(X,'wname');

'wname' — это строка, указывающая, какой фильтр вам нужен. Вы можете ввести help wfilters, чтобы увидеть, какие фильтры доступны.

Например, используя cameraman.tif из системного пути MATLAB, мы можем выполнить одноуровневый 2D DWT (используя вейвлет Хаара) и отобразить все компоненты следующим образом:

im = imread('cameraman.tif');
[LL, LH, HL, HH] = dwt2(im2double(im), 'haar');
imshow([LL LH; HL HH], []);

Я использую im2double для преобразования изображения в двойную точность для обеспечения точности. Получаем вот такое изображение:

введите здесь описание изображения

Обратите внимание, что изображение подвергается субдискретизации на 2, чтобы получить разложение LL, LH, HL и HH.

Если у вас есть эти компоненты, вы, безусловно, можете манипулировать ими как душе угодно. После того, как вы манипулируете ими, вы можете просто использовать idwt2 следующим образом:

Y = idwt2(LL,LH,HL,HH,Lo_R,Hi_R); %//or
Y = idwt2(LL,LH,HL,HH,'wname');

Предполагается, что четыре компонента равны double, поэтому вы можете преобразовать изображения обратно в любой тип, который представлял изображение. Предполагая, что ваше изображение было uint8, вы можете сделать: Y = im2uint8(Y);, чтобы преобразовать обратно.

Надеюсь, это то, что вы ищете!

person rayryeng    schedule 13.03.2015
comment
Спасибо, у меня изначально был такой способ, и спасибо, что потратили время на то, чтобы все это напечатать! В основном я хотел попробовать wavedec2, потому что он позволяет пройти количество уровней разложения N, но проще просто использовать dwt2 вручную и если N>1, если N>2 и т. д. - person bonapart3; 14.03.2015
comment
@Bonapart3 - Ааа, я понимаю. Если вам нужна многоуровневая декомпозиция, вы наверняка можете поместить dwt2 в цикл. Я не понял, чего ты хотел, но теперь понял. Спасибо! - person rayryeng; 14.03.2015