Гонсалес Р., Вудс Р., Эддинс С. Цифровая обработка изображений в среде Matlab (2006) (1246139), страница 58
Текст из файла (страница 58)
'/ 'сойе' сопса1пз воигсе вушЬо1 зсг1пяв соггезропй1пя Со '11пЬ' Х пойев, вЬ11е '11пЬ' сопСа1пв СЬе аййтеввев (+) Со лойе ра1гв 1ог '/ лойе вушЬо1 вСг1пяв р1ив '0' апй ' 1' ог аййгеззев (-) Со йесойей '/ Нит(шап сойевогйв 1п 'шар'. Аттау '1е1С' 1в а 11вС о1 пойев уеС Со Х Ье ргосеввей уог '11п)с' епСг1ез.
сойе = се11втт(сЬаг(>, '0', '1')); '/ Яет всагС1пя сопй1САопв ав 11п1с = [2; 0; 0); 1еуС = [2 3); Х 3 пойев в/2 ипргосеззей 1оипй = 0; Со11пй = 1епкСЬ(шар); Х ТтасМпя эатйаЬ1ез вй11е 1епкСЬ(1е1С) А (уоипй ( Со11пй) 1ооЬ = 11пй(вттсшр(шар, сойе(1е1С(1)))); '/ 1в зСг1пя 1п шар? 11 1ооЬ / Уез 11пЬ(1е1С(1)) = -1оо)с; '/ Ро1пС Со Ниттшап шар 1е1С = 1е1С (2: епй); Х Ое1есе сиггепС лойе Хоипй = 1оипй + 1; '/ 1псгешепС сойев уоипй е1ве '/ Мо, айй 2 пойев А ро1псегв 1еп = 1епясЬ(сойе); '/ Рит ройптегв 1п лойе 11п)с(1е1С(1)) = 1еп + 1; 11п)с = [11п)с; О; 01; Х Айй ипртосеввей пойев сойе(епй + 1г = зтгсаС(сойе(1е1С(1)т, '0'); сойе(епй + 1т = зггсаС(сойе(1еуС(1)т, '1'); 1е1С = 1е1С(2:епй); '/ Нешоче ргосеввей лойе 1еХС = [1е1С 1еп + 1 1еп + 2); Х Айй 2 ипргосеввей пойев еш1 епй х = иптаче1(у.сойе', 11пЬ, ш е п); х = х + хш1п — 1; х = гевЬаре(х, ш, и); '/ Оесойе из1пк С 'иптаие1' '/ Х шгп1шшв оттвеС ай)ивС Х Иа1се иессог ап аггау Как уже отмечалось ранее, декодирование Ьитт2шаС основано на сериях операций двоичного поиска с двумя исходящими решениями декодирования.
Каждый элемент последовательно просматриваемой строки символов, закодированной по Хаффману (т.е. О или 1), переключает двоичное решение декодирования, основанное на таблице переходов и выходов 11п1с. Построение 11п1с начинается ее инициализацией командой 11п1с = [2; 0; ОЕ Каждый элемент исходного массива 11п)с, состоящего из трех элементов, соответствует закодированной двоичной последовательности в смешанном массиве сойе. В начале сойе = = се11вСг(сЬаг(>, '0', '1')). Пустая строка сойе(1) является исходной точкой (начальным состоянием) любого декодирования Хаффмана. Ассоциированное число 2 в 11п1с(1) обозначает два возможных состояния декодирования, которые следуют задобавлением к нулевой строке '0' или '1'.
Если следующий закодированный бит равен '0', то следующее состояние декодирования есть 11п1с(2) (поскольку сойе(2) = '0' нулевая строка соединяется с '0'); если этот бит равен ' 1 ', то новое состояние будет 11п)с(3) [с индексом (2+ 1) или 3, со значением '(ч 3! 8 Глава В. Сжагаие изображений сойе (3) = ' 1 ']. Обратите внимание на то, что соответствующие значения в 11п1с равны О. Это означает, что они еще не были обработаны для получения подходящих решений для кода Хаффмана шар.
При построении 11п1с, если в шар найдена строка (т. е. '0' или ' 1', что означает настоящее кодовое слово), то соответствующий 0 в 11ц1с заменяется на соответствующий индекс шар со знаком минус (зто декодированная величина). В противном случае новый (положительный) иццекс шар вставляется по указателю на два новые состояния (возможные кодовые слова Хаффмана) в логической последовательности (или '00' и '01', или '10' и '11'). Эти новые и еще не обработанные элементы 1пйс увеличивают размер 11гйс (смешанный массив соое также необходимо обновить), после чего процесс построения продолжается до тех пор, пока в 11п1с остаются необработанные элементы. Вместо того, чтобы непрерывно сканировать 11гйс на предмет необработанных элементов, функция )гц112шас строит массив отслеживания с именем 1е11, который в начале процесса равен [2, 3], и каждый раз обновляет его, чтобы в нем находились индексы неисследованных элементов 1пйс.
Таблица 8.3. Таблица декодирования смешанного массива редуцированного источника на рис. 8.3 В табл. 8.3 показана таблица 11п)с, которая строится для кода Хаффмана из примера 8.2. Если каждый индекс 11п)с рассматривать в качестве состояния декодирования 1, то каждое двоичное решение кодирования (при просмотре кодовой последовательности слева направо) и/или выход декодера Хаффмана определяется по 11п1с(1) по следующим правилам: 1.
Если 1пйс(1) ( 0 (отрицательно), то кодовое слово Хаффмана уже было продекодировано. Выход декодера есть |11пк(1)), где ~ ~ обозначает абсолютную величину. 2. Если 11п)с(1) > 0 (положительно), и следующий обрабатываемый бит равен О, то следующее состояние декодирования — это индекс 1пйс(1), т.е. мы полагаем 1 = 1гп1с01). 3. Если 11п)с(1) > 0 и следующий обрабатываемый бит равен 1, то следующее состояние декодирования — это индекс 11п1с01) + 1, т. е. мы полагаем 1 = 11п1с(1) + 1. Как ранее отмечалось, положительные компоненты 11пк соответствуют двоичным переходам декодирования, а отрицательные компоненты определяют продекодированные выходные значения.
После декодирования каждого кодового слова Хаффмана начинается новый двоичный поиск с индексом 11п1с равным 1 = 1. При декодировании строки 101010110101... из примера 8.2 последовательность .б.бд б ЗД состояний переходов: 5. = 1, 3, 1, 2, 5„6, 1, ...;асоответствующаяпоследовательность выходов: —, ~-2), —, —, -, ~-3~, — ..., где знак '-' обозначает отсутствие выхода. Декодированные выходные значения 2 и 3 являются первыми двумя пикселами из первого столбца тестового изображения 12 в примера 8.2. С-функция ппгане1 принимает описанную выше структуру 11пк и использует ее в процедуре двоичного поиска, нужного для декодирования входа Ьх.
Блоксхема на рис. 8.5 отображает основные действия ипгабге1, которые производятся в процессе принятия решений, которые объяснялись вместе с табл. 8.3. Отметим, что при написании программы на С потребовалось вносить некоторые поправки, связанные с тем, что индексы массивов в С начинаются с О, а не с 1. Рис. 8.5. Блок-схема С-функции иагаеег В систему МАТЮКАВ можно внедрять функции, написанные на языках С и Богггап, что служит двум целям: (1) появляется возможность вызывать в МАТ1 АВ огромное количество имеющихся программ на С и Гогггап без необходимости их переписывания и отлаживания в виде М-файлов, и ~~20 г и. с г !2) можно оптимизировать критически важные вычислительные процессы, т, е.
алгоритмы, реализации которых на МАТЬАВ работают недостаточно быстро, запрограммировать на С или на Рогсгап более эффективно, воспользовавшись близостью этих языков к машинному коду. При использовании С или Еогсгап, функции, написанные на этих языках, называются МЕХ-файламиа. С ними можно обращаться как с обычными М-файлами или М-функциями МАТЬАВ, но сначала их надо откомпилировать с помощью специальной программы МАТЮКАВ, которая называется шех. Например, для компиляции программы гшгане1 при работе в операционной среде ЪУ)пдогчэ необходимо в командной строке МАТЬАВ выполнить следуюп!ую команду: » шех гшгаче1.
с При этом образуется МЕХ-файл ипгаче1.д11 с расширением .д11. Функцию МЕХ можно сопроводить любой справочной информацией, которую следует расположить в отдельном М-файле с тем же именем (и с расширением .ш). Следующий код функции на языке С для МЕХ-файла ипгаче1 имеет расширение .с; » ипгаче1.с » Оесодев а наг(аЫе 1епЯСЬ содед Ыс вег)пенсе (а чессог о1 16-Ыс 1псебегв) ив1пб а Ыпагу вогс 1гош СЬе МЯВ со сЬе ЕЯВ (асговв чогд ьошгдаг(ев) ьавед оп а сгапв1с1оп саые. » »/ Вгпс1иде >шех.Ь> но1д иигаче1(иив1япед вЬогс »Ьх, доиЫе »11пЬ, доиЫе »х, доиЬ1е хвв, 1пс Ьхвх) ( 1пС 1 = 15, ) = О, Ь = О, и = 0; /» ЯСагС аС гооС поде, 1вс »/ /» Ьх Ыс апд х е1ешепс »/ чЫ1е (хвх — Ь) ( /» Оо иис11 х Св 1111ед »/ 11 (»(11п)г + и) > 0) ( /» 1в СЬеге а 11п)г? »/ 11 ((»(Ьх + )) » 1) !С Ох0001) /» 1в Ыс а 1? »/ и = »Шгйг + и); /» Уев, Вес пеи иоде »/ е1ае и = »Шпк + и) - 1; /» 1С'в 0 ео бес иеи поде »/ 11 (1) 1-; е1ве ()»+! 1 = 15!) /» Яес 1, ) Со пехс ЫС»/ 11 () > Ьхвя) /» В(св 1е1С Со десоде?»/ шехЕггМвЯТхс(>Оис о1 соде Ысв ???>); е1ве ( /» 1С шивс Ье а 1еа1 поде »/ »(х + Ь»+) = -» Шпй + и); /» ОиСриС ча1ие »/ в=О; /» ЯСагс очег ас гооС »/ аМЕХ-функция гМ»С!аь ЕХСегпа! гипс!!оп) строится по программному колу С или Гогггап.
Ее расширение зависит от компьютерной платформы. (Например, в Рдпдоие используется расширение .6Ы) . К д б 32~~1) /> 1я опе 1е1с очег? */ 11 (Ь == хзв — 1) * (х + Ь++) = -* (11пй + и) чо16 шехрипсС1оп(1пс п1Ьв, шхАгтау чр1Ья Ц, АпС пгЬв, сопвс шхАггау >ргЬв[]) доиЫе >11пЬ, кх, хяв; ипв1Епед вЬогс >Ьх; 1пС Ьхвх; /> СЬесЬ 1приСв 1ог геаяопаЫепевв >/ 11(пгЬв != 3) шехЕггМвЕТхС(>ТЬтее 1приСя гейи1ге6.>); е1ве 11 (п1Ьз > 1) шехЕггМяЕТхс(>Тоо шалу оисрис агЕишепсв.>); /> 1в 1авС 1приС агЕишепС а вса1аг? >/ 11 (!шх1в0оиЫе(ргЬя[2]) й шх1яСошр1ех(ргЬв[2]) шхбеСМ(ргЬв[2]) > шхбесМ(ргЬв[2]) != 1) шехЕггМвЕТхс(>1приС Х312Е шивс Ье а яса1аг.>); /* Сгеасе 1прис шасг1х рогпсетз ап6 Еес вса1аг >/ Ьх = шхбесрг(ргЬв[О]); /> 01МТ1б >/ 11пЬ = шхбесрг(ргЬв[1]); /> 000ВЬЕ >/ хвв = шхбеСВса1аг(ргЬя[2]); /> 000ВЕЕ >/ /* СеС СЬе шппвег о1 е1ешепся Ап Ьх */ Ьхях = шхбесМ(ргЬв[О]); /> СтеаСе 'хвв' х 1 оитриС шагг1х >/ р1Ьв[О] = шхСгеасе0оиЬ1еМатг1х(хвх, 1, шхВЕАЬ); /ч ОеС С ро1пСег Со а сору о1 СЬе оиСриС шаСтсх >/ х = шхбеСРг(р1Ьв[О]); /* Са11 сЬе С яиЪгоиссие >/ иптаче1(Ьх, 11пй, х, хвх, Ьхвв); Сопроводительная справочная информация помещается в файле иптаче1.ш: '/ЛМИИЕЬ Оесодев а чаг1аЫе-1епЕСЬ Ь1С зсгеаш.
% Х = УМНАУЕЫУ, ЫМК, ХЬЕМ) 6есодея 01МТ1б АприС чесСог У вазед оп % СгапзАС1оп вп6 оиСриС СаЫе ЫМК. ТЬе е1ешепвв о1 У аге % сопв1дегед Со Ье а сопс1Еиоия вСгеаш о1 епсодед Ысв-с.е., СЬе % МЯВ о1 опе е1ешепс 1о11очв СЬе ЬВВ о1 СЬе ргеч1оив е1ешепс. Харис '/ ХЬЕМ Ав СЬе пишЬег соде чогдв 1п У, апд СЬия СЬе яхве о1 оивриС % чессог Х (с1аяя 000ВЬЕ). Харис ЫМК 1я а Сгапз1ссоп апд оисрис '/ СаЫе (СЬаС дг1чев а вегсев о1 Ыпагу зеагсЬев): % % 1. ЫМК(О) 1в СЬе ептгу ро1пс Хог десод1пЕ, 1.е., яСаСе и = О. % 2. 11 ЫМК(п) < О, СЬе десодед оисриС Ав )ЫМК(п)); яес и = О.