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

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

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

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

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

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

Мера достигнутого сжатия дана коэффициентом сжатия (CR) и отношением Бита на пиксель (BPP). CR и бит/пкс представляют эквивалентную информацию. CR указывает, что сжатое изображение хранится с помощью % CR размера исходной системы хранения, в то время как бит/пкс является количеством битов, используемых, чтобы сохранить один пиксель изображения. Для полутонового изображения начальный бит/пкс равняется 8. Поскольку изображение истинного цвета, начальный бит/пкс равняется 24, потому что 8 битов используются, чтобы закодировать каждый из трех цветов (цветовое пространство RGB).

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

Мы начинаем с простого метода каскадной глобальной содействующей пороговой обработки и Кодирования методом Хаффмана. Мы используем вейвлет по умолчанию bior4.4 и уровень по умолчанию, который является максимальным возможным уровнем (см. WMAXLEV функция) разделенный на 2. Желаемый бит/пкс установлен в 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')]})

Итоговое отношение бит/пкс - приблизительно 0,92 при использовании 12 шагов.

Теперь мы пытаемся улучшить результаты при помощи вейвлета bior4.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')]})

Для одиннадцатого цикла мы видим, что результат может быть рассмотрен удовлетворительным, и полученное отношение бит/пкс - приблизительно 0,35. При помощи более свежего метода, SPIHT (Разделение набора в Иерархических Деревьях), бит/пкс может быть улучшен далее.

[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. Изображения истинного цвета могут быть сжаты с помощью той же схемы в качестве полутоновых изображений путем применения тех же стратегий к каждому из этих трех компонентов цвета.

Прогрессивный используемый метод сжатия является SPIHT (Разделение набора в Иерархических Деревьях), и номер кодирования циклов определяется к 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) являются очень удовлетворительными при поддержании хорошего визуального восприятия.

Больше об истинном сжатии изображений

Для получения дополнительной информации об Истинном Сжатии изображений, включая некоторую теорию и примеры, смотрите следующую ссылку:

Мизити, M., И. Мизити, Г. Оппенхейм, J.-M. Poggi (2007), "Вейвлеты и их приложения", Ряд DSP ISTE.

Для просмотра документации необходимо авторизоваться на сайте