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

1 / Salmon_sjatie_dannyh_izobrajeniy_i_zvuka[torrents.ru]

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

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

3.5.3. Дискретное

косинус-преобразование

Прежде всего мы рассмотрим одномерное (векторное)

преобразо­

вание DCT (в приложениях

используется двумерное

(матричное)

косинус-преобразование, но векторное DCT проще понять, и оно основано на тех же принципах). На рис. 3.20 показано восемь волн косинуса, w[f) = cos(/^), при О < ^ < тг, с частотами / = 0 , 1 , . . . , 7.

На каждом графике отмечено восемь значений функции w(f)

с абс­

циссами

 

7Г ЗТГ бтг ТТГ 97Г ИТГ 137Г 157Г

 

"" 16'Тб'Тб' 1^'1^'Тб~'Тб'''1б''

^ ' ^

которые формируют базисный вектор v/. В результате получится восемь векторов vy, / == 0 , 1 , . . . , 7 (всего 64 числа), которые пред­ ставлены в табл. 3.21. Они служат базисом одномерного косинуспреобразования. Отметим схожесть этой таблицы с матрицей W из уравнения (3.5). В обоих случаях частота смены знаков возрастает по строкам.

dct[pw_] : =Plot[Cos[pw t] , {t,0,Pi}, DisplayFunction->Identity, AspectRatio->Automatic] ;

dcdot [pw_]:=ListPlot[Table[{t,Cos[pw t]},{t,Pi/16,15Pi/16,Pi/8}], DisplayFunction-> Identity]

Show [dct [0] , dcdot [0] » Prolog->AbsolutePointSize[4] , DisplayFunction->$DisplayFunction]

Show [dct [7] , dcdot [7] , Prolog->AbsolutePointSize[4] ,

DisplayFunction->$DisplayFunction]

Программа для вычисления рис. 3.20 (Matematica).

Можно показать, что все векторы v^ ортогональны между со­ бой (из-за специального выбора восьми точек отсчета в). То же самое можно обнаружить прямым вычислением с помощью подхо­ дящей математической программы. Значит, эти восемь векторов можно поместить в матрицу размером 8 х 8 и рассмотреть соот­ ветствующее ей ортогональное преобразование - вращение в вось­ мимерном пространстве, которое называется одномерным дискрет­ ным косинус-преобразованием (DCT). Двумерное DCT можно так­ же интерпретировать как двойное вращение. Это преобразование будет обсуждаться на стр. 155.

Одномерное DCT имеет также другую интерпретацию. Мож­ но рассмотреть векторное пространство, базисом которого служат

3.5. Преобразование изображений 151

векторы Vj, и выразить любой вектор р этого пространства в виде линейной комбинации векторов Vj.

Рис. 3.20. Вычисление одномерного DCT.

Например, выберем 8 (коррелированных) чисел р = (0.6,0.5,0.4, 0.5,0.6,0.5,0.4,0.55) в качестве тестовых данных. Выразим вектор р в виде суммы р = Х1г '^i^i ВОСЬМИ векторов Vj. Решив эту систему

из 8 линейных уравнений, находим восемь весов

 

WQ = 0.506,

wi = 0.0143,

W2 = 0.0115,

W3 = 0.0439,

W4 = 0.0795,

W5 = -0.0432,

г^е = 0.00478,

wr = -0.0077.

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

Вес WQ не сильно отличается от элементов вектора р, но остальные семь весов гораздо меньше. Это показывает, как DCT (или любое другое ортогональное преобразование) производит сжатие. Теперь можно просто записать эти восемь весов в сжатый файл, где они будут занимать меньше места, чем восемь компонентов исходного вектора р. Квантование весов wi может суш;ественно повысить фак­ тор сжатия, причем при весьма малой потере данных.

е

0.196

0.589

0.982

1.374

1.767

2.160

2.553

2.945

cos 06»

1.

1.

1.

1.

1.

1.

1.

1.

cosl^

0.981

0.831

0.556

0.195

-0.195

-0.556

-0.831

-0.981

cos26>

0.924

0.383

-0.383

-0.924

-0.924

-0.383

0.383

0.924

cos3^

0.831

-0.195

-0.981

-0.556

0.556

0.981

0.195

-0.831

cos 4^

0.707

-0.707

-0.707

0.707

0.707

-0.707

-0.707

0.707

cos 5^

0.556

-0.981

0.195

0.831

-0.831

-0.195

0.981

-0.556

cos 6^

0.383

-0.924

0.924

-0.383

-0.383

0.924

-0.924

0.383

cos 7^

0.195

-0.556

0.831

-0.981

0.981

-0.831

0.556

-0.195

Table[N[t],{t,Pi/16,15Pi/16,Pi/8}]

dctp [pw_]:=Table[N[Cos[pw t]],{t,Pi/16,15Pi/16,Pi/8}] dctp[0]

dctpCl]

dctp[7]

Табл. 3.21. Вычисление одномерного DCT.

Рис. 3.22 иллюстрирует эту линейную комбинацию графически. Все восемь векторов v^ показаны в виде ряда из восьми маленьких серых квадратиков, причем значение +1 представлено белым цве­ том, а значение —1 окрашено в черный цвет. Каждый из восьми компонентов вектора р выражен в виде взвешенной суммы восьми серых оттенков.

На практике одномерное DCT прош;е всего вычислять по фор­ муле

G,

=

1 ^ л

/ ( 2 i + l ) / 7 r

,

(3.7)

i c , X : P . c o s

A f i

Z

^

 

 

 

t=o

 

 

 

 

 

гдеС7/ =

|

^'

-J^JJ'

п р и /

=

0,1, ... ,7 .

 

Здесь исходными данными (пикселами, фрагментами звука или дру­ гими элементами) являются величины р^? а им соответствующими

3.5. Преобразование изобраоюений

коэффициентами DCT служат числа Gf. Формула (3.7) очень про­ ста, но процесс вычисления по ней медленный (в § 3.7.3 обсуждается ускоренный метод вычисления DCT). Декодер получает на входе ко­ эффициенты DCT, делит их на восьмерки и применяет к ним обрат­ ное преобразование DCT (inverse DCT, ГОСТ) для восстановления исходных данных (тоже в виде групп по 8 элементов). Простейшая формула для вычисления ГОСТ имеет вид

1 ^

f (2t + l)i7r

при t = о, 1, ... , 7.

(3.8)

Pt = i^J2^J^J^^^\

16

 

 

 

1 '

\ ^1 1 I

^rn1 Vo

0.506

 

0.0115

 

ЯНВНВ: V2

0.0439

 

••••••

0.0143

 

•••H ••

0.0795

 

-0.0432

h - :, ••

••

t^'J

0.00478

 

 

-0.0077

 

 

 

 

Рис. 3.22. Графическое представление одномерного DCT.

Следующий пример демонстрирует достоинства метода DCT. Рассмотрим множество, состоящее из 8 величин (исходных данных) р (12,10,8,10,12,10,8,11), применим к ним DCT и получим во­ семь коэффициентов

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

28.6375, 0.571202, 0.46194, 1.757, 3.18198, -1.72956, 0.191342, -0.308709.

Эти числа можно использовать для точного восстановления исход­ ных данных (с маленькой ошибкой, вызванной ограничением на точ­ ность компьютерных вычислений). Наша цель, однако, улучшить сжатие с помош;ью подходящего квантования коэффициентов. Округ­ ляем (квантуем) их до 28.6,0.6,0.5,1.8,3.2, —1.8,0.2, —0.3, применяем IDTC и получаем

12.0254,10.0233,7.96054,9.93097,12.0164,9.99321,7.94354,10.9989.

Еще раз квантуем коэффициенты: 28,1,1,2,3, —2,0,0 и опять полу­ чаем с помощью ГОСТ следующий результат:

12.1883,10.2315,7.74931,9.20863,11.7876,9.54549, 7.82865,10.6557.

Наконец, квантуем коэффициенты до 28,0,0,2,3, —2,0,0 и получаем с помощью ГОСТ последовательность

11.236,9.62443, 7.66286,9.57302,12.3471,10.0146,8.05304,10.6842,

в которой наибольшая разность между исходным значением (12) и реконструированным (11.236) равна 0.764 (или 6.4% от 12). Про­ грамма вычисления для системы Matematica приведена на рис. 3.23.

р={12.,10.,8.,10.,12.,10.,8.,11.};

 

с={.7071,1,1.1,1,1,1,1};

 

 

dct[i_] : = (c[[i+l]]/2)Sum[p[[t+l]]Cos[(2t+l)i

Pi/16] ,{t,0,7}] ;

q=Table[dct[i],{i,0,7}]

(*

use precise DOT coefficients *)

q={28,0,0,2,3,-2,0,0};

(*

or use quantized DOT coefficients *)

idct[t_]: = (l/2)Sum[c[[j+l]]q[[j+l]]Cos[(2t+l)j

Pi/16] ,{j ,0,7}] ;

ip=Table[idct[t],{t,0,7}]

 

 

Рис. 3.23. Эксперименты с одномерным DCT.

Эти простые примеры показывают достоинства метода DCT. Множество 28,0,0,2,3,-2,0,0 грубо квантованных коэффициентов DCT обладает четырьмя свойствами, которые делают его идеаль­ ным для сжатия, причем с замечательной декомпрессией при малой потери данных. Вот эти четыре свойства: (1) множество состоит только из целых чисел, (2) только четыре из них не равны нулю,

(3) нулевые коэффициенты образуют серии, (4) среди ненулевых ко­ эффициентов только первый имеет большую величину; остальные меньше исходных чисел. Эти свойства можно использовать при ре­ ализации схемы RLE, метода Хаффмана или любой другой техники (см. § 3.7.4 и 3.7.5) для дальнейшего сжатия этого множества.

3.5. Преобразование изобраэюений

Пример: Одномерное DCT (уравнение (3.7)) восьми коррели­ рованных величин И, 22,33,44,55, 66,77 и 88 произведет восемь ко­ эффициентов 140,—71,0,—7,0,-2,0,0. После квантования получаем множество 140,-71,0,0,0,0,0,0 и применяем IDCT. В результате: 15,20,30,43,56, 69, 79 и 84. Эти числа весьма близки к исходным; наибольшее расхождение равно 4. На рис. 3.24 дана программа для этого примера.

ClearCPixl, G, Gq, RecP];

Cr[i_]:=lf[i==0, Sqrt[2]/2, 1];

DCT[i_]:={(l/2)Cr[i]Sum[Pixl[[x+l]]Cos[(2x+l)i Pi/16], {x,0,7,1}]}; IDCT[x_]:={(l/2)Smn[Cr[i]Gq[[i+l]]Cos[(2x+l)i Pi/16], {i,0,7,1}]}; Pixl={ll,22,33,44,55,66,77,88};

G=Table[SetAccuracy[N[DCT[m]],0], {m,0,7}] Gq={l40.,-71,.0,0,0,0,0,0}; RecP=Table[SetAccuracy[N[IDCT[m]] ,0] , {in,0,7}]

Рис. 3.24. Пример одномерного DCT (Matematica).

Дойдя до этого места, воодушевленный читатель может восклик­ нуть: «Удивительно! Восемь исходных данных восстанавливаются всего с помощью двух чисел. Чудеса какие-то!» Однако, те, кто поняли свойства преобразований, могут дать простое объяснение. Восстановление данные происходит не только по двум числам 140 и —71, но также по их положению в последовательности из 8 коэф­ фициентов. Кроме того, исходные величины восстанавливаются с высокой точностью благодаря присутствию избыточности.

Предельным случаем избыточных данных служит последователь­ ность одинаковых величин. Они, конечно, имеют совершенную кор­ реляцию, и мы чувствуем интуитивно, что одного числа будет до­ статочно для полного их восстановления. Реконструкция последо­ вательности высоко коррелированных данных, такой, как 20, 31, 42, 53, ... потребует всего двух чисел. Ими могут быть начальное значение (20) и шаг (11) (разность этой арифметической прогрес­ сии), но могут быть и другие числа. В обш;ем случае, чем меньше коррелированы данные, тем больше чисел потребуется для их вос­ становления.

Двумерное (матричное) DCT: Из опыта хорошо известно, что пикселы изображения имеют корреляцию по двум направлени­ ям, а не только по одному (пикселы коррелируют со своими соседями слева, справа, а также сверху и снизу). Поэтому методы сжатия изо­ бражений используют двумерное DCT, которое задается формулой

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

1 ^ ^ V ^ ^ ^

f(2y + l)J7r\

/(2ж-Ы)г7г\

(3.9) при о < i,j < п — 1. Изображение разбивается на блоки пикселов Рху размера п х п {в нашем примере п = 8), и уравнения (3.9) ис­ пользуются для нахождения коэффициентов Gij для каждого бло­ ка пикселов. Если допускается частичная потеря информации, то коэффициенты квантуются. Декодер восстанавливает сжатый блок данных (точно или приближенно), вычисляя обратное DCT (IDCT) по формуле

^V-V^r-^^

/(2у + Ш7г\

f(2x + l)i7r\

Рху

 

 

 

 

г=0 j=0

 

 

 

 

где С/

/

7 2 '

/

= 0'

 

\

1,

/ > 0 .

Двумерное DCT можно интерпретировать двумя способами: с по­ мощью вращения (на самом деле, композиции двух вращений), и с помощью базиса в п-мерном векторном пространстве. В первой ин­ терпретации используется блок п х п пикселов (рис. 3.25а, где эле­ менты обозначены буквой «L»). Сначала рассматриваются строки этого блока как точки (рж,о^Рж,ь • • • ?Px,n-i) в п-мерном простран­ стве, которые поворачиваются в этом пространстве с помощью пре­ образования, задаваемого внутренней суммой

у=0

^

^

из уравнения (3.9). Результатом этого вращения служит блок Glxj из п X п коэффициентов, в котором в строках доминируют первые элементы (обозначенные как «L» на рис. 3.25Ь), а все остальные эле­ менты малы (они обозначены на этом рисунке как «S»). Внешняя сумма из уравнения (3.9) равна

п

1 ^ V ^

^1

/ ( 2 ^ + 1 ) п г \

Gij = -j==Ci2_^Pa:yGl:,jCOS I

1 .

х=0

3.5. Преобразование изображений

Здесь уже столбцы матрицы Glxj рассматриваются в качестве то­ чек п-мерного векторного пространства, над которыми совершает­ ся преобразование вращения. В результате получается один боль­ шой коэффициент в верхнем левом углу блока (на рис.3.25с - это «L») и п^ — 1 маленьких коэффициентов в остальных местах («S» и «s» на рисунке). Эта интерпретация рассматривает двумерное DTC в виде двух разных вращений размерности п. Интересно отметить, что два вращения размерности п вычисляются быстрее, чем одно вращение размерности п^, поскольку второе требует матрицу раз­

мера 71^ X П^.

L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L

(a)

L S S S S S S S

L S S S S S S S

L S S S S S S S

S s s s s s s s

L S S S S S S S

S s s s s s s s

L S S S S S S S

S s s s s s s s

L S S S S S S S

S s s s s s s s

L S S S S S S S

S s s s s s s s

L S S S S S S S

S s s s s s s s

L S S S S S S S

S s s s s s s s

(b)

(c)

Рис. 3.25. Двумерное DCT и двойное вращение.

Вторая интерпретация (при п = S) использует уравнение (3.9) для создания 64 блоков по 8 х 8 величин в каждом. Все 64 блока рас­ сматриваются в качестве базиса 64-мерного векторного простран­ ства (это базисные изображения). Любой блок Б из 8 х 8 пикселов можно выразить как линейную комбинацию этих базисных изобра­ жений, и все 64 веса этой линейной комбинации образуют коэффи­ циенты DCT блока В.

На рис. 3.26 показано графическое представление 64 базисных образов двумерного DCT при п = 8. Каждый элемент (г, j) на этом рисунке является блоком размера 8 x 8 , который получен произве­ дением cos{i • s) cos(j t), где s и t - меняются независимо в преде­ лах, указанных в уравнении (3.6). Этот рисунок легко построить с помощью программы, приведенной на стр. 159. Там же приведе­ на модифицированная программа из [Watson 94], требующая пакет Graphicslmage.m, который не очень распространен.

Используя подходящее программное обеспечение, легко выпол­ нить вычисление DCT и отобразить результаты графически. На рис. 3.29а приведена случайная матрица 8 х 8 из нулей и единиц. Эта матрица изображена на рис. 3.29Ь с помощью белых и черных квадратиков, обозначающих 1 и О, соответственно. На рис. 3.29с

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

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

Рис. 3.26. 64 базисных изображения двумерного DCT.

На ЭТОМ рисунке нуль показан нейтрально-серым цветом, поло­ жительные числа - светло-серым, а отрицательные - темным. На рис. 3.29d даны численные значения этих весов. Приведена также программа для построения всех этих графиков. На рис. 3.30 сдела­ ны те же самые построения, но применительно к более регулярным исходным данным.

Теперь продемонстрируем достоинства двумерного DCT приме­ нительно к двум блокам чисел. Первый блок (табл. 3.27, слева) со­ стоит из сильно коррелированных целых чисел в интервале [8,12], а второй (табл. 3.28, слева) образован случайными числами из того же интервала. Первый блок порождает один большой коэффициент DC, за которым следуют маленькие (включая 20 нулевых) коэффициен-

3.5. Преобразование изображений 159)

тов АС. А среди коэффициентов DCT второго, случайного, блока имеется всего один нуль.

d c tp [f S-,ft_] :=Table[SetAccuracy[N[(1.-Cos[fs s]Cos [ft

t ] ) / 2 ] , 3 ] ,

{ s , P i / 1 6 , 1 5 P i / 1 6 , P i / 8 } , { t , P i / 1 6 , 1 5 P i / 1 6 , P i / 8 } ] / / T a b l e F o r m

d c t p [ 0 , 0 ]

 

d c t p [ 7 , 7 ]

 

Программа для рис. 3.26 (Matematica)

 

Needs[»GraphicsImage'»] (* Draws 2D DCT C o e f f i c i e n t s

*)

D C T M a t r i x = T a b l e [ I f [ k = = 0 , S q r t [ l / 8 ] , S q r t [ l / 4 ] C o s [ P i ( 2 j + l ) k / 1 6 ] ] , { k , 0 , 7 } , { j , 0 , 7 } ] //N;

DCTTensor=Array[Outer[Times, DCTMatrix[[#1]],DCTMatrix[[#2]]]&, { 8 , 8 } ] ;

Show[GraphicsArray[Map[Graphicslmage[#, {-.25,.25}]&, DCTTensor,{2}]]]

Альтернативная программа для рис. 3.26

(Видно, почему пикселы в табл. 3.27 коррелированы. Все восемь чисел верхней строки таблицы близки друг к другу (расстояния между ними равны 2 или 3). Все остальные строки получаются цик­ лическим сдвигом вправо предыдущей строки.)

12 10

8 10 12 10

8 11

81

 

0

0

0

0

0

0

0

11 12 10

8 10 12 10

8

0

 

1.57

0.61

1.90

0.38 -1.81

 

0.20 -0.32

8 11 12 10

8 10 12 10

0 -0.61

0.71

0.35

0

0.07

0

0.02

10

8 11 12 10

8 10 12

0

 

1.90 -0.35

4.76

0.77 -3.39

0.25 -0.54

12 10

8 11 12 10

8 10

0

-0.38

0 -0.77

8.00

0.51

 

0

0.07

10 12 10

8 11 12 10

8

0

-1.81 -0.07 -3.39 -0.51

1.57

0.56

0.25

8 10 12 10

8 11 12 10

0

-0.20

0 -0.25

0 -0.56

-0.71

0.29

10

8 10 12 10

8 11 12

0 -0.32 -0.02 -0.54 -0.07

0.25

-0.29 -0.90

 

Табл. 3.27. Двумерное DCT блока коррелированных величин.

 

8 10

9 11 11

9

9 12

79.12

0.98

0.64

-1.51

-0.62

-0.86

1.22

0.32

11

8 12

8 11 10 11 10

0.115 -1.64

-0.09

1.23

0.10

3.29

1.08

-2.97

9 11

9 10 12

9

9

8

-1.2626 -0.29

-3.27

1.69

-0.51

1.13

1.52

1.33

9 12 10

8

8

9

8

9

-1.27

0.25

-0.67

-0.15

1.63

-1.94

0.47

-1.30

12

8

9

9 12 10

8 11

-2.12

0.67

-0.07

-0.79

0.13

-1.40

0.16

-0.15

8 11 10 12

9 12 12 10

-2.68

1.08

-1.99

-1.93

-1.77

-0.35

О -0.80

10 10 12 10 12 10 10 12

1.20

2.10

-0.98

0.87

-1.55

-0.59

-0.98

2.76

12

9 11 11

9

8

8 12

-2.24 0.55 0.29 0.75

-2.40

-0.05

0.06

1.14

 

 

Табл. 3.28.

Двумерное DCT блока случайных величин.

 

Соседние файлы в папке 1