Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сжатие данных, звука и изображений

.pdf
Скачиваний:
1692
Добавлен:
01.05.2014
Размер:
7.92 Mб
Скачать

Глава 3. Cofcamue изобраэюений

части п/т (19/4 = 4.75). Унарный код 4 равен 00001, значит код G(2) числа п = 19 равен OOOOljll.

На практике всегда имеется конечное число неотрицательных целых чисел. Обозначим наибольшее число через /. Наибольшая дли­ на G{0) равна / -f 1, а поскольку / может быть велико, желатель­ но лимитировать размер кода Голомба. Это делается с помощью специального кода Голомба LG{k,glimit), который зависит от двух параметров к и glimit. Сначала следует сформировать число q из самых старших разрядов числа п. Если q <glimit— flog/] — 1, то код LG(к,glimit) совпадает с кодом LG(k). В противном случае, приготавливается унарный код числа glimit— flog/] — 1 (то есть, glimit— flog/] — 1 нулей, за которыми стоит единственная 1). Это действует как код esc, после которого стоит двоичный код п — 1 из flog/] бит.

Ошибки прогнозов не обязательно являются положительными числами. Они равны некоторым разностям, которые могут быть нулевыми или отрицательными. Однако коды Голомба были постро­ ены А^ля положительных чисел. Поэтому перед кодированием отри­ цательные значения ошибок следует отразить на множество неотри­ цательных чисел. Для этого используется отображение

м^--'={:г;:::;,^,

z::;^n'

(з.18)

2Errval,

Errval > О,

 

2\Errval\ - 1,

Errval < 0.

 

Это отображение перемежает отрицательные и положительные ве­ личины в виде последовательности

0 , - 1 , + 1 , - 2 , + 2 , - 3 , . . . .

В табл. 3.64 перечислены некоторые ошибки прогноза, отображен­ ные значения и их коды LG(2,32) при условии, что алфавит имеет размер 256 (то есть, / = 255 и flog/] = 8).

Теперь необходимо обсудить выбор параметра к для кодов Го­ ломба. Это делается адаптивно. Параметр к зависит от контекста, и его значение обновляется каждый раз, когда обнаруживается пиксел с этим контекстом. Вычисление к можно выразить простой строкой на языке C + +

for (к=0; ( N [ Q ] « k ) < A [ Q ] ; к++),

где Л и N - массивы индексов от О до 364. В этой формуле ис­ пользуется контекст Q в качестве индекса двух массивов. В начале к инициализируется нулем, а затем совершается цикл. На каждой

3.8. JPEG-LS

итерации цикла элемент массива N[Q] сдвигается влево на к разря­ дов и сравнивается с A[Q]. Если сдвинутое значение N[Q] больше или равно Л[(5], то выбирается текущее значение А;. В противном случае, к увеличивается на 1, и тест повторяется.

Ошибка

Отображенное

Код

прогноза

значение

 

0

0

1 00

-1

1

1 01

1

2

1 10

-2

3

1 11

2

4

01 00

-3

5

01 01

3

б

01 10

-4

7

01 11

4

8

001 00

-5

9

001 01

5

10

001 10

-6

11

001 11

б12 0001 00

-7

13

0001 01

7

14

0001 10

-8

15

0001 11

8

16

00001 00

-9

17

00001 01

9

18

00001 10

-10

19

00001 11

10

20

000001 00

-11

21

000001 01

11

22

000001 10

-12

23

000001 11

12

24

0000001 00

50100 000000000000

000000000001

01100011

Табл. 3.64. Ошибки прогнозов, отображения и коды LG(2,32).

После нахождения числа А;, ошибка прогноза Errval преобразу­ ется с помощью уравнения (3.18) в число MErrval., которое коди­ руется с помощью кода LG(k,LIMIT). Число LIMIT является пара­ метром. Обновление массивов А и N (вместе со вспомогательным массивом В) показано на рис. 3.65 (параметр RESET контролиру­ ется пользователем).

Глава 3. Сжатие изобраэюений

Кодирование в серийной моде делается иначе. Кодер выбира­ ет эту моду, когда обнаруживает последовательные пикселы ж, чьи значения совпадают и равны восстановленной величине Ra кон­ текстного пиксела а. Для опции почти без потерь пикселы в серии должны иметь значения /х, которые удовлетворяют неравенству

\1х - Ra\ < NEAR.

Серия не должна выходить за пределы текущей строки. Длина серии кодируется (сам пиксел кодировать не нужно, поскольку он равен Ла), и если конец серии находится раньше конца строки, то после ее закодированной длины будет сразу записан код следующего пиксела (который прерывает серию). Две основные задачи кодера в этой моде состоят (1) в отслеживании серии и кодировании ее длины; (2) в кодировании пиксела, прервавшего серию. Отслеживание серии показано на рис. 3.66. Кодирование серий приведено на рис. 3.67 (для сегментов серий длины гт) и на рис. 3.68 (для сегментов серий длины меньше, чем гт). Рассмотрим некоторые детали.

 

RUNval=Ra;

в[Q]=В[Q]+Errval*(2*NEAR+1);

RUNcnt=0;

А[Q]=А[Q3 + a b s ( E r r v a l ) ;

while (abs (Ix-RUNval) < =NEAR)

if(N[Q]=RESET) then

RUNcnt=RUNcnt+l;

A[Q]=A[Q]>>1;

Rx=RUNval;

B[Q]=B[Q]>>1;

if(EOLine=l) break

N[Q]=N[Q]>>1;

else GetNextSample 0

endif;

endif;

N[Q]=N[Q]+1;

endwhile;

Р и с . 3.65. Обновление массивов A, В и N.

Рис . 3.66. Отслеживание серий.

Кодер использует таблицу J, состоящую из 32 записей, обозна­ чаемых гк. J инициализируется величинами

О, О, О, О, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, б, б, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15.

Для каждого значения гк обозначим гт = 2^^. Числа гт (их все­ го 32) называются порядком кода. Первые 4 величины гк имеют

гт, = 2^ = 1. Для

второй

четверки г т = 2^

= 2, а для

следу­

ющей четверки гт

= 2^ =

4. Для последнего

числа гт =

2^^ =

= 32768. Кодер выполняет процедуру, указанную на рис. 3.66, для нахождения длины серии, которая сохраняется в переменной RUNlen. Затем эта переменная кодируется разбиением на слагаемые, вели­ чины которых равны последовательным числам гт,. Например, если

3.8. JPEG-LS

RUNlen=6, TO его представляют в виде 6 = l + l 4 - l 4 - l + 2 c помо­ щью первых пяти чисел гт. Оно кодируется с помощью 5 бит. За­ пись производится инструкцией AppendToBitfile(l,l) (рис. 3.67). Каждый раз, когда пишется 1, соответствующая величина гт вы­ читается из RUNlen. Если RUNlen было равно в начале 6, то она по­ следовательно уменьшается до 5, 4, 3, 2 и 0.

 

if(EOLine=0) then

 

AppendToBitfile(0,1);

 

AppendToBitfile

while(RUNcnt> = (l<<J[RUNindex]))

(RUNcnt, J [RUNindex] ) ;

AppendToBitfile(1,1);

if(RUNindex >0)

RUNcnt=RUNcnt-(1< < J[RUNindex]);

RUNindex=RUNindex-l;

if(RUNindex<31)

endif;

RUNindex=RUNindex+l;

e l s e if(RUNcnt>0)

endwhile;

AppendToBitfile(1,1);

Р и с . 3.67. Кодирование серий (I).

Рис . 3.68. Кодирование серий (II).

Может конечно случиться, что длина RUNlen серии не равна це­ лой сумме чисел гт. Например, RUNlen = 7. В этом случае в качестве кода записывается пять битов 1, за которыми следует префиксный бит и остаток от RUNlen (в нашем примере это 1), который запи­ шется в файл в виде числа из гк бит (текущее значение гк из на­ шего примера равно 2). Эта последняя операция выполняется вызо­ вом процедуры AppendToBitf i l e (RUNcnt, J [RUNindex] ) на рис. 3.68. Префиксным битом служит О, если серия прерывается в строке дру­ гим пикселом. Если серия идет до конца строки, то префиксный бит равен 1.

Вторая основная задача кодера, состоящая в кодировании пиксе­ ла прерывания серии, делается аналогично кодированию текущего пиксела и здесь не обсуждается.

Нет ничего xyotce точного образа размытой концепции.

Апсель Адаме

ГЛАВА 4

ВЕЙВЛЕТНЫЕ

МЕТОДЫ

Во введении уже отмечалось, что методы сжатия, основанные на свойствах вейвлетов, используют довольно глубокие математиче­ ские результаты. Это обстоятельство бросает определенный вызов как автору, так и читателю. Целью этой главы является представ­ ление основ теории вейвлетных преобразований (с минимумом до­ полнительных математических сведений) и ее приложений к зада­ чам сжатия данных. Глава начинается с изложения последователь­ ности шагов, состоящих из вычисления средних (полусумм) и полу­ разностей, которые преобразовывают одномерный массив исходных данных к виду, удобному для сжатия. Затем этот метод обобща­ ется на двумерные массивы данных, что позволяет применять эти результаты к сжатию оцифрованных изображений. Рассмотренная последовательность трансформаций массива данных является про­ стейшим примером поддиапазонного преобразования. Будет пока­ зано, что она идентична преобразованию Хаара, определенному в

§3.5.7.

В§ 4.2.1 устанавливается связь преобразования Хаара с умноже­ нием матриц. Это проложит путь к введению в § 4.4 понятия банка фильтров. В § 4.3 излагаются некоторые дополнительные матема­ тические результаты, знакомство с которыми можно опустить при первом чтении. В этом параграфе обсуждается операция дискрет­ ной свертки и ее применение к поддиапазонным преобразованиям. За этим материалом следует § 4.6, в котором излагается дискретное вейвлетное преобразование (DWT, descrete wavelet transform). Гла­ ва заканчивается описанием метода сжатия SPIHT, основанного на вейвлетном преобразовании.

Перед тем как углубиться в различные детали следует ответить на часто задаваемый вопрос: «А почему здесь используется именно термин «вейвлет» (wavelet - это слово можно перевести как «малень­ кая волна» или «всплеск»)?» Эта глава не содержит полного ответа на этот вопрос, но рис. 4.14 и 4.34 дают некоторое интуитивное объяснение.

4.1.Вычисление средних и полуразностей

4.1.Вычисление средних и полуразностей

Мы начнем с одномерного массива данных, состоящего из N элемен­ тов. В принципе, этими элементами могут быть соседние пикселы изображения или последовательные звуковые фрагменты. Для про­ стоты предположим, что число N равняется степени двойки. (Это будет предполагаться на протяжении всей главы, но в этом нет ограничения общности. Если длина N имеет другие делители, то можно просто удлинить массив, добавив в конце нули или повторив последний элемент нужное число раз. После декомпрессии, добавлен­ ные элементы просто удаляются.) Примером будет служить массив чисел (1,2,3,4,5,6, 7,8). Сначала вычислим четыре средние величи­ ны (1+2)/2 = 3/2, (3+4)/2 = 7/2, (5+6)/2 = 11/2 и (7+8)/2 = 15/2. Ясно, что знания этих четырех полусумм не достаточно для восста­ новления всего массива, поэтому мы еще вычислим четыре полураз­ ности (1 - 2)/2 = - 1 / 2 , (3 - 4)/2 - - 1 / 2 и (5 - 6)/2 = - 1 / 2 , ко­ торые будем называть коэффициентами деталей. Мы будем равно­ правно использовать термины «полуразность» и «деталь». Средние числа можно представлять себе крупномасштабным разрешением исходного образа, а детали необходимы для восстановления мелких подробностей или поправок. Если исходные данные коррелированы, то крупномасштабное разрешение повторит исходный образ, а детали будут малыми.

Массив (3/2,7/2,11/2,15/2, - 1/2, - 1/2, - 1/2, - 1/2), состоящий из четырех полусумм и четырех полуразностей, можно использовать для восстановления исходного массива чисел. Новый массив также состоит из восьми чисел, но его последние четыре компоненты, по­ луразности, имеют тенденцию уменьшаться, что хорошо для сжа­ тия. Воодушевленные этим обстоятельством, повторим нашу процедуру применительно к четырем первым (крупным) компонентам нашего нового массива. Они преобразуются в два средних и в две полураз­ ности. Остальные четыре компонента оставим без изменений. По­ лучим массив (10/4,26/4, - 4 / 4 , - 4 / 4 , - 1 / 2 , - 1 / 2 , - 1 / 2 , - 1/2) . Сле­ дующая и последняя итерация нашего процесса преобразует пер­ вые две компоненты этого массива в одно среднее (которое, на самом деле, равно среднему значению всех 8 элементов исходно­ го массива) и одну полуразность. В итоге получим массив чисел ( 3 6 / 8 , - 1 6 / 8 , - 4 / 4 , - 4 / 4 , - 1 / 2 , - 1 / 2 , - 1 / 2 , - 1 / 2 ) , который называ­ ется вейвлетным преобразованием Хаара исходного массива данных.

Из-за взятия полуразностей вейвлетное преобразование приво-

Глава 4- Вейвлетные методы

дит к уменьшению значений исходных пикселов, поэтому их будет легче сжать с помощью квантования и кодирования длинами серий (RLE), методом Хаффмана, или, быть может, иным подходящим способом (см. [Salomon 2000]). Сжатие с потерей части информа­ ции достигается, как обычно, с помощью квантования или простого удаления наименьших полуразностей (заменой их на нули).

Перед тем как двигаться дальше, интересно (и полезно) оценить сложность этого преобразования, то есть, число арифметических операций как функцию размера данных. В нашем примере требу­ ется 8 + 4 + 2 = 14 операций (сложений и вычитаний). Это число можно выразить как 14 = 2(8 — 1). В общем случае, пусть имеет­ ся iV = 2" элементов массива. На первой итерации потребуется 2^ операций, на второй - 2"~^ операций, и так далее до последней ите­ рации, в которой будет 2^~("~^) = 2^ операции. Значит, суммарное число операций равно

^

/

^

\

оп+1 _ 1

2{N-l).

^ 2 * -

^

2 4

- 1 =

- 1 = 2^+1-2 = 2(2^^ - 1) =

Таким образом, для совершения преобразования Хаара массива из N элементов потребуется совершить 2(АГ — 1) арифметических опе­ раций, то есть, сложность преобразования имеет порядок 0{N). Ре­ зультат просто замечательный.

Удобно с каждой итерацией процесса связать величину, называ­ емую ее разрешением^ которая равна числу оставшихся средних в конце итерации. Разрешение после каждой из трех описанных выше итераций равно 4(= 2^), 2{= 2^) и 1(= 2^). В § 4.2.1 показано, что каждую компоненту вейвлетного преобразования следует нормали­ зовать с помощью деления на квадратный корень из разрешения соответствующей итерации (это относится к ортонормированному преобразованию Хаара, которое также обсуждается в § 4.2.1). Итак, наш пример вейвлетного преобразования дает массив

/36/8 - 16/8 - 4 / 4 - 4 / 4 - 1 / 2 - 1 / 2 - 1 / 2 - 1 / 2 \

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

Две процедуры на рис. 4.1 иллюстрируют, как вычисляется нор­ мализованное веивлетное преобразование массива из п компонентов

4^. Вычисление средних и полуразностей 217]

(п равно степени 2). Обратное преобразование, которое восстанав­ ливает исходный массив, показано в двух процедурах на рис. 4.2.

procedure NWTcalc(a:array of real, n:int); comment: n - размер массива (степень 2) а:=а/д/п comment: разделить весь массив j:=n;

while j>2 do NWTstep(a, j ) ; J:=J/2;

endwhile;

end;

procedure

NWTstep(a:array of real, j : i n t ) ;

for i=l

to j / 2 do

Ь[1]: = (а[21-1]+а[21])/л/2; b[j/2+i] : = (а[21-1]-а[21])/л/2;

endfor;

a:=b; comment: переместить весь массив end;

Рис. 4.1. Вычисление нормализованного вейвлетного преобразования (псевдокод).

procedure NWTreconst(a:array of real, n:int); j:=2;

while j<n do NWTRstepCa, j ) ; j : = 2 j ; endwhile

а.:=а.у/п; comment: умножение всего массива end;

procedure

NWTRstepCa:array of real, j : i n t ) ;

for i=l

to j / 2 do

b [ 2 i - l ] : = (a[i]+a[j/2+i])/y2; b[2i] : = (a[i]-a[j/2+i])/>/2;

endfor;

a:=b; comment: переместить весь массив end;

Рис. 4.2. Обратное нормализованного вейвлетного преобразования (псевдокод).

Эти процедуры, на первый взгляд, отличаются от взятия сред­ них и полуразностей, которые обсуждались выше, поскольку проис­ ходит деление на \/2, а не на 2. Первая процедура начинается делени­ ем всего массива на у^ , а вторая делает обратное. Окончательный

Глава 4- Вейвлетные методы

результат, тем не менее, совпадает с массивом, указанным выше. Начиная с массива (1,2,3,4,5,6,7,8), получаем после трех итераций процедуры NWTcalc следующие массивы

_3

7

1]_ _15_ j-l_

-1_ j - ] _ - 1 \

7¥' 7¥' V¥' 7F' V¥' 7F' V¥' ЖЧ '

10

26

- 4

- 4

- 1

- 1

- 1

- 1 \

v^' v^' v^' v^' л/24' y^' v^' v^y '

/ 36

- 16 - 4

- 4

-\_

- 1

^

- 1 \

 

* "^* "^" ~^';;^';¥';^'TF;'

\ \ / 2 б ' х / 2 б ' л / 2 ' V

 

 

 

 

/36/8 - 16/8 - 4 / 4

•- 4 / 4

- 1 / 2

- 1 / 2

- 1 / 2 - l / 2 \

V V^' V^ ' "Ж' W

V^' VP^' "vi^' ~^f¥

J^.l.l. Обобщение на двумерный случай

Одномерное вейвлетное преобразование Хаара легко переносится на двумерный случай. Это обобщение весьма важно, поскольку пре­ образование будет применяться к изображениям, которые имеют два измерения. Здесь снова производится вычисление средних и по­ луразностей. Существует много обобщений этого преобразования. Все они обсуждаются в [Salomon, 2000]. Здесь мы остановимся на двух подходах, которые называются стандартное разлооюение и пи­ рамидальное разлооюение.

Стандартное разложение (рис. 4.3) начинается вычислением вейвлетных преобразований всех строк изображения. К каждой стро­ ке применяются все итерации процесса, до тех пора, пока самый левый элемент каждой строки не станет равен среднему значению чисел этой строки, а все остальные элементы будут равны взвешен­ ным разностям. Получится образ, в первом столбце которого сто­ ит среднее столбцов исходного образа. После этого стандартный алгоритм производит вейвлетное преобразование каждого столбца. В результате получится двумерный массив, в котором самый левый верхний угловой элемент равен среднему всего исходного массива. Остальные элементы верхней строки будут равны средним взвешен­ ным разностям, ниже стоят разности средних, а все остальные пик­ селы преобразуются в соответствующие разности.

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

4.L Вычисление средних и полуразностей

действие производит средние в левой половине матрицы и полураз­ ности - в правой половине. На втором шаге вычисляются полусуммы и полуразности для всех столбцов получившейся матрицы.

procedure StdCalc(a:array of real, n:int); comment: массив размера nxn (n = степень 2) for r=l to n do NWTcalc(row r of a, n); endfor;

for c=n to 1 do comment: обратный цикл NWTcalcCcol с of a, n);

endfor;

end;

procedure StdReconst(a:array of real, n:int); for c=n to 1 do comment: обратный цикл

NWTreconstCcol с of a, n); endfor;

for r=l to n do NWTreconst(row r of a, n);

endfor;

end;

Исходный

образ

1

LI HI — - L2 H2 HI »• w SH2 HI

Рис. 4.3. Стандартное вейвлетное разложение.