Начиная с заданного изображения, цель истинного сжатия состоит в том, чтобы минимизировать количество бит, необходимых для представления его, с сохранением информации приемлемого качества. Вейвлеты способствуют эффективным решениям этой проблемы. Полная цепь сжатия включает итерационные фазы квантования, кодирования и декодирования в дополнение к самой вейвлет.
Цель этого примера состоит в том, чтобы показать, как разлагаться, сжиматься и расширяться черно-белое или цветное изображение с помощью различных методов сжатия. Чтобы проиллюстрировать эти возможности, мы рассмотрим полутоновое изображение маски и труколорное изображение перца.
Сначала загружаем и отображаем маску полутонового изображения.
load mask image(X) axis square colormap(pink(255)) title('Original Image: mask')
Мера достигнутого сжатия определяется степенью сжатия (CR) и коэффициентом Bit-Per-Pixel (BPP). CR и BPP представляют эквивалентную информацию. CR указывает, что сжатое изображение сохранено с использованием CR% от начального размера памяти, в то время как BPP является количеством битов, используемых для хранения одного пикселя изображения. Для полутонового изображения начальный BPP равен 8. Для изображения truecolor начальный BPP равен 24, поскольку 8 биты используются для кодирования каждого из трех цветов (цветовое пространство RGB).
Задача методов сжатия состоит в том, чтобы найти лучший компромисс между низкой степенью сжатия и хорошим восприятием результата.
Начнем с простого метода каскадирования порога глобальных коэффициентов и кодирования Хаффмана. Мы используем вейвлет по умолчанию и уровень по умолчанию, который является максимально возможным уровнем (см. 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
Достигнутое отношение Bit-Per-Pixel на самом деле составляет около 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, использующего вейвлет Haar. Ключевым параметром является количество циклов; увеличение приводит к лучшему восстановлению, но с меньшей степенью сжатия.
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 стадий.
Теперь мы стараемся улучшить результаты, используя wavelet bior4.4 вместо haar и глядя на циклы 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 Tree), 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 Tree), и количество циклов кодирования устанавливается равным 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%) и коэффициент Bit-Per-Pixel (0,4) являются очень удовлетворительными при сохранении хорошего визуального восприятия.
Для получения дополнительной информации о True Compression изображений, включая некоторые теории и примеры, смотрите следующую ссылку:
Misiti, M., Y. Misiti, G. Oppenheim, J.-M. Poggi (2007), «Wavelets and their applications», ISTE DSP Series.