Двумерное истинное сжатие

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

Цель этого примера состоит в том, чтобы показать, как разлагаться, сжиматься и расширяться черно-белое или цветное изображение с помощью различных методов сжатия. Чтобы проиллюстрировать эти возможности, мы рассмотрим полутоновое изображение маски и труколорное изображение перца.

Сжатие глобальным порогом и кодировкой Хаффмана

Сначала загружаем и отображаем маску полутонового изображения.

load mask       
image(X)
axis square
colormap(pink(255))
title('Original Image: mask')

Figure contains an axes. The axes with title Original Image: mask contains an object of type image.

Мера достигнутого сжатия определяется степенью сжатия (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))

Figure contains an axes. The axes with title Original Image: mask contains an object of type image.

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')]})

Figure contains 2 axes. Axes 1 with title Original Image contains an object of type image. Axes 2 with title Compressed Image contains an object of type image.

Результат является удовлетворительным, но лучший компромисс между степенью сжатия и визуальным качеством может быть получен с помощью более сложных истинных методов сжатия, которые включают более жесткие шаги порога и квантования.

Сжатие прогрессивными методами

Теперь мы иллюстрируем использование прогрессивных методов сжатия, начиная с алгоритма 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')]})

Figure contains 2 axes. Axes 1 with title Original Image contains an object of type image. Axes 2 with title Compressed Image - 6 steps contains an object of type image.

Здесь использование только 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')]})

Figure contains 2 axes. Axes 1 with title Compressed Image - 9 steps contains an object of type image. Axes 2 with title Compressed Image - 12 steps contains an object of type image.

Конечное отношение 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')]})

Figure contains 2 axes. Axes 1 with title Compressed Image - 12 steps contains an object of type image. Axes 2 with title Compressed Image - 11 steps contains an object of type image.

Для одиннадцатого цикла мы видим, что результат может быть признан удовлетворительным, и полученное отношение 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')]})

Figure contains 2 axes. Axes 1 with title Original Image contains an object of type image. Axes 2 with title Compressed Image - 12 steps contains an object of type image.

Конечная степень сжатия (2,8%) и отношение Бит-На-Пиксель (0,23) очень удовлетворительны. Напомним, что CR означает, что сжатое изображение сохранено с использованием только 2,8% от начального размера памяти.

Обработка изображений Truecolor

Наконец, мы иллюстрируем, как сжать изображение 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')]})

Figure contains 2 axes. Axes 1 with title Original Image contains an object of type image. Axes 2 with title Compressed Image - 12 steps contains an object of type image.

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.