Начиная с данного изображения, цель истинного сжатия состоит в том, чтобы минимизировать количество битов, должен был представлять его, храня информацию приемлемого качества. Вейвлеты способствуют эффективным решениям для этой проблемы. Полная цепь сжатия включает итеративные фазы квантования, кодирования и декодирования, в дополнение к вейвлету, обрабатывающему себя.
Цель этого примера состоит в том, чтобы показать, как анализировать, сжать, и распаковать черно-белое или цветное изображение с помощью различных методов сжатия. Чтобы проиллюстрировать эти возможности, мы рассматриваем полутоновое изображение маски и изображение истинного цвета перцев.
Сначала мы загружаем и отображаем полутоновое изображение маски.
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.