Гонсалес Р., Вудс Р., Эддинс С. Цифровая обработка изображений в среде Matlab (2006) (1246139), страница 57
Текст из файла (страница 57)
собе, Пренебрегая завершающими тремя битами, которые дополняют данные до объема, кратного 16, (т. е. нули в конце), можно сказать, что это кодирование 32-мя битами эквивалентно кодированию 29 битами мгновенно и однозначно декодируемым блоковым кодом 10101011010110110000011110011. с) Как было отмечено в предыдущем примере, функция шаС2Ьитт помещает информацию, необходимую для декодирования закодированного входного массива (т.
е. его исходные размеры и значения вероятностей символов), в одну структурную переменную МАТЮКАВ. Сведения об этой переменной задокументированы в справочной секции самой функции шаС2Ьи1г.з 1цпсС1оп у = шаС2ЬиТт(х) %ИАТ280гг Ниттшап епсобев а шасг1х. % У = ИАТ2ННгг(Х) Ниттшап епсобев шасг1х Х ив1п8 вушЬо1 % ргоЬа8111САев 1п ип1С-и14СЬ ЬАвСобгаш Ь1пв ЬеСнееп Х'в ш1п1шшп % ап6 шах1шшп ча1иев. ТЬе епсобеб баса Ав гесигпеб ав а вСгисСиге % Т: % У.себе ТЬе Ниттшап-епсоцец ча1иев о1 Х, всогеб 1п % а игпС16 чесСот.
ТЬе оСЬег 11е14в о1 У сопсаха % ацц1С1опа1 бесо41п8 1п1огшаС1оп, 1пс1и41п % У.ш1п ТЬе ш1п1шшп ча1ие о1 Х р1ив 32768 ВФункция бесзъап преобразует десятичное целое число в двоичную строку. Для получения большей информации наберите команду » Ьетр Весзъьп. афункция ыгвсс аналогична функции ывс. Для дополнительной информации выполните » ветр Ывсс ВВ К.В...., ... 3~3) '/ У.в1хе ТЬе в1хе о1 Х У, У.ЬАяС ТЬе ЬАвпо8гяш о1 Х '/ '/ 1й Х 1я 1оя1са1, и1лС8, и1лС16, и1лС32, 1лС8, 1лС16, ог боиЫе, Х ч1СЬ 1лпебег ча1иев, 1С сал Ье 1лриС 61гесС1у Со МАТ2НОРР. ТЬе '/ ш1л1шиш на1ие о1 Х шивС Ье гергеяелсаЫе ая ал 1лС16. Х '/ П Х 1в йоиЫе ч1СЬ лои-АлСебег ча1иев- — -Хог ехашр1е, аи АшаЕе Х ч1СЬ ча1иев Ьесчеел О алп( 1--11гвС вса1е Х Со ял арргорг1аСе Х 1лсеяег галде ьейоге сье са11.
Рог еха3пр1е, иве У = Х МАТ2НОРР(255еХ) 1ог 256 дгау 1ече1 елсоЖлб. Х '/ МОТЕ: ТЬе лишЬег о1 Ниггшал соде чогйя 1в гоилб(шах(Х(3)) ) Х гоилб(ш1л(Х(:))) + 1. Уои шау леей Со вса1е 1ириС Х Со яелегапе '/ собея о1 геазолаЫе 1елдСЬ. ТЬе шах1шиш гоч ог со1ишл 61шелв1ол Х о1 Х Ая 65535. '/ Х Бее а1во НОРР2МАТ. 11 лб1шв(х) = 2 ! 1вгеа1(х) ! ( 1влишег1с(х) й Ая1од1са1(х)) еггог('Х шизС Ье а 2-О геа1 лишег1с ог 1од1са1 шапг1х.'); елб '/ ЯСоге СЬе в1хе о1 1лриС х, у.в1хе = и1лС32(я1хе(х)); '/ РЫй СЬе халве ой х ча1иея алб всоге 1Ся ш1л1шиш на1ие Ыавей '/ Ьу +32768 ав а О1ИТ16.
х = гоилйИоиЫе(х)); хшгл = ш1л(х(:)); хшах = шах(х(:)); ршгл = йоиЫе(1лС16(хш1л)); рш1л = и1лС16(рш1л + 32768); у.ш1л = рш1л; '/ Сошрипе СЬе шарип Ывпобгаш Ьесчеел хш1л алй хшах ю1СЬ ил1С Х ч16СЬ Ыив, вса1е Со О1ИТ16, алй зпоге. х = х(3)'; Ь = ЬАвСс(х, хш1л:хшах); 11 шах(Ы ) 65535 Ь = 65535 е Ь / шах(Ь); ешь Ь = и1лС16(Ь); у.ЫвС = Ь; Х Себе СЬе глриС шаСг1х алс3 впоге СЬе геви1С. шар = Ьи11шал(ооиЫе(Ь)); '/ МаЬе Ни11шаи собе шар Ьх = шар(х(:) — хш1л + 1); '/ Мар 1шаце Ьх = сЬаг(Ьх)'; Х Солнегс Со сЬаг аггау Ьх = Ьх(:)'; Ьх(Ьх == ' ') = Б; '/, Мешине ЫалЬв ув1хе = се11(1елдСЬ(Ьх) / 16); '/ Сошрипе засошей в1хе Ьх16 = гершаС('О', 1, ув1хе е 16); '/ Рге-а11осасе шойи1о-16 чесСог (зй Г Вс б с '/ Мамусе Ьх шобп1о-16 1п 1еп8СЬ '/ ЯевЬаре Со 16-сЬагассег когда '/ Сопэегс Ь1пагу всг1п6 Со бес1ша1 Ьх16(1:1еп8СЬ(Ьх)) = Ьх; Ьх16 = гевЬаре(Ьх16, 16, ув1хе); Ьх16 = Ьх16' — '0'; Снов = роя2(15:-1:О); у.себе = п1пС16(впш(Ьх16 .е Снов(спев(ув1хе, 1), :), 2))'; 1.
Вычислить гистограмму Ь входа х между минимальным и максимальным значениями х с помощью корзин единичной длины и нормировать ее так, чтобы ее значения помещались в вектор Шг)Т16. 2. Использовать функцию Ьп11шап для построения кода Хаффмана, который называется шар, на основе гистограммы Ь. 3. Преобразовать х с помощью шар (при этом образуется смешанный массив) и конвертировать результат в символьный массив Ьх, удаляя пустые символы, которые были вставлены на манер примера 8.2 при обработке матрицы Ь212. 4.
Сконструировать вариант вектора Ьх, в котором символы организованы в виде сегментов из 16-ти символов. Это делается разбиением Ьх на отрезки по 16 символов (Ьх16 в программе) н приданием им формы матрицы из 16 строк и ув1хе столбцов, где ув1хе = се11(1еп8СЬ(Ьх) / 16). Напомним, что функция се11 [см. 34.2) округляет число в сторону положительной бесконечности. Обобщенная функция МАТВАВ у = гевЬаре(х, ш, и) возвращает матрицу размерами ш на и, элементы которой взяты по столбцам матрицы х, и делает сообщение об ошибке, если в х нет шеп элементов.
5. Конвертировать элементы по 16 символов из Ьх16 в 16-ти битовые числа (т. е. в формате и1пС16). Три завершающие операции выполняют действия, эквивалентные одной компактной команде у = п1пС16(Ь1п26ес(Ьх16')). Они являются ядром функции Ьйп26ес, которая возвращает десятичный эквивалент двоичной строки (например, Ьхп26ес('101') дает результат 5), но выполняется существенно быстрее. Функция МАТЬАВ роя2(у) применяется для построения массива, равного числу 2, возведенному поэлементно в степени у; т. е.
Снов = роя2(15: -1:О) порождает массив [32768163848192 ...842Ц. Обратите внимание на то, что команда у = шаС2Ьи11(х) кодирует по Хаффману матрицу х с помощью гистограммных корзин единичной длины, размещенных на интервале от минимального до максимального значения матрицы х. При дальнейшем декодировании данных, закодированных в у. себе, нужный код Хаффмана должен быть воссоздан по у.ш1п, минимальному значению х, и по у.
Ь1вС, гистограмме х. Вместо того, чтобы хранить таблицу кода Хаффмана, функция шаС2Ьп1х сохраняет информацию о вероятностях символов, достаточную для восстановления этого кода. Имея эти данные, а также исходный размер матрицы х, который записан в поле у. в1хе, функция Ьихт2шаС, рассматриваемая в следующем параграфе этой главы, сможет декодировать у. сойе и восстановить х. Шаги при построении у.
сойе можно резюмировать следующим образом: о.~ Нодооая иобьтонноооп 3!5ф ПрИМер Н.Зо Кодир~ оо и ~ оо.чин~ма яаойои~~ ~316 Г В. С б М 8.2.3. Декодирование Хаффмана Изображения, закодированные по Хаффману, будут бесполезными, пока их нельзя продекодировать и получить исходные изображения, по которым они были построены. Для выхода у = шаС2Ьнгг (х), описанного в предыдущем параграфе, декодер должен сначала построить соответствующий код Хаффмана, по которому кодировалось изображение х (по его гистограмме и связанной информации в у), а затем сделать обратное отображение закодированных данных (которые также извлекаются из у) для реконструкции х.
Как видно из прилагаемого далее листинга функции ЬиЛ2шас, эти действия можно разложить на 5 основных шагов; 1. Извлечь размеры ш и п, а также минимальное значение хш1п (возможного выхода х) из входной структуры у. 2. Реконструировать код Хаффмана, которым было закодировано х, пропустив его гистограмму через функцию Ьиххшап. Полученный результат в программе носит имя шар. 3.
Построить структуру данных (таблицу переходов и выходов 11пЬ) для упрощения декодирования данных в у. собе путем ряда эффективных процедур двоичного поиска. 4. Пропустить построенную структуру и закодированные данные (т.е. 11пй и у.собе) через С-функцию ппгаче1. Эта функция минимизирует время выполнения операций двоичного поиска и строит выходной декодированный вектор х класса 6опЫе.
5. Добавляет хш1п к каждому элементу х и придает ему форму и размеры исходного изображения х (т. е. форму матрицы с ш строками и и столбцами). Единственная особенность функции Ьп112шаС заключается в вызове С-функции ппгаче1 из тела М-функции МАТЮКАВ (см. шаг. 4), что делает декодирование изображений нормального разрешения почти мгновенным. уппсс1оп х = Ьп112шас(у) '/НУГР2МАТ 6есобев а Нисгшап епсобе6 шаСг1х. '/ Х = НОРГ2МАТ(У) бесо6ев а Нпххшап епсобе6 вггисСиге У я1СЬ п1пС16 '/ 11е16в: '/ У.ш1п М1п1шпш ча1пе о1 Х р1ив 327бй '/ У.вхге Яхве о1 Х Х У.ЬАаС Н1вхобхаш о1 Х '/. У.себе Ниххшап собе '/ '/ ТЬе опсрпс Х 1в оу с1авв 6опЫе. '/ '/ Бее а1во МАТ2Н()РГ. 11 Аввсгисс(у) ! 1в11е16(у, 'ш1п') ( 1в11е16(у, 'в1ге') 1в11е16(у, 'Ывс') ) 1в11е16(у, 'со6е') еггог('тье 1прпс шивс Ье а всгпссиге ав геспгпе6 ьу НАт2%гу.'); еп6 вг = 6опЫе(у.в1ге); ш = вг(1); п = вг(2); хш1п = йоиЫе(у.ш1п) — 32768; '/ Оет Х ш1пйшиш шар = Ьиттшап(йоиЫе(у.Ь1вС)); '/ Оес Ниттшап сойе (се11) '/ СгеаСе а Ыпагу веагсЬ СаЫе 1от СЬе Ниттшап йесой1пк ргосевв.