Начиная с данного изображения, целью истинного сжатия является минимизация количества битов, необходимых для его представления, при сохранении информации приемлемого качества. Вейвлеты способствуют эффективному решению этой проблемы. Полная цепочка сжатия включает итеративные фазы квантования, кодирования и декодирования в дополнение к самой вейвлет-обработке.
Цель этого примера - показать, как разложить, сжать и распаковать изображение в градациях серого или триеколора с помощью различных методов сжатия. Чтобы проиллюстрировать эти возможности, рассмотрим изображение маски в градациях серого и изображение перца в цветном цвете.
Сначала загружаем и отображаем изображение маски в градациях серого.
load mask image(X) axis square colormap(pink(255)) title('Original Image: mask')

Степень достигнутого сжатия определяется степенью сжатия (CR) и степенью Bit-Pixel (BPP). CR и BPP представляют эквивалентную информацию. CR указывает, что сжатое изображение сохраняется с использованием CR% от начального размера памяти, в то время как BPP - это количество битов, используемых для хранения одного пикселя изображения. Для изображения в градациях серого начальный BPP равен 8. Для truecolor изображения начальный BPP равен 24, поскольку 8 битов используются для кодирования каждого из трех цветов (цветовое пространство RGB).
Задача способов сжатия состоит в том, чтобы найти наилучший компромисс между низкой степенью сжатия и хорошим результатом восприятия.
Начнем с простого метода каскадирования пороговых значений глобальных коэффициентов и кодирования Хаффмана. Мы используем биор4.4 вейвлета по умолчанию и уровень по умолчанию, который является максимально возможным уровнем (см. WMAXLEV функция), деленная на 2. Требуемый BPP устанавливается равным 0,5, и сжатое изображение сохраняется в файле с именем mask.wtc.
meth = 'gbl_mmc_h'; % Method name option = 'c'; % 'c' stands for compression [CR,BPP] = wcompress(option,X,'mask.wtc',meth,'BPP',0.5)
CR = 6.7200
BPP = 0.5376
Достигнутое отношение бит на пиксель фактически составляет около 0,53 (закрытое до желаемого значения 0,5) для коэффициента сжатия 6,7%.
Теперь мы распаковываем изображение, полученное из файла mask.wtc, и сравниваем его с исходным изображением.
option = 'u'; % 'u' stands for uncompression Xc = wcompress(option,'mask.wtc'); colormap(pink(255))

subplot(1,2,1); image(X); axis square; title('Original Image') subplot(1,2,2); image(Xc); axis square; title('Compressed Image') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')], ... ['BPP: ' num2str(BPP,'%3.2f')]})

Результат является удовлетворительным, но лучший компромисс между степенью сжатия и качеством изображения может быть получен с использованием более сложных способов истинного сжатия, которые включают в себя более жесткие этапы пороговой обработки и квантования.
Теперь мы иллюстрируем использование прогрессивных методов сжатия, начиная с алгоритма EZW с использованием вейвлета Хаара. Ключевым параметром является количество циклов; увеличение его приводит к лучшему восстановлению, но худшей степени сжатия.
meth = 'ezw'; % Method name wname = 'haar'; % Wavelet name nbloop = 6; % Number of loops [CR,BPP] = wcompress('c',X,'mask.wtc',meth,'maxloop', nbloop, ... 'wname','haar'); Xc = wcompress('u','mask.wtc'); colormap(pink(255)) subplot(1,2,1); image(X); axis square; title('Original Image') subplot(1,2,2); image(Xc); axis square; title('Compressed Image - 6 steps') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')], ... ['BPP: ' num2str(BPP,'%3.2f')]})

При использовании только 6 шагов получается очень грубое декомпрессированное изображение. Теперь рассмотрим несколько лучший результат, используя 9 шагов, и, наконец, удовлетворительный результат, используя 12 шагов.
[CR,BPP] = wcompress('c',X,'mask.wtc',meth,'maxloop',9,'wname','haar'); Xc = wcompress('u','mask.wtc'); colormap(pink(255)) subplot(1,2,1); image(Xc); axis square; title('Compressed Image - 9 steps') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')],... ['BPP: ' num2str(BPP,'%3.2f')]}) [CR,BPP] = wcompress('c',X,'mask.wtc',meth,'maxloop',12,'wname','haar'); Xc = wcompress('u','mask.wtc'); subplot(1,2,2); image(Xc); axis square; title('Compressed Image - 12 steps') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')], ... ['BPP: ' num2str(BPP,'%3.2f')]})

Конечное отношение BPP составляет приблизительно 0,92 при использовании 12 стадий.
Теперь мы пытаемся улучшить результаты, используя вейвлет-биор4.4 вместо хаара и глядя на петли 12 и 11 шагов.
[CR,BPP] = wcompress('c',X,'mask.wtc','ezw','maxloop',12, ... 'wname','bior4.4'); Xc = wcompress('u','mask.wtc'); colormap(pink(255)) subplot(1,2,1); image(Xc); axis square; title('Compressed Image - 12 steps') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')], ... ['BPP: ' num2str(BPP,'%3.2f')]}) [CR,BPP] = wcompress('c',X,'mask.wtc','ezw','maxloop',11, ... 'wname','bior4.4'); Xc = wcompress('u','mask.wtc'); subplot(1,2,2); image(Xc); axis square; title('Compressed Image - 11 steps') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')], ... ['BPP: ' num2str(BPP,'%3.2f')]})

Для одиннадцатого цикла мы видим, что результат можно считать удовлетворительным, и полученное отношение BPP составляет приблизительно 0,35. Используя более поздний метод, SPIHT (Set Partitioning in Hierarchical Trees), BPP может быть дополнительно улучшен.
[CR,BPP] = wcompress('c',X,'mask.wtc','spiht','maxloop',12, ... 'wname','bior4.4'); Xc = wcompress('u','mask.wtc'); colormap(pink(255)) subplot(1,2,1); image(X); axis square; title('Original Image') subplot(1,2,2); image(Xc); axis square; title('Compressed Image - 12 steps') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')], ... ['BPP: ' num2str(BPP,'%3.2f')]})

Конечная степень сжатия (2,8%) и отношение бит на пиксель (0,23) являются очень удовлетворительными. Напомним, что CR означает, что сжатое изображение сохраняется, используя только 2,8% от первоначального размера хранилища.
Наконец, мы иллюстрируем, как сжать изображение wpeppers.jpg truecolor. Изображения Truecolor можно сжать, используя ту же схему, что и изображения в градациях серого, применяя те же стратегии к каждому из трех цветовых компонентов.
Используется метод прогрессивного сжатия SPIHT (Set Partitioning in Hierarchical Trees), и количество циклов кодирования устанавливается равным 12.
X = imread('wpeppers.jpg'); [CR,BPP] = wcompress('c',X,'wpeppers.wtc','spiht','maxloop',12); Xc = wcompress('u','wpeppers.wtc'); colormap(pink(255)) subplot(1,2,1); image(X); axis square; title('Original Image') subplot(1,2,2); image(Xc); axis square; title('Compressed Image - 12 steps') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')], ... ['BPP: ' num2str(BPP,'%3.2f')]})

delete('wpeppers.wtc')Степень сжатия (1,65%) и отношение бит на пиксель (0,4) являются очень удовлетворительными при сохранении хорошего визуального восприятия.
Дополнительные сведения об истинном сжатии изображений, включая некоторые теории и примеры, см. в следующей ссылке:
Мисити, М., Я. Мисити, Г. Оппенгейм, Ж.-М. Poggi (2007), «Вейвлеты и их приложения», ISTE DSP Series.