В этом разделе рассматриваются функции вейвлет 2-D истинного сжатия с помощью программного обеспечения Wavelet Toolbox™.
Для получения дополнительной информации о методах сжатия смотрите «Сжатие вейвлет для изображений» в Руководстве пользователя Wavelet Toolbox.
Для получения дополнительной информации о основной функции, доступной при использовании режима командной строки, смотрите wcompress
страницы с описанием.
Начиная с заданного изображения, цель истинного сжатия состоит в том, чтобы минимизировать длину последовательности бит, необходимой для ее представления, с сохранением информации приемлемого качества. Вейвлеты способствуют эффективным решениям этой проблемы.
Полная цепь сжатия включает фазы квантования, кодирования и декодирования в дополнение к самой вейвлет.
Цель этого раздела состоит в том, чтобы показать, как сжимать и распаковывать черно-белое или цветное изображение с помощью различных методов сжатия.
В этом разделе вы научитесь
Сжатие с использованием глобального порога и кодирования Хаффмана
Некомпресс
Сжатие с использованием прогрессивных методов
Обрабатывайте изображения truecolor
Сначала загрузите и отобразите маску полутонового изображения.
load mask; image(X) axis square; colormap(pink(255)) title('Original Image: mask')
Синтетическая эффективность сжатия задаются степенью сжатия и коэффициентом Бит-На-Пиксель, которые эквивалентны.
Степень сжатия CR означает, что сжатое изображение сохранено с использованием только CR% от начального размера памяти.
Отношение Бит-На-Пиксель BPP задает количество бит, используемых для хранения одного пикселя изображения.
Для полутонового изображения начальный BPP равен 8, в то время как для трехцветного изображения начальный 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.6925 BPP = 0.5354
Достигнутое отношение Bit-Per-Pixel на самом деле составляет около 0,53 (закрыто до желаемого) при степени сжатия 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',wname); 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 - bior4.4') 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 - bior4.4') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')], ... ['BPP: ' num2str(BPP,'%3.2f')]})
Начиная с одиннадцатого цикла, результат можно считать удовлетворительным. Достигнутое отношение BPP сейчас составляет около 0,35. Его можно даже немного улучшить с помощью более позднего метода: SPIHT (Set Partitioning In Hierarchical Tree).
[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 - bior4.4') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')], ... ['BPP: ' num2str(BPP,'%3.2f')]}) [psnr,mse,maxerr,l2rat] = measerr(X,Xc) delete('mask.wtc')
Конечная степень сжатия (2,8%) и отношение Бит-На-Пиксель (0,23) очень удовлетворительны. Напомним, что первое соотношение означает, что сжатое изображение сохранено с использованием только 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'); subplot(1,2,1); image(X); axis square; title('Original Image') subplot(1,2,2); image(Xc); axis square; title('Compressed Image - 12 steps - bior4.4') xlabel({['Compression Ratio: ' num2str(CR,'%1.2f %%')], ... ['BPP: ' num2str(BPP,'%3.2f')]}) delete('wpeppers.wtc')
Коэффициент сжатия (1,65%) и коэффициент Bit-Per-Pixel (0,4) являются очень удовлетворительными при сохранении хорошего визуального восприятия.
В этом разделе мы исследуем различные методы для 2-D истинного сжатия, используя приложение Wavelet Analyzer.
Запустите инструмент True Compression 2-D Tool.
Из MATLAB® приглашение, тип waveletAnalyzer
.
Появится Wavelet Analyzer. Щелкните элемент True Compression 2-D. Появится инструмент истинного сжатия для изображений.
Загрузите изображение.
В командной строке MATLAB введите
load mask
X
переменная. Нажмите кнопку ОК, чтобы импортировать данные. Изображение появляется в верхней левой части окна вместе с гистограммой серого уровня чуть ниже.
Выполните разложение вейвлет.
Примите значение по умолчанию wavelet bior4.4 и выберите 4 из меню Level, которое является максимально возможным уровнем, разделенным на 2, и нажмите кнопку Descompose. После паузы для расчета инструмент отображает вейвлет приближения и коэффициенты деталей разложения для трех направлений вместе с гистограммой исходных коэффициентов.
Пик интервала, содержащего нуль, иллюстрирует способность вейвлетов концентрировать энергию изображения в нескольких ненулевых коэффициентах.
Попробуйте простой метод.
Начнем с простого метода с каскадом порога глобальных коэффициентов и кодирования Хаффмана.
Выберите опцию GBL_MMC_H из меню Метод сжатия, расположенный в верхней части системы координат Параметры сжатия. Для получения дополнительной информации о методах сжатия смотрите «Сжатие вейвлет для изображений» в Руководстве пользователя Wavelet Toolbox.
Установите желаемое отношение Bit-Per-Pixel равное 0,5.
Значения других параметров автоматически обновляются. Обратите внимание, что эти значения являются только приближениями истинных показателей, поскольку шаг квантования не может быть точно предсказан без его выполнения. Нажмите кнопку «Сжатие».
Синтетическая эффективность определяется степенью сжатия и вычисленным Bit-Per-Pixel (BPP). Это последнее значение на самом деле составляет около 0,53 (близко к желаемому 0,5) при степени сжатия 6,7%.
Сжатое изображение, внизу слева, можно сравнить с оригинальным изображением.
Результат является удовлетворительным, но лучший компромисс между степенью сжатия и визуальным качеством может быть получен с помощью более сложного истинного сжатия, которое объединяет шаги порогового и квантования.
Сжатие с использованием первого прогрессивного метода: EZW.
Теперь давайте проиллюстрировать использование прогрессивных методов, начиная с хорошо известного алгоритма EZW. Начнем с выбора вейвлет из меню Wavelet и выберите 8 из меню Level. Затем нажмите кнопку «Разложить».
Выберите опцию EZW из меню Метод сжатия. Ключевым параметром является количество циклов: увеличение его приводит к лучшему восстановлению, но худшему коэффициенту сжатия. От Nb. Циклы кодирования меню, установите количество циклов кодирования равным 6, что является небольшим значением. Нажмите кнопку «Сжатие».
Уточните результат путем увеличения количества циклов.
Слишком мало шагов создают очень грубое сжатое изображение. Итак, давайте рассмотрим немного лучший результат для 9 шагов. Установите количество циклов кодирования равным 9 и нажмите кнопку Compress.
Как видно, результат лучше, но не удовлетворителен, как путем визуального контроля, так и путем вычисления отношения пикового сигнала к шуму (PSNR), которое меньше 30.
Теперь попробуйте достаточно большое количество шагов, чтобы получить удовлетворительный результат. Установите количество циклов кодирования 12 и нажмите кнопку Compress.
Результат теперь приемлемый. Но за 12 шагов мы достигаем коэффициента Bit-Per-Pixel около 0,92.
Улучшите эффективность сжатия, изменив вейвлет и выбрав лучшее адаптированное количество циклов.
Попробуем улучшить эффективность сжатия, изменив вейвлет: выберите bior4.4 вместо haar и затем нажмите кнопку Descompose.
В порядок, чтобы выбрать количество циклов, инструмент приложения Wavelet Analyzer позволяет вам исследовать последующие результаты, полученные с помощью такого рода пошаговой процедуры. Установите количество циклов кодирования на большое значение, например 13, и нажмите кнопку Show Compression Steps. Кроме того, вы можете выполнить процедуру пошагово, нажав кнопку Stepwise.
Затем нажмите кнопку «Сжатие». Появляются тринадцать постепенно более мелко сжатых изображений, и можно затем выбрать визуально удобное значение для количества циклов. Удовлетворительный результат, по-видимому, получен после 11 циклов. Так, можно задать количество циклов кодирования равное 11 и нажать кнопку Compress.
Достигаемое отношение BPP в настоящее время составляет около 0,35, что обычно считается очень удовлетворительным результатом. Тем не менее, его можно немного улучшить с помощью более недавнего метода SPIHT (Set Partitioning In Hierarchical Tree).
Получите окончательное сжатое изображение с помощью третьего метода.
Выберите опцию SPIHT из меню Метод сжатия, установите количество циклов кодирования равное 12 и нажмите кнопку Сжатие.
Конечная степень сжатия и отношение Bit-Per-Pixel очень удовлетворительны: 2,8% и 0,22. Напомним, что первое соотношение означает, что сжатое изображение сохранено с использованием только 2,8% от начального размера памяти.
Обрабатывайте изображения truecolor.
Наконец, давайте проиллюстрировать, как сжать изображения труколора. Изображения труколора могут быть сжаты по одной и той же схеме путем применения тех же стратегий к каждому из трехцветных компонентов.
В меню « Файл» выберите опцию «Загрузка изображения» и выберите элемент «Поддерживаемые форматы Matlab».
Когда появится диалоговое окно Загрузка изображения, выберите MAT-файл wpeppers.jpg
который должен находиться в папке MATLAB toolbox/wavelet/wavelet
.
Нажмите кнопку OK. Появляется окно с запросом, хотите ли вы рассматривать загруженное изображение как truecolor. Нажмите кнопку Да. Примите значения по умолчанию для меню уровня вейвлета и разложения, а затем нажмите кнопку «Разложить».
Затем примите метод сжатия по умолчанию SPIHT и установите количество циклов кодирования равным 12. Нажмите кнопку «Сжатие».
Степень сжатия и отношение Bit-Per-Pixel (BPP) очень удовлетворительны: 1,65% и 0,4 вместе с очень хорошим перцептивным результатом.
Осмотрите вейвлет.
Для изображений в полутоновом и труколорном цветах можно получить более подробное представление о структуре мультиразрешения сжатого изображения при нажатии кнопки «Просмотр деревьев вейвлет», а затем о различных активных меню, доступных из отображаемого дерева.
Можно сохранить сжатое изображение на диск в текущей папке с выбранным именем.
Инструменты сжатия Wavelet Toolbox могут создать файл с помощью одного из типов Поддерживаемых Форматов Matlab или определенного формата, который может быть распознан расширением файла: wtc (Wavelet Toolbox Compressed).
Для сохранения сжатого изображения используйте опцию меню «Файл» > «Сохранить сжатое изображение» > «Сжатое изображение Wavelet Toolbox». Появится диалоговое окно, в котором можно задать папку и имя файла для хранения изображения. Конечно, использование формата wtc требует от вас распаковки хранимого изображения с помощью инструментов истинного сжатия Wavelet Toolbox.