Коэффициент сжатия изображений jpeg 4 1. Сжатие изображений: JPEG и JPEG2000. JPEG-сжатие цифрового изображения

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

Однако нередко в инженерных приложениях возникает и задача определения законов распределения функции с. в. Обычно это требуется при определении вероятности попадания этих функций в различные области их возможных значений.

В этом пункте мы будем решать следующую задачу. Имеется непрерывная с. в. Хс плотностью/(х); с. в. Твыражается через с. в. X функциональной зависимостью

Требуется найти закон распределения с. в. Y

Рассмотрим сперва случай, когда функция ср (А) строго монотонна, непрерывна и дифференцируема в интервале (а , Ь) всех возможных значений с. в. X Функция распределения G (у) с. в. ^определяется по формуле

Если функция ф (х) монотонно возрастает на всем участке возможных значений с. в. ^(рис. 9.1.1), то событие {Т{Х ф (у)}, где г (у) = х есть функция, обратная функции

Дифференцируя это выражение по величине у, входящей в верхний предел интеграла, получим п. р. случайной величины Y :

Если функция ср (х) на участке (а, Ь) возможных значений с. в. X монотонно убывает (рис. 9.1.2), то событие {Т |/ (у)}. Следовательно,

Рис. 9.1.1

Дифференцируя С (у) по переменной у, входящей в нижний предел, получим п. р. случайной величины Y:

Так как плотность не может быть отрицательной, то формулы (9.1.4) и (9.1.6) можно объединить в одну:

1 В формулах (9.1.3) и (9.1.5) диапазон возможных значений с. в. Сможет быть (- ао, оо), т. е. а = - оо; Ь - оо то возможные значения У- ф (А) определяются из выражения у,- - ф (х;) (/= 1,2,..., п) при этом имеет место равенство

Задача 1. Закон распределения линейной функции одного случайного аргумента. Частным случаем монотонной функции является линейная функция у = ах + Ь, где а, b - неслучайные величины. Пусть Уесть линейная функция непрерывной с. в. Хс плотностью/(х):


Найдем, пользуясь формулой (9.1.7), плотность распределения g (у) случайной величины У. В данном случае обратная функция ф (у) = (у - Ь)/а; ее производная ф" (у) = 1 модуль производной 1/|я|. Формула (9.1.7) дает

Пример 1. Случайная величина X распределена по показательному закону

Случайная величина Улинейно выражается через X:

Если с. в. ЛГдискретна и имеет ряд распределения

Решение. В данном случае обратная функция ф (у) = (2 - у)/3. Условие х > 0 в формуле (*) для у переходит в условие у = 2 - Зх

График плотности g (у) показан на рис. 9.1.3.

Пример 2. Найти п. р. линейной функции Y= аХ+ b нормально распределенного аргумента X с характеристиками т х и о*.

Решение. По формуле (9.1.7) имеем

а это есть нормальный закон с характеристиками т у = ат х + b , D y = = а 2 о 2 х; а у = а о х. Таким образом, в результате линейного преобразования нормально распределенной с. в. X получаем с. в. Y, также распределенную по нормальному закону. ?

Пример 3. Непрерывная с. в. X распределена по закону Коши в простейшем (каноническом) виде:

с. в. Тсвязана с ней зависимостью:

Найти плотность распределения с. в. Y.

Решение. Так как функция у = 1 - х 2 монотонна (монотонно убывает) на всем участке (-оо, оо), применим формулу (9.1.7). Решение оформим в виде двух столбцов; в левом будут помешены обозначения функций, принятые в общем решении задачи; в первом - конкретные функции, соответствующие данному примеру.


Пример 4. С. в. X распределена по тому же закону Коши/(х) = = 1/[я (1 + х 2)]; с. в. Тесть величина, обратная X:

Найти ее плотность g (у).

Решение. График функции у = 1/х показан на рис. 9.1.4. Эта функция терпит разрыв второго рода (перескакивает с - оо на + оо) при х = 0; но обратная функция х = 1 однозначна, поэтому можно применять ту же формулу (9.1.7), которая выведена для монотонной функции. Решение снова оформим в виде двух столбцов (слева - общий, справа - частный случай):


т. е. обратная величина Y = 1/Х тоже, как и X, имеет распределение Коши. ?

Пример 5. Скорость соударения молекул X распределена по закону Релея с параметром о;

Количество выделяемой энергии Y при соударении молекул определяется по формуле

Найти п. р. с. в. Y.

Решение. При х > О функция (X) монотонна. Решение примера снова располагаем в виде двух столбцов (слева общий случай, справа - частный конкретный случай):


Пример 6. Радиус круга X распределен по закону Релея с параметром а:

Найти закон распределения с. в. Y- площади круга.

Решение. С. в. Y = пХ 2 -функция монотонная при X > 0 у (у) =

= (^/л) 1/2 ; k"OOl=-т=, откуда 2 у}пу

следовательно, с. в. Уимеет показательный закон распределения с па- 1

раметром--. ?

2ко г

Пример 7. Через точку а , лежащую на оси Ор, проводится прямая ab под углом Хк оси Ор (см. рис. 9.1.5). Угол ^распределен равномерно

в интервале + yj. ^ а ^ ти закон распределения с. в. У- абсциссы точки пересечения прямой ab с осью 0%.


Пример 8. Напряжение ^распределено по нормальному закону с параметрами т х, ст х; стабилизируемое напряжение У определяется по формуле

У Решение. С. в. У- смешанная:

где Ф (X) - функция Лапласа. Функция распределения с.в. У имеет вид:


На рис. 9.1.6 показан график G (у). В общем случае, если функция распределения с. в. Хесть F(x), то


Пример 9. Стабилизатор напряжения работает таким образом, что ограничивает напряжение сверху:

Найти функцию распределения с. в. У , если задана функция распределения с. в. X - F(x).

Решение. По аналогии с решением предыдущего примера получаем

Пример 10. Стабилизатор напряжения X работает таким образом, что ограничивает напряжение снизу:


Найти функцию распределения с. в. Y, если задана F(x) - функция распределения с. в. X.

Решение. В соответствии с решением примера 8 получаем

Рассмотрим теперь случай, когда функция у - а, Ь) возможных значений с. в. не монотонна (рис. 9.1.7). В этом случае обратная функция х = |/ (у) неоднозначна.



Число значений обратной функции ц/ (у) зависит от того, какое значение у мы взяли; обозначим эти значения |/i (у), |/2 (у), ..., ф, (у), ... . Событие Y равносильно попаданию с. в. X в один из неперекры- вающихся отрезков, отмеченных жирной линией на рис. 9.1.7, где соответствующая часть кривой у = ф (х) лежит ниже прямой у; в нашем случае эти отрезки будут: от а до i x (у); от ц/ 2 (у) Д° Фз (у), от v|/ 4 (у) до |/ 5 (у) ит. д.; последний отрезок может кончаться точкой Ь, а может и одной из точек у, (у) (это несущественно). Попадания точки Хв эти отрезки - события несовместные; по правилу сложения вероятностей

Учитывая правило дифференцирования интеграла по переменной, входящей в его пределы (а именно: производная интеграла по такой переменной равна значению подынтегральной функции от верхнего предела, умноженному на производную верхнего предела минус значение подынтегральной функции от нижнего предела, умноженное на производную нижнего предела), получим в нашем случае:


В тех точках, где ср (х), пересекая прямую у, убывает (начало соответствующего участка оси абсцисс, для которого Y производная у" (у) отрицательна; она же входит в сумму (9.1.11) со знаком минус; в тех точках, где ф (х) возрастает, ф" (у) (конец участка) она имеет знак плюс. Производные постоянных а и b равны нулю, поэтому безразлично, фигурируют ли точки а и b в виде начала или конца какого-либо участка. Все члены в формуле (9.1.11) положительны, и она принимает очень простой вид:

где к - число значений обратной функции, соответствующее данному у, ф! (у); ф 2 (у);...; ф^ (у) - значения обратной функции, соответствующие данному у.

Задача 2. Закон распределения модуля случай- нойвеличины. Задача ставится следующим образом: дана непрерывная с. в. плотностью/(х) на участке (- оо, + оо); случайная величина Ксвязана с ней соотношением:

Найти плотность распределения с. в. Y.

Решение. Функция у = |х| не монотонна; ее график показан на рис. 9.1.8. Обратная функция при данном у имеет два значения: ?i (у) = - у; Фг (у) = У- По формуле (9.1.12) получим:

(отрицательной случайная величина Y быть не может). В частности, если плотность/(х) симметрична относительно начала координат, т. е. /(-х) =/(х), формула (9.1.13) даст:

Задача 3. Закон распределения квадрата случайной величины. Пусть непрерывная с. в. X имеет плотность /(х); найти плотность распределения ее квадрата.

Решение. Функция у = х 2 не монотонна (рис. 9.1.9); ф, (у) = -у[у ;

у 2 (у) = 4у-

Формула (9.1.12) дает

В частном случае, когда с. в. X имеет нормальное распределение

с параметрами т х = 0; а х = 1; / (х) = е~ х ^/л/2л, с. в. Уимеет распределение

Кривая этого распределения показана на рис. 9.1.10. ?


Рис. 9.1.9

До сих пор мы рассматривали только случай, когда аргумент функции Y= ф (X) - непрерывная случайная величина. Теперь рассмотрим более простой по существу, но более сложный в записи случай, когда аргумент X - дискретная с. в. с рядом распределения:

Некое «подобие» ряда распределения с. в. Рдаст таблица:

ф te)

Чтобы сделать из нее ряд распределения, нужно, во-первых, расположить значения, стоящие в верхней строке, в порядке возрастания, а, во-вторых, объединить те из них, которые окажутся равными (в силу неоднозначности обратной функции), и сложить соответствующие вероятности. Полученный таким образом ряд и будет рядом распределения с. в. Y.

Пример 11. Дискретная с. в. X имеет ряд распределения:

Построить ряд распределения ее квадрата

Решение. «Неупорядоченный» ряд распределения имеет вид:

Расположим значения с. в. Y в порядке возрастания, объединим равные и сложим их вероятности; получим ряд распределения с. в. Y

Пример 12. Число ^неисправностей на участке высоковольтной линии в течение года имеет распределение Пуассона с параметром а. Общий материальный ущерб от этих неисправностей пропорционален квадрату их числа:

где с > 0 - неслучайная величина. Найти закон распределения этого ущерба.

Решение. Ряд распределения X имеет вид:

Так как значения Y возрастают вместе со значениями X и среди них нет совпадающих (обратная функция на участке 0, 1, т, ... однозначна), то ряд распределения Тимеет вид:


16.1. Закон распределения функции одного случайного аргумента.

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

Имеется непрерывная случайная величина X с плотностью рас­пределения f (x ) . Другая случайная величина Y связана с нею функ­циональной зависимостью: .

Требуется найти плотность распределения величины Y . Рассмотрим участок оси абсцисс, на котором лежат все возможные значения величины X , т. е. .

Способ решения поставленной задачи зависит от поведения функ­ции на участке: является ли она монотонной или нет.

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

1. Функция на участке монотонно возрастает (рис. 6.1.1). Когда величина X принимает различные значения на

участке, случайная точка (X , Y ) перемещается только по кривой; ордината этой случайной точки полностью опре­деляется ее абсциссой.

Обозначим плотность распределения величины Y . Для того чтобы определить, найдем сначала функцию распределения величины Y : .

Проведем прямую АВ , парал­лельную оси абсцисс на расстоянии y от нее(рис. 6.1.1). Чтобы выполнялось условие, случайная точка (X , Y ) должна попасть на тот участок кривой, который лежит ниже прямой АВ ; для этого необходимо и достаточно, чтобы случайная величина X попала на участок оси абсцисс от a до x , где x - абсцисса точки пересечения кривой и прямой АВ . Следовательно,

(6.1.1) Так, как монотонная на участке, то существует обратная однозначная функция. Тогда

(6.1.2) Дифференцируя интеграл (6.1.2) по переменной у , входящей в верх­ний предел, получим:

(6.1.3) 2. Функция на участке монотонно убывает (рис. 6.1.2). В этом случае

(6.1.4) откуда

(6.1.5) Сравнивая формулы (6.1.3) и (6.1.5), замечаем, что они могут быть объединены в одну:

(6.1.6)

Действительно, когда возрастает, ее производная (а значит, и) положительна. При убывающей функции производная отрица­тельна, но зато перед ней в формуле (6.1.5) стоит минус. Следо­вательно, формула (6.1.6), в которой производная берется по модулю, верна в обоих случаях.

3. Рассмотрим случай когда функция на участке возможных значений аргумента не монотонна (рис. 6.1.3).

Найдем функцию распределения G (y ) величины Y . Для этого снова проведем прямую АВ , параллельную оси абсцисс, на расстоянии у от нее и выделим те участки кривой, на которых выпол­няется условие. Пусть этим участкам соответствуют участки оси абсцисс: .

Событие равносильно попаданию случайной величины X на один из участков - безразлично, на какой именно. Поэтому

(6.1.7) Таким образом, для функции распределения величины имеем формулу:

(6.1.8) Границы интервалов зависят от у и при заданном конкрет­ном виде функции могут быть выражены как явные функ­ции у . Дифференцируя G (y ) по величине у , входящей в пределы интегралов, получим плотность распределения величины Y :

(6.1.9) Пример . Величина X подчинена закону равномерной плотности на участке отдо.

Найти закон распределения величины.

Решение. Строим график функции (рис. 6.1.4). Очевидно, и в интервале функция немонотонна. Применяя формулу (6.1.8), имеем:

Выразим пределы и через у : ; . Тогда

.(6.1.10) Чтобы найти плотность g (у ) продифференцируем это выражение по переменной у , входящей в пределы интегралов, получим:

Имея в виду, что , получим:

(6.1.11) Указывая для Y закон распределения (6.1.11), следует оговорить, что он действителен лишь в пределах от 0 до 1, т.е. в тех пределах, в которых изменяется при аргументе X , заключенном в интервале от, до. Вне этих пределов плотность g (у )равна нулю.

График функции g (у ) дан на рис.6.1.5. При у =1 кривая g (у) имеет ветвь, уходящую на бесконечность.

26.2. Закон распределения функции двух случайных величин.

Изложим общий метод решения задачи для наиболее простого случая функции двух аргументов.

Имеется система двух непрерывных случайных ве­личин (X , Y ) с плотностью распределения f (x , y ) . Слу­чайная величина Z связана с X и Y функциональной зависимостью:

Требуется найти закон распределения величины Z.

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

Найдем функцию распределения величины Z:

(6.2.1) Проведем плоскость Q, параллельную плоскости хОу , на расстоя­нии z от нее. Эта плоскость пересечет поверхность по некоторой кривой К . Спроектируем кривую К на плоскость хОу . Эта проекция, уравнение которой, разделит плоскость хОу на две области; для одной из них высота поверхности над пло­скостью хОу будет меньше, а для другой - больше z . Обозначим D ту область, для которой эта высота меньше z . Чтобы выполнялось неравенство (6.2.1), случайная точка (X , Y ) очевидно, должна по­пасть в область D ; следовательно,

(6.2.2) В выражение (6.2.2) величина z входит неявно, через пределы интегрирования.

Дифференцируя G (z ) по z , получим плотность распределения величины Z :

(6.2.3) Зная конкретный вид функции, можно выразить пре­делы интегрирования через z и написать выражение g (z ) в явном виде.

36.3. Закон распределения суммы двух случайных величин. Композиция законов распределения.

Воспользуемся изложенным выше общим методом для решения одной задачи, а именно для нахождения закона распределения суммы двух случайных величин. Имеется система двух случайных величин (X , Y ) с плотностью распределения f (x , у ) . Рассмотрим сумму случайных величин X и Y : и найдем закон распределения величины Z . Для этого построим на плоскости хОу линию, уравнение которой (рис. 6.3.1). Это - прямая, отсекающая на осях отрезки, равные z . Прямая делит плоскость хОу на две части ; правее и выше ее; левее и ниже

Область D в данном случае - левая нижняя часть пло­скости хОу , заштрихованная на рис. 6.3.1. Согласно формуле (6.3.2) имеем:

Дифференцируя это выражение по переменной z , входящей в верх­ний предел внутреннего интеграла, получим:

(6.3.1) Это - общая формула для плотности распределения суммы двух случайных величин.

Из соображений симметричности задачи относительно X и Y можно написать другой вариант той же формулы:

(6.3.2) который равносилен первому и может применяться вместо него.

Пример композиции нормальных законов . Рассмотрим две независимые случайные величины X и Y , подчи­ненные нормальным законам:

Требуется произвести композицию этих законов, т. е. найти закон распределения величины: .

Применим общую формулу для композиции законов рас­пределения:

(6.3.3) Если раскрыть скобки в показателе степени подынтегральной функции и привести подобные члены, получим:

Подставляя эти выражения в уже встречавшуюся нам формулу

(6.3.4) после преобразований получим:

(6.3.5) а это есть не что иное, как нормальный закон с центром рассеи­вания

(6.3.6) и среднеквадратическим отклонением

(6.3.7) К тому же выводу можно прийти значительно проще с помощью следующих качественных рассуждений.

Не раскрывая скобок и не производя преобразований в подынте­гральной функции (6.3.3), сразу приходим к выводу, что показатель степени есть квадратный трехчлен относительно х вида

где в коэффициент А величина z не входит совсем, в коэффициент В входит в первой степени, а в коэффициент С - в квадрате. Имея это в виду и применяя формулу(6.3.4), приходим к заключению, что g (z ) есть показательная функция, показатель степени которой - квадратный трехчлен относительно z , а плотность аспределения; такого вида соответствует нормальному закону. Таким образом, мы; приходим к чисто качественному выводу: закон распределения вели­чины z должен быть нормальным. Чтобы найти параметры этого закона - и - воспользуемся теоремой сложения математических ожиданий и теоремой сложения дисперсий. По теореме сложения математических ожиданий. По теореме сложения дисперсий или откуда следует формула (6.3.7).

Переходя от среднеквадратических отклонений к пропорциональным им вероятным отклонениям, получим: .

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

Правило композиции нормальных законов может быть обобщено на случай произвольного числа независимых случайных величин.

Если имеется n независимых случайных величин: подчиненных нормальным законам с центрами рассеивания и среднеквадратическими отклонениями,то величина также подчинена нормальному закону с параметрами

(6.3.8) (6.3.9) Вместо формулы (6.3.9) можно применять равносильную ей формулу:

Если система случайных величин (X , Y ) распределена по нормальному закону, но величины X , Y зависимы, то нетрудно доказать, так же как раньше, исходя из общей формулы (6.3.1), что закон распределения величины есть тоже нормальный закон. Центры рассеивания по-прежнему складываются алгебраически, но для среднеквадратических отклонений правило становится более сложным: , где, r - коэффициент корреляции величин X и Y .

При сложении нескольких зависимых случайных величин, подчиненных в своей совокупности нормальному закону, закон распределения суммы также оказывается нормальным с параметрами

(6.3.10)(6.3.11) или в вероятных отклонениях

где - коэффициент корреляции величин X i , X j , а суммирование распространяется на все различные попарные комбинации величин.

Мы убедились в весьма важном свойстве нормального закона: при композиции нормальных законов получается снова нормальный закон. Это - так называемое «свойство устойчивости». Закон распределения называется устойчивым, если при композиции двух законов этого типа получается снова закон того же типа. Выше мы показали, что нормальный закон является устойчивым. Свойством устойчивости обладают весьма немногие законы распределения. Закон равномерной плотности неустойчив: при композиции двух законов равномерной плотности на участках от 0 до 1 мы получили закон Симпсона.

Устойчивость нормального закона - одно из существенных условий его широкого распространения на практике. Однако свойством устойчивости, кроме нормального, обладают и некоторые другие законы распределения. Особенностью нор­мального закона является то, что при композиции достаточно боль­шого числа практически произвольных законов распределения суммарный закон оказывается сколь угодно близок к нормальному вне зависимости от того, каковы были законы распределения слагаемых. Это можно проиллюстрировать , например, составляя композицию трех законов равномерной плотности на уча­стках от 0 до 1. Получающийся при этом закон распределения g (z ) изображен на рис. 6.3.1. Как видно из чертежа, график функции g (z ) весьма напоминает график нормального закона.

46.4. Распределение произведения.

Пусть, где и - скалярные случайные величины с совместной плотностью распределения. Найдем распределение Y .

(6.4.1)

На рис. событие показано штриховкой. Теперь очевидно, что

5(6.4.2) (6.4.3) 6.5. Распределение квадрата случайной величины.

Пусть; X - непрерыная случайная величина с плотностью. Найдем. Если, то и. В том случае, когда получаем:

(6.5.1) (6.5.2) В частном случае, когда, имеем:

(6.5.3) Если при этом, то

6(6.5.4) 6.6. Распределение частного.

Пусть; X - непрерывная случайная величина с плотностью. Найдем.

(6.6.1)

На рис. 6.6.1 видно, что событие - изображают заштрихованные области. Поэтому

(6.6.2) (6.6.3) Если; ; независимы, то легко получить:

(6.6.4) Распределение (6.6.4) носит имя Коши. Оказывается, это распределение не имеет математического ожидания и дисперсии.

76.7. Числовые характеристики функций случайных величин.

Рассмотрим следующую задачу: случайная величина Y есть функция нескольких случайных величин;

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

Представим себе, что нам удалось найти закон распределения g (у) величины Y . Тогда задача об определении числовых характеристик становится простой; они находятся по формулам:

(6.7.2) (6.7.3) Однако задача нахождения закона распределения g (y ) ве­личины Y часто оказывается довольно сложной. Для решения поставленной задачи нахождение закона распределения величины Y не нужно: чтобы найти только числовые характеристики величины Y , нет надобности знать ее закон распределения; достаточно знать закон распределения аргументов.

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

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

Имеется случайная величина X с заданным законом распределе­ния; другая случайная величина Y связана с X функциональной за­висимостью: Y = (Х ).

Требуется, не находя закона распределения величины Y , опреде­лить ее математическое ожидание:

(6.7.4) Рассмотрим сначала случай, когда X есть дискретная случайная величина с рядом распределения:

x i X 1 x 2 x n p i P 1 p 2 p n Запишем в виде таблицы возможные значения величины Y и вероятности этих значений:

(x i ) (x 1 ) (x 2 ) (x n )p i P 1 P 2 p n Таблица 6.7.2 не является рядом распре­деления величины Y , так как в общем случае некоторые из значений

(6.7.5) могут совпадать между собой. Для того чтобы от таблицы (6.7.1) перейти к подлинному ряду распределения величины Y , нужно было бы расположить значения (6.7.5) в порядке возрастания, объединить столбцы, соответствую­щие равным между собой значениям Y , и сложить соответствующие вероятности. Математическое ожидание величины Y можно определить по формуле

(6.7.6) Очевидно, величина т у - М ((Х )), определяемая по формуле (6.7.6), не может измениться от того, что под знаком суммы некоторые члены будут объединены заранее, а порядок членов изменен.

В формуле (6.7.6) для математического ожидания функции не содержится в явном виде закона распределения самой функции, а содержится только закон распределения аргумента. Таким образом, для определения математического ожидания функции вовсе не требуется знать закон распределения этой функции , а доста ­ точно знать закон распределения аргумента .

Заменяя в формуле (6.7.6) сумму интегралом, а вероятность р i - элементом вероятности, получим аналогичную формулу для непрерыв­ной случайной величины:

(6.7.7) где f (x ) X .

Аналогично может быть определено математическое ожидание функции у (Х , Y ) от двух случайных аргументов X и Y . Для дискретных величин

(6.7.8) где - вероятность того, что система (X , Y )примет значения (x i y j ). Для непрерывных величин

(6.7.9) где f (x , у )- плотность распределения системы (X , Y ).

Аналогично определяется математическое ожидание функции от произвольного числа случайных аргументов. Приведем соответствующую формулу только для непрерывных величин:

(6.7.10) где - плотность распределения системы.

Формулы типа (6.7.10) весьма часто встречаются в практическом применении теории вероятностей, когда речь идет об осреднении каких-либо величин, зависящих от ряда случайных аргументов.

Таким образом, математическое ожидание функции любого числа случайных аргументов может быть найдено помимо закона распреде­ления функции. Аналогично могут быть найдены и другие числовые характеристики функции - моменты различных порядков. Так как каждый момент представляет собой математическое ожидание некоторой функции исследуемой случайной величины, то вычисление любого момента может быть осуществлено приемами, совершенно аналогич­ными вышеизложенным. Здесь мы приведем расчетные формулы только для дисперсии , причем лишь для случая непрерывных случайных аргументов.

Дисперсия функции одного случайного аргумента выражается формулой

(6.7.11) где т = М [(x )] - математическое ожидание функции (X );f (х ) - плотность распределения величины X .

Аналогично выражается дисперсия функции двух случайных аргументов:

(6.7.12) где - математическое ожидание функции (Х , Y ); f (x , у) - плотность распределения системы (X , Y ). Наконец, в случае произвольного числа случайных аргументов, в аналогичных обозначениях.

Алгоритм разработан группой экспертов в области фотографии (Joint Photographic Expert Group) специально для сжатия 24-битных и полутоновых изображений в 1991 году. Этот алгоритм не очень хорошо сжимает двухуровневые изображении, но он прекрасно обрабатывает изображения с непрерывными тонами, в которых близкие пикселы обычно имеют схожие цвета. Обычно глаз не в состоянии заметить какой-либо разницы при сжатии этим методом в 10 или 20 раз.

Алгоритм основан на ДКП, применяемом к матрице непересекающихся блоков изображения, размером 8х8 пикселей. ДКП раскладывает эти блоки по амплитудам некоторых частот. В результате, получается матрица, в которой многие коэффициенты, как правило, близки к нулю, которые можно представить в грубой числовой форме, т.е. в квантованном виде без существенной потери в качестве восстановления.

Рассмотрим работу алгоритма подробнее. Предположим, что сжимается полноцветное 24-битное изображение. В этом случае получаем следующие этапы работы.

Шаг 1. Переводим изображение из пространства RGB в пространство YCbCr с помощью следующего выражения:

Отметим сразу, что обратное преобразование легко получается путем умножения обратной матрицы на вектор , который по существу является пространством YUV:

.

Шаг 2. Разбиваем исходное изображение на матрицы 8х8. Формируем из каждой три рабочие матрицы ДКП – по 8 бит отдельно для каждой компоненты. При больших степенях сжатия блок 8х8 раскладывается на компоненты YCbCr в формате 4:2:0, т.е. компоненты для Cb и Cr берутся через точку по строкам и столбцам.

Шаг 3. Применение ДКП к блокам изображения 8х8 пикселей. Формально прямое ДКП для блока 8х8 можно записать в виде

где . Так как ДКП является «сердцем» алгоритма JPEG, то желательно на практике вычислять его как можно быстрее. Простым подходом для ускорения вычислений является заблаговременное вычисление функций косинуса и сведения результатов вычисления в таблицу. Мало того, учитывая ортогональность функций косинусов с разными частотами, вышеприведенную формулу можно записать в виде

.

Здесь является матрицей, размером 8х8 элементов, описывающая 8-ми мерное пространство, для представления столбцов блока в этом пространстве. Матрица является транспонированной матрицей и делает то же самое, но для строк блока . В результате получается разделимое преобразование, которое в матричном виде записывается как

Здесь - результат ДКП, для вычисления которого требуется операций умножения и почти столько же сложений, что существенно меньше прямых вычислений по формуле выше. Например, для преобразования изображения размером 512х512 пикселей потребуется арифметических операций. Учитывая 3 яркостных компоненты, получаем значение 12 582 912 арифметических операций. Количество умножений и сложений можно еще больше сократить, если воспользоваться алгоритмом быстрого преобразования Фурье. В результате для преобразования одного блока 8х8 нужно будет сделать 54 умножений, 468 сложений и битовых сдвигов.

В результате ДКП получаем матрицу , в которой коэффициенты в левом верхнем углу соответствуют низкочастотной составляющей изображения, а в правом нижнем – высокочастотной.

Шаг 4. Квантование. На этом шаге происходит отбрасывание части информации. Здесь каждое число из матрицы делится на специальное число из «таблицы квантования», а результат округляется до ближайшего целого:

.

Причем для каждой матрицы Y, Cb и Cr можно задавать свои таблицы квантования. Стандарт JPEG даже допускает использование собственных таблиц квантования, которые, однако, необходимо будет передавать декодеру вместе со сжатыми данными, что увеличит общий размер файла. Понятно, что пользователю сложно самостоятельно подобрать 64 коэффициента, поэтому стандарт JPEG использует два подхода для матриц квантования. Первый заключается в том, что в стандарт JPEG включены две рекомендуемые таблицы квантования: одна для яркости, вторая для цветности. Эти таблицы представлены ниже. Второй подход заключается в синтезе (вычислении на лету) таблицы квантовании, зависящей от одного параметра , который задается пользователем. Сама таблица строится по формуле

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

С квантованием связаны и специфические эффекты алгоритма. При больших значениях шага квантования потери могут быть настолько велики, что изображение распадется на квадраты однотонные 8х8. В свою очередь потери в высоких частотах могут проявиться в так называемом «эффекте Гиббса», когда вокруг контуров с резким переходом цвета образуется волнообразный «нимб».

Шаг 5. Переводим матрицу 8х8 в 64-элементный вектор при помощи «зигзаг»-сканирования (рис. 2).

Рис. 2. «Зигзаг»-сканирование

В результате в начале вектора, как правило, будут записываться ненулевые коэффициенты, а в конце образовываться цепочки из нулей.

Шаг 6. Преобразовываем вектор с помощью модифицированного алгоритма RLE, на выходе которого получаем пары типа (пропустить, число), где «пропустить» является счетчиком пропускаемых нулей, а «число» - значение, которое необходимо поставить в следующую ячейку. Например, вектор 1118 3 0 0 0 -2 0 0 0 0 1 … будет свернут в пары (0, 1118) (0,3) (3,-2) (4,1) … .

Следует отметить, что первое число преобразованной компоненты , по существу, равно средней яркости блока 8х8 и носит название DC-коэффициента. Аналогично для всех блоков изображения. Это обстоятельство наводит на мысль, что коэффициенты DC можно эффективно сжать, если запоминать не их абсолютные значения, а относительные в виде разности между DC коэффициентом текущего блока и DC коэффициентом предыдущего блока, а первый коэффициент запомнить так, как он есть. При этом упорядочение коэффициентов DC можно сделать, например, так (рис. 3). Остальные коэффициенты, которые называются AC-коэффициентами сохраняются без изменений.

Шаг 7. Свертываем получившиеся пары с помощью неравномерных кодов Хаффмана с фиксированной таблицей. Причем для DC и AC коэффициентов используются разные коды, т.е. разные таблицы с кодами Хаффмана.

Рис. 3. Схема упорядочения DC коэффициентов

Рис. 4. Структурная схема алгоритма JPEG

Процесс восстановления изображения в этом алгоритме полностью симметричен. Метод позволяет сжимать изображения в 10-15 раз без заметных визуальных потерь.

При разработке данного стандарта руководствовались тем, что данный алгоритм должен был сжимать изображения довольно быстро – не более минуты на среднем изображении. Это в 1991 году! А его аппаратная реализация должна быть относительно простой и дешевой. При этом алгоритм должен был быть симметричным по времени работы. Выполнение последнего требования сделало возможным появление цифровых фотоаппаратов, снимающие 24 битные изображения. Если бы алгоритм был несимметричен, было бы неприятно долго ждать, пока аппарат «перезарядится» - сожмет изображение.

Хотя алгоритм JPEG и является стандартом ISO, формат его файлов не был зафиксирован. Пользуясь этим, производители создают свои, несовместимые между собой форматы, и, следовательно, могут изменить алгоритм. Так, внутренние таблицы алгоритма, рекомендованные ISO, заменяются ими на свои собственные. Встречаются также варианты JPEG для специфических приложений.

Fil 17 декабря 2013 в 14:09

Изобретаем JPEG

  • Алгоритмы ,
  • Обработка изображений
  • Tutorial


Вы правильно поняли из названия, что это не совсем обычное описание алгоритма JPEG (формат файла я подробно описывал в статье ). В первую очередь, выбранный способ подачи материала предполагает, что мы ничего не знаем не только о JPEG, но и о преобразовании Фурье, и кодировании Хаффмана. И вообще, мало что помним из лекций. Просто взяли картинку и стали думать как же ее можно сжать. Поэтому я попытался доступно выразить только суть, но при которой у читателя будет выработано достаточно глубокое и, главное, интуитивное понимание алгоритма. Формулы и математические выкладки - по самому минимуму, только те, которые важны для понимания происходящего.

Знание алгоритма JPEG очень полезно не только для сжатия изображений. В нем используется теория из цифровой обработки сигналов, математического анализа, линейной алгебры, теории информации, в частности, преобразование Фурье, кодирование без потерь и др. Поэтому полученные знания могут пригодиться где угодно.

Если есть желание, то предлагаю пройти те же этапы самостоятельно параллельно со статьей. Проверить, насколько приведенные рассуждения подходят для разных изображений, попытаться внести свои модификации в алгоритм. Это очень интересно. В качестве инструмента могу порекомендовать замечательную связку Python + NumPy + Matplotlib + PIL(Pillow). Почти вся моя работа (в т. ч. графики и анимация), была произведена с помощью них.

Внимание, трафик! Много иллюстраций, графиков и анимаций (~ 10Мб). По иронии судьбы, в статье про JPEG всего 2 изображения с этим форматом из полусотни.

Каков бы ни был алгоритм сжатия информации, его принцип всегда будет один - нахождение и описание закономерностей. Чем больше закономерностей, тем больше избыточности, тем меньше информации. Архиваторы и кодеры обычно «заточены» под конкретный тип информации, и знают где можно их найти. В некоторых случаях закономерность видна сразу, например картина голубого неба. Каждый ряд его цифрового представления можно довольно точно описать прямой.

Будем тренироваться на кошках енотах. В качестве примера взято серое изображение, приведенное выше. Оно хорошо совмещает как однородные области, так и контрастные. А если мы научимся сжимать серое, то и с цветным не будет проблем.

Векторное представление

Для начала проверим насколько зависимы два соседних пикселя. Логично предположить, что скорее всего, они будут очень похожи. Проверим это для всех пар изображения. Отметим их на координатной плоскости точками так, что значение точки по оси X - значение первого пикселя, по оси Y - второго. Для нашего изображения размером 256 на 256 получим 256*256/2 точек:


Предсказуемо, что большинство точек находится на или рядом с прямой y=x (а их там еще больше, чем видно на рисунке, так как они многократно накладываются друг на друга, и, к тому же, они полупрозрачные). А раз так, то было бы проще работать, повернув их на 45°. Для этого нужно выразить их в другой системе координат.


Базисные вектора новой системы, очевидно, такие: . Вынуждены делить на корень из двойки, чтобы получить ортонормированную систему (длины базисных векторов равны единичке). Здесь показано, что некоторая точка p = (x, y) в новой системе будет представлена как точка (a 0 , a 1). Зная новые коэффициенты, мы легко можем получить старые обратным поворотом. Очевидно, первая (новая) координата является средним, а вторая - разностью x и y (но деленные на корень из 2). Представьте, что вам предложено оставить только одно из значений: либо a 0 , либо a 1 (то есть другое приравнять нулю). Лучше выбрать a 0 , так как значение a 1 и так, скорее всего, будет около нуля. Вот, что получится, если мы восстановим изображение только по a 0:


Увеличение в 4 раза:


Такое сжатие не очень впечатляет, честно говоря. Лучше аналогично разобьем картинку по тройкам пикселей и представим их в трехмерном пространстве.

Это один и тот же график, но с разных точек зрения. Красные линии - оси, которые напрашивались сами собой. Им соответствуют вектора: . Напоминаю, что приходится делить на некоторые константы, чтобы длины векторов стали равны единице. Таким образом, разложив по такому базису, мы получим 3 значения a 0 , a 1 , a 2 , причем a 0 важнее a 1 , а a 1 важнее a 2 . Если мы выбросим a 2 , то график «сплющится» в направлении вектора e 2 . Этот и так довольно не толстый трехмерный лист станет плоским. Он потеряет не так много, зато мы избавимся от трети значений. Сравним изображения, восстановленные по тройкам: (a 0 , 0, 0), (a 1 , a 2 , 0) и (a 0 , a 1 , a 2). В последнем варианте мы ничего не выбросили, поэтому получим оригинал.


Увеличение в 4 раза:


Второй рисунок уже хорош. Резкие участки немного сгладились, но в целом картинка сохранилась очень неплохо. А теперь, точно так же поделим на четверки и визуально определим базис в четырехмерном пространстве… А, ну да. Но можно догадаться, каким будет один из векторов базиса, это: (1,1,1,1)/2. Поэтому можно посмотреть проекцию четырехмерного пространства на пространство, перпендикулярное вектору (1,1,1,1), чтобы выявить другие. Но это не лучший путь.
Наша цель - научиться преобразовывать (x 0 , x 1 , ..., x n-1) к (a 0 , a 1 , ..., a n-1) так, что каждое значение a i все менее важно, чем предыдущие. Если мы сможем так делать, то, возможно, последние значения последовательности вообще можно будет выбросить. Вышеприведенные опыты намекают, что можно. Но без математического аппарата не обойтись.
Итак, нужно преобразовать точки к новому базису. Но сначала необходимо найти подходящий базис. Вернемся к первому эксперименту разбиения на пары. Будем считать обобщенно. Мы определили базисные векторы:

Выразили через них вектор p :

или в координатах:

Чтобы найти a 0 и a 1 нужно спроецировать p на e 0 и e 1 соответственно. А для этого нужно найти скалярное произведение

аналогично:

В координатах:

Часто бывает удобнее проводить преобразование в матричной форме.

Тогда A = EX и X = E T A. Это красивая и удобная форма. Матрица E называется матрицей преобразования и является ортогональной, с ней мы еще встретимся.

Переход от векторов к функциям.

С векторами малых размерностей работать удобно. Однако мы хотим находить закономерности в бОльших блоках, поэтому вместо N-мерных векторов удобнее оперировать последовательностями, которыми представлено изображение. Такие последовательности я буду называть дискретными функциями, так как следующие рассуждения применимы и к непрерывным функциям.
Возвращаясь к нашему примеру, представим такую функцию f(i), которая определена всего в двух точках: f(0)=x и f(1)=y. Аналогично зададим базисные функции e 0 (i) и e 1 (i) на основе базисов e 0 и e 1 . Получим:

Это очень важный вывод. Теперь во фразе «разложение вектора по ортонормированным векторам» мы можем заменить слово «вектор» на «функция» и получить вполне корректное выражение «разложение функции по ортонормированным функциям». Не беда, что мы получили такую куцую функцию, так как такие же рассуждения работают и для N-мерного вектора, который можно представить как дискретную функцию с N значениями. А работа с функциями нагляднее, чем с N-мерными векторами. Можно и наоборот, представить такую функцию как вектор. Более того, обычную непрерывную функцию можно представить бесконечномерным вектором, правда уже не в евклидовом, а гильбертовом пространстве. Но мы туда не пойдем, нас будут интересовать только дискретные функции.
А наша задача нахождения базиса превращается в задачу нахождения подходящей системы ортонормированных функций. В следующих рассуждениях предполагается, что мы уже как-то определили набор базисных функций, по которым и будем раскладывать.
Допустим, у нас есть некоторая функция (представленная, например, значениями), которую мы хотим представить в виде суммы других. Можно представлять этот процесс в векторном виде. Для разложения функции нужно «спроецировать» ее на базисные функции по очереди. В векторном смысле вычисление проекции дает минимальное сближение исходного вектора к другому по расстоянию. Помня о том, что расстояние вычисляется с помощью теоремы Пифагора, то аналогичное представление в виде функций дает наилучшее среднеквадратичное приближение функции к другой. Таким образом, каждый коэффициент (k) определяет «близость» функции. Более формально, k*e(x) - лучшее среднеквадратичное приближение к f(x) среди l*e(x).
В следующем примере показан процесс приближения функции только по двум точкам. Справа - векторное представление.


Применительно к нашему эксперименту разбивания на пары, можно сказать, что эти две точки (0 и 1 по абсцисс) - пара соседних пикселей (x, y).
То же самое, но с анимацией:


Если мы возьмем 3 точки, то нужно рассматривать трехмерные вектора, однако приближение будет точнее. А для дискретной функции с N значениями нужно рассматривать N-мерные вектора.
Имея набор полученных коэффициентов, можно легко получить исходную функцию, просуммировав базисные функции, взятые с соответствующими коэффициентами. Анализ этих коэффициентов может дать много полезной информации (в зависимости от базиса). Частным случаем этих соображений является принцип разложения в ряд Фурье. Ведь наши рассуждения применимы к любому базису, а при разложении в ряд Фурье берется вполне конкретный.

Дискретные преобразования Фурье (ДПФ)

В предыдущей части мы пришли к выводу, что неплохо было бы разлагать функцию на составные. В начале 19 века Фурье тоже задумался над этим. Правда картинки с енотом у него не было, поэтому ему пришлось исследовать распределение тепла по металлическому кольцу. Тогда он выяснил, что очень удобно выражать температуру (и ее изменение) в каждой точке кольца как сумму синусоид с разными периодами. «Фурье установил (рекомендую к прочтению , интересно), что вторая гармоника затухает в 4 раза быстрее, чем первая, а гармоники более высоких порядков затухают с ещё большей скоростью».
В общем, вскоре оказалось, что периодичные функции замечательно раскладываются на сумму синусоид. А так как в природе существует много объектов и процессов, описывающимися периодичными функциями, то появился мощный инструмент их анализа.
Пожалуй, один из самых наглядных периодических процессов - это звук.

  • 1-й график - чистый тон частотой 2500 герц.
  • 2-й - белый шум. Т. е. шум c равномерно распределенными частотами по всему диапазону.
  • 3-й - сумма первых двух.
Если бы мне дали значения последней функции на тот момент, когда я не знал про ряды Фурье, и попросили проанализировать их, то я бы точно растерялся и не смог бы сказать ничего путного. Ну, да, какая-то функция, но как понять, что там есть что-то упорядоченное? Но если бы я догадался прослушать последнюю функцию, то ухо уловило бы чистый тон среди шума. Хотя и не очень хорошо, так как я специально при генерации подобрал такие параметры, чтобы на суммарном графике сигнал визуально растворился в шуме. Как я понял, до сих пор точно не уставлено, как слуховой аппарат делает это. Однако, недавно стало ясно, что он не раскладывает звук на синусоиды. Возможно, когда-нибудь мы поймем как это происходит, и появятся более совершенные алгоритмы. Ну, а мы пока по старинке.
Почему бы не попробовать взять синусоиды в качестве базиса? На самом деле мы фактически уже сделали это. Вспомним наше разложение на 3 базисных вектора и представим их на графике:


Да-да, знаю, это выглядит как подгонка, но с тремя векторами трудно ожидать большего. Зато теперь понятно, как получить, например, 8 базисных векторов:


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

Это все та же формула: A = EX с подставленным базисом. Базисные вектора указанного DCT (они же векторы-строки матрицы E) ортогональны, но не ортонормированы. Это следует помнить при обратном преобразовании (не буду останавливаться на этом, но, кому интересно - у inverse DCT появляется слагаемое 0.5*a 0 , так как нулевой вектор базиса больше остальных).
На следующем примере показан процесс приближения промежуточных сумм к исходным значениям. На каждой итерации очередной базис умножается на очередной коэффициент и прибавляется к промежуточной сумме (то есть так же, как и в ранних опытах над енотом - треть значений, две трети).


Но, все-таки, несмотря на некоторые доводы о целесообразности выбора такого базиса, реальных аргументов пока нет. Действительно, в отличие от звука, целесообразность разложения изображения на периодические функции гораздо менее очевидна. Впрочем, изображение действительно может быть слишком непредсказуемым даже на небольшом участке. Поэтому, картинку делят на достаточно маленькие кусочки, но не совсем крохотные, чтобы разложение имело смысл. В JPEG изображение «нарезается» на квадраты 8x8. В пределах такого кусочка фотографии обычно очень однородны: фон плюс небольшие колебания. Такие области шикарно приближаются синусоидами.
Ну, допустим, этот факт более или менее понятен интуитивно. Но появляется нехорошее предчувствие насчет резких цветовых переходов, ведь медленно изменяющиеся функции нас не спасут. Приходится добавлять разные высокочастотные функции, которые справляются со своей работой, но побочно проявляются на однородном фоне. Возьмем изображение 256x256 с двумя контрастными областями:


Разложим каждую строку с помощью DCT, получив, таким образом, по 256 коэффициентов на строку.
Затем оставим только первые n коэффициентов, а остальные приравняем нулю, и, поэтому, изображение будет представлено в виде суммы только первых гармоник:


Число на картинке - количество оставленных коэффициентов. На первом изображении осталось только среднее значение. На второй уже добавилась одна низкочастотная синусоида, и т. д. Кстати, обратите внимание на границу - несмотря на все лучшее приближение, рядом с диагональю хорошо заметны 2 полоски, одна светлее, другая темнее. Часть последнего изображения увеличенного в 4 раза:

И вообще, если вдали от границы мы видим первоначальный равномерный фон, то при приближении к ней, амплитуда начинает расти, наконец достигает минимального значения, а затем резко становится максимальным. Это явление известно как эффект Гиббса.


Высота этих горбов, появляющийся около разрывов функции, не уменьшится при увеличении количества слагаемых функций. В дискретном преобразовании оно пропадает только при сохранении почти всех коэффициентов. Точнее, становится незаметным.
Следующий пример полностью аналогичен вышеприведенному разложению треугольников, но уже на реальном еноте:


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

DCT vs все остальное

Когда я изучал вопрос ортогональных преобразований, то, честно говоря, меня не очень убеждали доводы о том, что все вокруг - это сумма гармонических колебаний, поэтому нужно и картинки раскладывать на синусоиды. А может быть лучше подойдут какие-нибудь ступенчатые функции? Поэтому искал результаты исследований об оптимальности DCT на реальных изображениях. То, что «Именно DCT чаще всего встречается в практических приложениях благодаря свойству «уплотнения энергии»» написано везде. Это свойство означает, что максимальное количество информации заключено в первых коэффициентах. А почему? Нетрудно провести исследование: вооружаемся кучей разных картинок, различными известными базисами и начинаем считать среднеквадратичное отклонение от реального изображения для разного количества коэффициентов. Нашел небольшое исследование в статье (использованные изображения ) по этой методике. В ней приведены графики зависимости сохраненной энергии от количества первых коэффициентов разложений по разным базисам. Если вы просмотрели графики, то убедились, что DCT стабильно занимает почетное… эмм… 3-место. Как же так? Что еще за KLT преобразование? Я восхвалял DCT, а тут…
KLT
Все преобразования, кроме KLT, являются преобразованиями с постоянным базисом. А в KLT (преобразование Карунена-Лоэва) вычисляется самый оптимальный базис для нескольких векторов. Он вычисляется таким образом, что первые коэффициенты дадут наименьшую среднеквадратичную погрешность суммарно для всех векторов. Похожую работу мы проводили ранее вручную, визуально определяя базис. Сначала кажется, что это здравая идея. Мы могли бы, например, разбивать изображение на небольшие секции и для каждой вычислять свой базис. Но мало того, что появляется забота хранения этого базиса, так еще и операция его вычисления достаточно трудоемкая. А DCT проигрывает лишь немного, и к тому же у DCT существуют алгоритмы быстрого преобразования.
DFT
DFT (Discrete Fourier Transform) - дискретное преобразование Фурье. Под этим названием иногда упоминается не только конкретная трансформация, но и весь класс дискретных трансформаций (DCT, DST...). Посмотрим на формулу DFT:

Как вы догадываетесь, это ортогональное преобразование с каким-то комплексным базисом. Так как подобная комплексная форма встречается чуть чаще, чем всегда, то имеет смысл изучить ее вывод.
Может сложится впечатление, что любой чистый гармонический сигнал (с целой частотой) при DCT разложении будет давать только один ненулевой коэффициент, соответствующий этой гармонике. Это не так, поскольку помимо частоты, важна и фаза этого сигнала. Например, разложение синуса по косинусам (подобным образом и в дискретном разложении) будет таким:

Вот вам и чистая гармоника. Она наплодила кучу других. На анимации показаны коэффициенты DCT синусоиды в разных фазах.


Если вам показалось, что столбики вращаются вокруг оси, то вам не показалось.
Значит теперь будем раскладывать функцию на сумму синусоид не просто разных частот, но еще и смещенных по какой-то фазе. Будет удобнее рассмотреть сдвиг фаз на примере косинуса:

Простое тригонометрическое тождество дает важный результат: сдвиг по фазе заменяется суммой синуса и косинуса, взятых с коэффициентами cos(b) и sin(b). Значит, можно раскладывать функции на сумму синусов и косинусов (без всяких фаз). Это распространенная тригонометрическая форма. Однако, гораздо чаще используется комплексная. Для ее получения нужно воспользоваться формулой Эйлера . Просто подставим производные формулы для синуса и косинуса, получим:


Теперь небольшая замена. Верхнее подчеркивание - сопряженное число.

Получим итоговое равенство:

c - комплексный коэффициент, действительная часть которого равна косинусному коэффициенту, а мнимая - синусному. А множество точек (cos(b), sin(b)) является окружностью. В такой записи каждая гармоника входит в разложение и с положительной и с отрицательной частотой. Поэтому в различных формулах Фурье-анализа обычно происходит суммирование или интегрирование от минус до плюс бесконечности. Производить вычисления часто бывает удобнее именно в такой комплексной форме.
Преобразование раскладывает сигнал на гармоники с частотами от одного до N колебаний на области сигнала. Но частота дискретизации составляет N на области сигнала. А по теореме Котельникова (aka теорема Найквиста - Шеннона) частота дискретизации должна по крайней мере в два раза превышать частоту сигнала. Если это не так, то получается эффект появления сигнала с ложной частотой:


Пунктирной линий показан неверно восстановленный сигнал. С таким явлением вы часто сталкивались в жизни. Например, забавное движение колес автомобиля на видео, или муаровый эффект.
Это приводит к тому, что вторая половина из N комплексных амплитуд как будто состоит из других частот. Эти ложные гармоники второй половины являются зеркальным отображением первой и не несут дополнительной информации. Таким образом, у нас остается N/2 косинусов и N/2 синусов (образующих ортогональный базис).
Ладно, базис есть. Его составляющие - гармоники с целым числом колебаний на области сигнала, а значит, крайние значения гармоник равны. Точнее почти равны, так как последнее значение берется не совсем с края. Более того - каждая гармоника почти зеркально симметрична относительно своего центра. Все эти явления особенно сильны на низких частотах, которые нам и важны при кодировании. Это плохо еще и тем, что на сжатом изображении будут заметны границы блоков. Проиллюстрирую DFT-базис с N=8. Первые 2 ряда - косинусные составляющие, последние - синусные:


Обратите внимание на появление дублей составляющих при повышении частоты.

Можете мысленно подумать, как мог бы быть разложен сигнал, значения которого плавно уменьшаются с максимального значения в начале до минимального в конце. Более-менее адекватное приближение смогли бы сделать лишь гармоники ближе к концу, что для нас не очень здорово. На рисунке слева приближение несимметричного сигнала. Справа - симметричного:


С первым дела крайне плохи.
Так может быть сделать как в DCT - уменьшить частоты в 2 или другое количество раз, чтобы количество некоторых колебаний было дробным и границы находились в разных фазах? Тогда составляющие будут неортогональны. И ничего тут не поделать.

DST
Что если вместо косинусов в DCT использовать синусы? Мы получим Discrete Sine Transform (DST). Но для нашей задачи все они неинтересны, так как и целые и половинки периодов синусов близки к нулю на границах. То есть мы получим примерно такое же неподходящее разложение, как и у DFT.
Возвращаясь к DCT
Как у него дела на границах? Хорошо. Есть противофазы и нет нулей.
Все остальное
Не-Фурье преобразования. Не буду описывать.
WHT - матрица состоит только из ступенчатых составляющих со значениями -1 и 1.
Haar - по совместительству ортогональное вейвлет-преобразование.
Они уступают DCT, но легче для вычислений.

Итак, вас посетила мысль придумать свое преобразование. Помните вот что:

  1. Базис должен быть ортогонален.
  2. С фиксированным базисом вы не сможете превзойти KLT по качеству сжатия. Между тем, на реальных фотографиях DCT почти не уступает.
  3. На примере DFT и DST нужно помнить про границы.
  4. И помнить, что у DCT есть еще хорошее преимущество - вблизи границ составляющих их производные равны нулю, а значит, переход между соседними блоками будет довольно плавным.
  5. У преобразований Фурье существуют быстрые алгоритмы со сложностью O(N*logN), в отличие от вычисления в лоб: O(N 2).
Будет непросто, правда? Впрочем, для некоторых типов изображений можно подобрать лучший базис, чем у DCT.

Двумерные преобразования

Сейчас попробуем провести такой эксперимент. Возьмем, для примера, кусочек изображения.


Его 3D график:


Пройдемся DCT(N=32) по каждой строке:


Теперь я хочу, чтобы вы пробежались глазами по каждому столбцу полученных коэффициентов, т. е. сверху вниз. Вспомните, что наша цель - оставить как можно меньше значений, убрав малозначащие. Наверняка вы догадались, что значения каждого столбца полученных коэффициентов можно разложить точно так же, как и значения исходного изображения. Никто не ограничивает нас в выборе ортогональной матрицы преобразования, но мы сделаем это опять с помощью DCT(N=8):


Коэффициент (0,0) получился слишком большим, поэтому на графике он уменьшен в 4 раза.
Итак, что получилось?
Левый верхний угол - самые значащие коэффициенты разложения самых значащих коэффициентов.
Левый нижний угол - самые незначащие коэффициенты разложения самых значащих коэффициентов.
Правый верхний угол - самые значащие коэффициенты разложения самых незначащих коэффициентов.
Правый нижний угол - самые незначащие коэффициенты разложения самых незначащих коэффициентов.
Понятно, что значимость коэффициентов уменьшается, если двигаться по диагонали из левого верхнего угла в правый нижний. А какой важнее: (0, 7) или (7, 0)? Что они вообще означают?
Сначала по строкам: A 0 = (EX T) T = XE T (транспонировали, так как формула A=EX для столбцов), затем по столбцам: A=EA 0 = EXE T . Если аккуратно посчитать, то получится формула:

Таким образом, если вектор раскладывается на синусоиды, то матрица на функции вида cos(ax)*cos(by). Каждый блок 8x8 в JPEG представляется в виде суммы 64-х функций вида:


В Википедии и других источниках такие функции представлены в более удобной форме:


Поэтому коэффициенты (0, 7) или (7, 0) одинаково полезны.
Впрочем, фактически это обычное одномерное разложение на 64 64-мерных базиса. Все вышесказанное применимо не только к DCT, но и к любому ортогональному разложению. Действуя по аналогии, в общем случае получаем N-мерное ортогональное преобразование.
А вот уже 2-мерное преобразование енота (DCT 256x256). Опять же с обнуленными значениями. Числа - количество необнуленных коэффициентов из всех (оставлялись самые значимые значения, находящиеся в треугольной области в левом верхнем углу).


Запомните, что коэффициент (0, 0) называется DC, остальные 63 - AC.

Выбор размера блока

Товарищ спрашивает : почему в JPEG используется разбиение именно 8x8. Из заплюсованного ответа:
The DCT treats the block as if it were periodic and has to reconstruct the resulting jump at the boundaries. If you take 64x64 blocks, you"ll most likely have a huge jump at the boundaries, and you"ll need lots of high-frequency components to reconstruct that to a satisfactory precision
Мол, DCT работает хорошо только на периодических функциях, и если вы возьмете большой размер, то, скорее всего, получите гигантский скачок на границах блока и понадобится много высокочастотных компонентов для его покрытия. Это неверно! Такое объяснение очень похоже на DFT, но не на DCT, так как оно отлично покрывает такие скачки уже первыми составляющими.
На той же странице приводится ответ из MPEG FAQ, с основными аргументами против больших блоков:
  • Мало прибыли при разбиении на большие блоки.
  • Увеличение вычислительной сложности.
  • Высокая вероятность большого количества резких границ в одном блоке, что вызовет эффект Гиббса.
Предлагаю самостоятельно исследовать это. Начнем с первого .


По горизонтальной оси - доля первых необнуленных коэффициентов. По вертикальной - среднеквадратичное отклонение пикселей от оригинала. Максимальное возможное отклонение взято за единицу. Разумеется, для вердикта явно недостаточно одной картинки. К тому же, я действую не совсем правильно, просто обнуляя. В реальном JPEG, в зависимости от матрицы квантования, обнуляются только маленькие значения высокочастотных компонентов. Поэтому, следующие эксперименты и выводы предназначены для поверхностного выявления принципов и закономерностей.
Можно сравнить разбиение на разные блоки с оставленными 25-ю процентами коэффициентов (слева направо, затем справа налево):

Большие блоки не показаны, так как визуально почти неотличимы от 32x32. Теперь посмотрим на абсолютную разность с исходным изображением (усиленную в 2 раза, иначе ничего толком не видно):

8x8 дает лучший результат, чем 4x4. Дальнейшее увеличение размера уже не дает хорошо заметного преимущества. Хотя я всерьез бы задумался над 16x16, вместо 8x8: увеличение сложности на 33% (о сложности в следующем абзаце), дает небольшое, но все-таки видимое улучшение при одинаковом количестве коэффициентов. Однако, выбор 8x8 выглядит достаточно обоснованным и, возможно, является золотой серединой. JPEG был опубликован в 1991. Думаю, что такое сжатие являлось очень сложным для процессоров того времени.

Второй аргумент. Нужно помнить, что при увеличении размера блока потребуется больше вычислений. Давайте оценим насколько. Сложность преобразования в лоб, как мы уже вполне умеем: O(N 2), так как каждый коэффициент состоит из N слагаемых. Но на практике используется эффективный алгоритм быстрого преобразования Фурье (БПФ, Fast Fourier Transform, FFT). Его описание выходит за рамки статьи. Его сложность: O(N*logN). Для двумерного разложения нужно воспользоваться им дважды по N раз. Таким образом, сложность 2D DCT - O(N 2 logN). Теперь сравним сложности вычисления изображения одним блоком и несколькими маленькими:

  • Одним блоком (kN)x(kN): O((kN) 2 log(kN)) = O(k 2 N 2 log(kN))
  • k*k блоками N*N: O(k 2 N 2 logN)
Это значит, что, например, вычисление при разбиении на 64x64 в два раза сложнее, чем на 8x8.

Третий аргумент. Если у нас на изображении есть резкая граница цветов, то это скажется на всем блоке. Возможно, лучше этот блок будет достаточно мал, ведь во многих соседних блоках, такой границы, вероятно, уже не будет. Однако, вдали от границ затухание происходит достаточно быстро. К тому же сама граница будет выглядеть лучше. Проверим на примере с большим количеством контрастных переходов, опять же, только с четвертью коэффициентов:


Хотя искажения блоков 16x16 простираются дальше, чем у 8x8, но надпись более плавная. Поэтому меня убедили только первые два аргумента. Но мне что-то больше нравится разделение на 16x16.

Квантование

На данном этапе мы имеем кучу матриц 8x8 с коэффициентами косинусного преобразования. Пришло время избавляться от малозначащих коэффициентов. Существует более элегантное решение, чем просто обнулять последние коэффициенты, как мы делали выше. Нас не устраивает этот способ, так как необнуленные значения хранятся с избыточной точностью, а среди тех, кому не повезло, могли оказаться достаточно важные. Выход - нужно использовать матрицу квантования. Потери происходят именно на это этапе. Каждый Фурье-коэффициент делится на соответствующее число в матрице квантования. Рассмотрим на примере. Возьмем первый блок от нашего енота и произведем квантование. В спецификации JPEG приводится стандартная матрица:


Стандартная матрица соответствует 50% качеству в FastStone и IrfanView. Такая таблица была выбрана с точки зрения баланса качества и степени сжатия. Думаю, что значение для DC-коэффициента больше соседних из-за того, что DCT ненормализовано и первое значение получается больше, чем следовало бы. Высокочастотные коэффициенты огрубляются сильнее из-за их меньшей важности. Думаю, сейчас такие матрицы используются редко, так как ухудшение качества хорошо заметно. Никто не запрещает использовать свою таблицу (со значениями от 1 до 255)
При декодировании происходит обратный процесс - квантованные коэффициенты почленно умножаются на значения матрицы квантования. Но так как мы округляли значения, то не сможем точно восстановить исходные коэффициенты Фурье. Чем больше число квантования, тем больше погрешность. Таким образом, восстановленный коэффициент является лишь ближайшим кратным.
Еще пример:

И на десерт, рассмотрим качество 5% (при кодировании в Fast Stone).


При восстановлении этого блока мы получим только усредненное значение плюс вертикальный градиент (из-за сохранившегося значения -1). Зато для него хранится всего два значения: 7 и -1. C другими блоками ситуация не лучше, вот восстановленная картинка:

Кстати, насчет 100% качества. Как вы догадываетесь, в этом случае матрица квантования состоит полностью из единиц, то есть квантования не происходит. Однако, из-за округления коэффициентов до целого, мы не можем в точности восстановить исходную картинку. Например, енот сохранил 96% пикселей точно, а 4% отличались на 1/256. Разумеется, такие «искажения» невозможно заметить визуально.
А можете посмотреть матрицы квантования различных фотоаппаратов.

Кодирование

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

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

  • d9rg3
  • wfr43gt
  • wfr43gt
  • d9rg3
  • d9rg3
  • d9rg3
  • wfr43gt
  • d9rg3
Как бы вы облегчили свою задачу? Особого желания мучительно диктовать все эти слова у вас нет. Но их всего два и они повторяются. Поэтому вы просто как-нибудь диктуете первые два слова и договариваетесь, что далее «d9rg3» будете называть первым словом, а «wfr43gt» - вторым. Тогда достаточно будет продиктовать: 1, 2, 2, 1, 1, 1, 2, 1.

Подобные слова мы будем обозначать как A, B, C..., и называть их символами. Причем под символом может скрываться что угодно: буква алфавита, слово или бегемот в зоопарке. Главное, что одинаковым символам соответствуют одинаковые понятия, а разным - разные. Так как наша задача - эффективное кодирование (сжатие), то будем работать с битами, так как это наименьшие единицы представления информации. Поэтому, запишем список как ABBAAABA. Вместо «первое слово» и «второе слово» можно использовать биты 0 и 1. Тогда ABBAAABA закодируется как 01100010 (8 бит = 1 байт).

Пример 1
Закодировать ABC.
3-м разным символам (A, B, C) никак нельзя сопоставить 2 возможных значений бита (0 и 1). А раз так, то можно использовать по 2 бита на символ. Например:

  • A: 00
  • B: 01
  • C: 10
Последовательность битов, сопоставленная символу, будем называть кодом. ABC будет кодироваться так: 000110.

Пример 2
Закодировать AAAAAABC.
Использовать по 2 бита на символ A кажется немного расточительным. Что, если попробовать так:

  • C: 00

Закодированная последовательность: 000000100.
Очевидно, этот вариант не подходит, так как непонятно, как декодировать первые два бита этой последовательности: как AA или как C? Использовать какой-нибудь разделитель между кодами очень расточительно, будем думать как по-другому обойти это препятствие. Итак, неудача произошла из-за того, что код C начинается с кода A. Но мы полны решимости кодировать A одним битом, пусть даже B и С будут по два. Исходя из такого пожелания, A дадим код 0. Тогда коды B и C не могут начинаться на 0. Но могут на 1:
  • B: 10
  • C: 11

Последовательность закодируется так: 0000001011. Попробуйте мысленно декодировать ее. Вы сможете сделать это только одним способом.
Мы выработали два требования к кодированию:
  1. Чем больше вес символа, тем короче должен быть его код. И наоборот.
  2. Для однозначного декодирования код символа не может начинаться с кода любого другого символа.
Очевидно, порядок символов не важен, нас интересует только частота их встречаемости. Поэтому, с каждым символом сопоставляют некоторое число, называемое весом. Вес символа может являться как относительной величиной, отражающий долю его вхождения, так и абсолютной, равной количеству символов. Главное, чтобы веса были пропорциональны встречаемости символов.

Пример 3
Рассмотрим общий случай для 4-х символов с любыми весами.

  • A: pa
  • B: pb
  • C: pc
  • D: pd
Без потери общности, положим pa ≥ pb ≥ pc ≥ pd. Существуют всего два принципиально разных по длинам кодов варианта:


Какое из них предпочтительнее? Для этого нужно вычислить получаемые длины закодированных сообщений:
W1 = 2*pa + 2*pb + 2*pc + 2*pd
W2 = pa + 2*pb + 3*pc + 3*pd
Если W1 меньше W2 (W1-W2<0), то лучше использовать первый вариант:
W1-W2 = pa - (pc+pd) < 0 => pa < pc+pd.
Если C и D вместе встречаются чаще других, то их общая вершина получает самый короткий код из одного бита. В противном случае, один бит достается символу A. Значит, объединение символов ведет себя как самостоятельный символ и имеет вес равный сумме входящих символов.
Вообще, если p - вес символа представленный долей его вхождения (от 0 до 1), то лучшая длина кода s=-log 2 p.
Рассмотрим это на простом случае (его легко представить в виде дерева). Итак, нужно закодировать 2 s символов с равными весами (1/2 s). Из-за равенства весов длины кодов будут одинаковыми. Каждому символу потребуется s бит. Значит, если вес символа 1/2 s , то его длина s. Если вес заменить заменить на p, то получим длину кода s=-log 2 p . Значит, если один символ встречается в два раза реже другого, то длина его кода будет на бит длиннее. Впрочем такой вывод легко сделать, если вспомнить, что добавление одного бита позволяет в два раза увеличить количество возможных вариантов.
И еще одно наблюдение - два символа с наименьшими весами всегда имеют наибольшие, но равные длины кодов. Более того, их биты, кроме последнего, совпадают. Если бы это было неверно, то, по крайней мере, один код можно было бы укоротить на 1 бит, не нарушая префиксности. Значит, два символа с наименьшими весами в кодовом дереве имеют общего родителя уровнем выше. Вы можете видеть это на примере С и D выше.

Пример 4
Попробуем решить следующий пример, по выводам, полученным в предыдущем примере.

  1. Все символы сортируются в порядке убывания весов.
  2. Два последних символа объединяются в группу. Этой группе присваивается вес, равный сумме весов этих элементов. Эта группа участвует в алгоритме наравне с символами и другими группами.
Шаги повторяются, пока не останется только одна группа. В каждой группе одному символу (или подгруппе) присваивается бит 0, а другому бит 1.
Этот алгоритм называется кодированием Хаффмана.
На иллюстрации приведен пример с 5-ю символами (A: 8, B: 6, C: 5, D: 4, E: 3). Справа указан вес символа (или группы).

Кодируем коэффициенты

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


Обратите внимание - шкала логарифмическая! Сможете объяснить причину появления скопления значений превышающих 200? Это DC-коэффициенты. Так как они сильно отличаются от остальных, то неудивительно, что их кодируют отдельно. Вот только DC:


Обратите внимание, что форма графика напоминает форму графиков из самих ранних экспериментов деления на пары и тройки пикселей
Вообще, значения DC-коэффициентов могут меняться от 0 до 2047 (точнее от -1024 до 1023, так как в JPEG производится вычитание 128 из всех исходных значений, что соответствует вычитанию 1024 из DC) и распределяться довольно равномерно с небольшими пиками. Поэтому кодирование Хаффмана здесь не очень-то поможет. А еще представьте, каким большим будет дерево кодирования! И во время декодирования придется искать в нем значения. Это очень затратно. Думаем дальше.
DC-коэффициент - усредненное значение блока 8x8. Представим градиентный переход (пусть не идеальный), который часто встречается в фотографиях. Сами DC значения будут разными, но они будут представлять арифметическую прогрессию. Значит, их разность будет более-менее постоянна. Построим гистограмму разностей:


Вот это уже лучше, потому что значения, в целом, сконцентрированы около нуля (но алгоритм Хаффмана опять даст слишком большое дерево). Маленькие значения (по абсолютной величине) встречаются часто, большие редко. А так как маленькие значения занимают мало бит (если убрать ведущие нули), то хорошо выполняется одно из правил сжатия: символам с большими весами присваивать короткие коды (и наоборот). Нас пока ограничивает невыполнение другого правила: невозможность однозначного декодирования. В целом, такая проблема решается следующими способами: заморочиться с кодом-разделителем, указывать длину кода, использовать префиксные коды (они вам уже известны - это случай, когда ни один код не начинается с другого). Пойдем по простому второму варианту, т. е. каждый коэффициент (точнее, разница соседних) будет записываться так: (длина)(значение), по такой табличке:


То есть положительные значения прямо кодируются их двоичным представлением, а отрицательные - так же, но с заменой ведущей 1 на 0. Осталось решить, как кодировать длины. Так как их 12 возможных значений, то можно использовать 4 бита для хранения длины. Но вот тут-то как раз лучше использовать кодирование Хаффмана.


Значений с длинами 4 и 6 больше всего, поэтому им достались самые короткие коды (00 и 01).


Может возникнуть вопрос: почему на примере у значения 9 код 1111110, а не 1111111? Ведь можно смело поднять «9» на уровень выше, рядом с «0»? Дело в том, что в JPEG нельзя использовать код, состоящий только из единиц - такой код зарезервирован.
Есть еще одна особенность. Коды, полученные описанным алгоритмом Хаффмана могут не совпасть по битам с кодами в JPEG, хотя их длины будут одинаковыми. Используя алгоритм Хаффмана, получают длины кодов, а сами коды генерируются (алгоритм прост - начинают с коротких кодов и добавляют их по очереди в дерево как можно левее, сохраняя свойство префиксности). Например, для дерева выше хранится список: 0,2,3,1,1,1,1,1. И, разумеется, хранится список значений: 4,6,3,5,7,2,8,1,0,9. При декодировании коды генерируются таким же способом.

Теперь порядок. Мы разобрались как хранятся DC:
[код Хаффмана для длины DC diff (в битах)]
где DC diff = DC текущее - DC предыдущее

Смотрим AC:


Так как график очень похож на график для разностей DC, то принцип тот же: [код Хаффмана для длины AC (в битах)]. Но не совсем! Так как на графике шкала логарифмическая, то не сразу заметно, что нулевых значений примерно в 10 раз больше, чем значения 2 - следующего по частоте. Это понятно - не все пережили квантование. Вернемся к матрице значений, полученной на этапе квантования (используя матрицу квантования FastStone, 90%).

Так как встречается много групп подряд идущих нулей, то появляется идея - записывать только количество нулей в группе. Такой алгоритм сжатия называется RLE (Run-length encoding, кодирование повторами). Осталось выяснить направление обхода «подряд идущих» - кто за кем? Выписать слева направо и сверху вниз - не очень эффективно, так как ненулевые коэффициенты концентрируются около левого верхнего угла, а чем ближе к правому нижнему - тем больше нулей.


Поэтому, в JPEG используется порядок, называемый «Zig-zag», он показан на левом рисунке. Такой способ хорошо выделяет группы нулей. На правом рисунке - альтернативный способ обхода, не относящийся к JPEG, зато с любопытным названием (пруф). Он может использоваться в MPEG при сжатии видео с чересстрочной разверткой. Выбор алгоритма обхода не влияет на качество изображения, но может увеличить количество кодируемых групп нулей, что в итоге может отразиться на размере файла.
Модифицируем нашу запись. Для каждого ненулевого AC - коэффициента:
[Количество нулей перед AC][код Хаффмана для длины AC (в битах)]
Думаю, что вы сразу скажете - количество нулей тоже отлично закодируется Хаффманом! Это очень близкий и неплохой ответ. Но можно немного оптимизировать. Представьте, что имеем некоторый коэффициент AC, перед которым было 7 нулей (разумеется, если выписывать в зигзагообразном порядке). Эти нули - дух значений, которые не выдержали квантования. Скорее всего, наш коэффициент тоже сильно потрепало и он стал маленьким, а, значит, его длина - короткой. Значит, количество нулей перед AC и длина AC - зависимые величины. Поэтому записывают так:
[код Хаффмана для (Количество нулей перед AC, длина AC (в битах)]
Алгоритм кодирования остается тем же: те пары (количество нулей перед AC, длина AC), которые встречаются часто, получат короткие коды и наоборот.

Строим гистограмму зависимости количества по этим парам и дерево Хаффмана.


Длинный «горный хребет» подтверждает наше предположение.

Особенности реализации в JPEG:
Такая пара занимает 1 байт: 4 бита на количество нулей и 4 бита на длину AC. 4 бита - это значения от 0 до 15. Для длины AC хватит с избытком, но ведь нулей может быть больше 15? Тогда используется больше пар. Например, для 20 нулей: (15, 0)(5, AC). То есть, 16-й ноль кодируется как ненулевой коэффициент. Так как ближе к концу блока всегда полно нулей, то после последнего ненулевого коэффициента используется пара (0,0). Если она встретится при декодировании, значит оставшиеся значения равны 0.

Выяснили, что каждый блок закодирован хранится в файле так:
[код Хаффмана для длины DC diff ]
[код Хаффмана для (количество нулей перед AC 1 , длина AC 1 ]

[код Хаффмана для (количество нулей перед AC n , длина AC n ]
Где AC i - ненулевые AC коэффициенты.

Цветное изображение

Способ представления цветного изображения зависит от выбранной цветовой модели. Простое решение - использовать RGB и кодировать каждый цветовой канал изображения по отдельности. Тогда кодирование не будет отличаться от кодирования серого изображения, только работы в 3 раза больше. Но сжатие изображения можно увеличить, если вспомнить, что глаз более чувствительнее к изменению яркости, чем цвета. Это значит, что цвет можно хранить с бОльшими потерями, чем яркость. У RGB нет отдельного канала яркости. Она зависит от суммы значений каждого канала. Поэтому, RGB-куб (это представление всех возможных значений) просто «ставят» на диагональ - чем выше, тем ярче. Но на этом не ограничиваются - куб немного поджимают с боков, и получается скорее параллелепипед, но это лишь для учета особенностей глаза. Например, он более восприимчив к зеленому, чем синему. Так появилась модель YCbCr.


(Изображение с Intel.com)
Y - компонента яркости, Cb и Cr являются синей и красной цветоразностными компонентами. Поэтому, если хотят сильнее сжать изображение, то RGB переводят в YCbCr, и каналы Cb и Cr прореживают. То есть разбивают на небольшие блоки, например 2x2, 4x2, 1x2, и усредняют все значения одного блока. Или, другими словами, уменьшают размер изображения для этого канала в 2 или 4 раза по вертикали и/или горизонтали.


Каждый блок 8x8 кодируется (DCT + Хаффман), и закодированные последовательности записываются в таком порядке:

Любопытно, что спецификация JPEG не ограничивает в выборе модели, то есть реализация кодировщика может как угодно разделить изображение по цветовым компонентам (каналам) и каждый будет сохранен по отдельности. Мне известно об использовании Grayscale (1 канал), YCbCr (3), RGB (3), YCbCrK (4), CMYK (4). Первые три поддерживаются почти всеми, а вот с последними 4-канальными бывают проблемы. FastStone, GIMP поддерживают их корректно, а штатные программы Windows, paint.net корректно извлекают всю информацию, но потом выбрасывают 4 черный канал, поэтому ( сказал, что не выбрасывают, читайте его комментарии) показывают более светлое изображение. Слева - классический YCbCr JPEG, справа CMYK JPEG:



Если они различаются по цветам, или видна только одна картинка, то, скорее всего, у вас IE (любой версии) (UPD. в комментариях говорят «или Safari»). Можете попробовать открыть статью в разных браузерах.

И еще кое-что

В двух словах о дополнительных возможностях.
Progressive mode
Разложим полученные таблицы коэффициентов DCT на сумму таблиц (примерно так (DC, -19, -22, 2, 1) = (DC, 0, 0, 0, 0) + (0, -20, -20, 0, 0) + (0, 1, -2, 2, 1)). Сначала закодируем все первые слагаемые (как мы уже научились: Хаффман и обход зигзагом), затем вторые и т. д. Такой трюк полезен при медленном интернете, так как сперва загружаются только DC коэффициенты, по которым строится грубая картинка c «пикселями» 8x8. Затем округленные AC коэффициенты, позволяющие уточнить рисунок. Затем грубые поправки к ним, затем более точные. Ну и так далее. Коэффициенты округляются, так как на ранних этапах загрузки точность не столь важна, зато округление положительно сказывается на длине кодов, так как для каждого этапа используется своя таблица Хаффмана.
Lossless mode
Сжатие без потерь. DCT нет. Используется предсказание 4-й точки по трем соседним. Ошибки предсказания кодируются Хаффманом. По-моему, используется чуть чаще, чем никогда.
Hierarhical mode
По изображению создается несколько слоев с разными разрешениями. Первый грубый слой кодируется как обычно, а затем только разница (уточнение изображения) между слоями (прикидывается вейвлетом Хаара). Для кодирования используется DCT или Lossless. По-моему, используется чуть реже, чем никогда.
Арифметическое кодирование
Алгоритм Хаффмана создает оптимальные коды по весу символов, но это верно только для фиксированного соответствия символов с кодами. Арифметическое не имеет такой жесткой привязки, что позволяет использовать коды как бы с дробным числом бит. Утверждается, что оно уменьшает размер файла в среднем на 10% по сравнению с Хаффманом. Не распространено из-за проблем с патентом, поддерживается не всеми.

Я надеюсь, что теперь вам понятен алгоритм JPEG интуитивно. Спасибо за прочтение!

UPD
предложил указать использованное ПО. С удовольствием сообщаю, что все доступны и бесплатны:

  • Python + NumPy + Matplotlib + PIL(Pillow) . Основной инструмент. Нашелся по выдаче «Matlab free alternative». Рекомендую! Даже если вам не знаком Python, то уже через пару часов научитесь производить расчеты и строить красивые графики.
  • JpegSnoop . Показывает подробную информацию о jpeg-файле.
  • yEd . Редактор графов.
  • Inkscape . Делал в нем иллюстрации, такие как пример алгоритма Хаффмана. Прочитал несколько уроков, оказалось очень здорово.
  • Daum Equation Editor . Искал визуальный редактор формул, так как с Latex-ом не очень дружу. Daum Equation - плагин к Хрому, мне показался очень удобен. Помимо мышкотыкания, можно редактировать Latex.
  • FastStone . Думаю, его представлять не надо.
  • PicPick . Бесплатная альтернатива SnagIt. Сидит в трее, скриншотит что скажут куда скажут. Плюс всякие плюшки, типа линейки, пипетки, угломера и пр.

Теги:

  • jpeg
  • dct
  • dft
  • фурье
  • хаффман
Добавить метки

JPEG-сжатие цифрового изображения

Одним из наиболее полных и популярных стандартов сжатия изображений является стандарт JPEG.

Сам процесс сжатия состоит из трех последовательных шагов:

а) Вычисление дискретного косинусного преобразования (ДКП) для матриц 8*8-блоков, полученных после стандартного разбиения матрицы ЦИ;

б) квантование коэффициентов ДКП;

в) кодирование неравномерным кодом.

Сначала ЦИ разбивается на отдельные блоки размером 8*8 элементов, которые обрабатываются последовательно слева направо и сверху вниз. Обработка каждого блока начинается со сдвига по яркости значений всех его 64 элементов, что достигается вычитанием величины , где - максимальное число уровней яркости. Затем вычисляется двумерное ДКП элементов блока. Полученные значения коэффициентов квантуются в соответствии с формулой:

,

где - результат квантования значения коэффициента ДКП , а - соответствующий элемент матрицы коэффициентов квантования:

.

(Необходимо отметить, что перед тем, как квантованные коэффициенты ДКП могут быть подвергнуты обратному ДКП для восстановления блока изображения, они должны быть умножены на :

. (2.5)

Очевидно, что обратное преобразование полученных значений даст в результате приближение восстановливаемого блока изображения.)

Отквантованные значения коэффициентов переупорядочиваются зигзаг-преобразованием согласно:

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

Одномерный массив, полученный после зигзаг-преобразования, упорядочивается по возрастанию пространственной частоты, при этом, как правило, возникают длинные последовательности нулей, что эффективно используется процедурой JPEG-кодирования. Рекомендованная JPEG матрица квантования имеет следующий вид:

Пример . Последовательное кодирование и декодирование JPEG . Рассмотрим сжатие и восстановление следующего блока 8*8 элементов согласно стандарту последовательного кодирования JPEG:

Исходные пиксели могут иметь 256 или 2 8 уровней яркости, так что процесс кодирования начинается со сдвига диапазона значений – вычитания из значений пикселей величины 2 7 или 128. В результате получается массив:

который после прямого ДКП будет иметь вид:

Если для квантования полученных данных используется приведенная выше матрица квантования, то после квантования коэффициенты примут вид:

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

(-26 -31 -3 -2 -6 2 -4 1 -4 1 1 5 0 2 0 0 -1 2 0 0 0 0 0 -1 -1 КБ)

Кодовое слово КБ означает конец блока, указывает на то, что все оставшиеся коэффициенты в переупорядоченной последовательности равны 0. Для кодирования полученного массива используются стандартные коды Хаффмана, преобразующие массив в непрерывный поток битов.

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

Полностью восстановленный блок получается после выполнения обратного ДКП полученного массива:

и обратного сдвига диапазона значений на +2 7 =+128. В результате получаем:

Все отличия значений элементов исходного и восстановленного блоков возникают вследствие самой природы сжатия с потерями, являющегося сутью JPEG процедур сжатия и восстановления. В данном примере ошибки восстановления находятся в диапазоне от -14 до 11 и распределены следующим образом:

Характерные особенности сингулярных чисел блоков матрицы цифрового изображения при JPEG-сжатии. Пусть исходное ЦИ в градациях серого, хранящееся в некотором формате без потерь, например, в формате TIF, матрица которого имеет размеры , разбивается стандартным образом на блоки . Если для каждого блока ЦИ определить множество всех СНЧ (сингулярный спектр), то оказывается, что в среднем лишь 2.40% от общего числа блоков (ОЧБ) имеют нулевые СНЧ.

Данный факт не случаен. Ранг любой матрицы определяется количеством ее ненулевых СНЧ, а значит наличие нулей в сингулярном спектре будет говорить о том, что число ее линейно независимых строк (столбцов) меньше размера. Однако, для произвольного реального ЦИ, даже с учетом коррелированности значений яркости пикселей, вероятность того, что строки (столбцы) очередного блока окажутся линейно зависимыми, невелика.

Квантование коэффициентов DCT, которое происходит в процессе сохранения ЦИ в формате JPEG (с потерями), является необратимой процедурой и приводит к некоторым особенностям возмущений СНЧ блоков.

Пусть исходное ЦИ подверглось JPEG-сжатию. Проведем для него операцию частичного восстановления (ЧВ), которая включает в себя: 1) энтропийное декодирование; 2) умножение полученных коэффициентов на соответствующие элементы массива нормализации (матрицы квантования); 3) применение обратного DCT, но без последующего округления.

У полученной матрицы практически все блоки содержат нулевые СНЧ, причем таких значений в блоках будет достаточно много (табл.2.1). Такая ситуация закономерна. После квантования и округления коэффициентов DCT блоков многие из них, отвечающие высоким и средним частотам, обнулятся, оставаясь нулями после ЧВ, что, учитывая соответствие между коэффициентами дискретного преобразования Фурье и сингулярными тройками матрицы изображения, где - СНЧ и отвечающие ему левый и правый СНВ соответственно, приведет к обнулению наименьших (а возможно и средних по величине) СНЧ матриц блоков.

Табл.2.1. Результаты сингулярного разложения блоков частично восстановленных изображений

ОЧБ Кол-во блоков, у кот-х нулевых СНЧ больше 2-х, по отношению к ОЧБ (в %)
m=8 m=7 m=6 m=5 m=4 m=3 m=2 m=1 m=0
POUT
CAMERAMAN
TIRE
MOON 99.8
CELL

Заметим, что, чем меньше нулевых СНЧ в рассматриваемом блоке, тем больше линий контура он содержит. Действительно, наличие контуров в блоке говорит о значительной высокочастотной составляющей в сигнале, отвечающем этому блоку. Тогда коэффициенты DCT, соответствующие высоким и средним частотам, будут сравнительно большими и могут остаться ненулевыми после квантования и ЧВ, а значит внесут свой вклад не только в максимальные СНЧ.

Для наглядного представления справедливости вышесказанного рассмотрим изображение СELL.TIF (рис.2.5(а)). На рис.2.5(б) представлена матрица нулевых СНЧ блоков (МНСЧБ) размерности ЧВ-изображения, каждый элемент которой равен количеству нулевых СНЧ в соответствующем блоке. На рисунке выделены элементы, имеющие наименьшие значения, что позволяет наглядно увидеть соответствие между контурами исходного ЦИ и блоками, содержащими наименьшее количество нулевых СНЧ.

Пусть исходное изображение, подвергшееся JPEG-сжатию, восстанавливается полностью. Это означает, что после ЧВ все значения яркости пикселей округляются до целых и вводятся в диапазон . Это действие возмутит матрицу изображения, полученную после ЧВ, определенным образом изменится количество нулевых СНЧ в блоках (табл.2.2). Там, где после ЧВ не было элементов, значительно меньших 0 или больших 255, возмущение матрицы будет небольшим. В соответствии с соотношением

, (2.6)

имеющим место для произвольной матрицы, где - СНЧ исходной и возмущенной матриц соответственно, - матрица возмущений блока, - спектральная матричная норма, СНЧ являются нечувствительными к возмущающим воздействиям. Если некоторые из нулевых СНЧ блоков матрицы ЧВ-изображения станут ненулями после полного восстановления (ПВ), то их значения будут сравнимы с погрешностью округления, что не характерно для блоков исходного ЦИ.

Рис.2.5. Исходное изображение СELL.TIF (а); МНСЧБ после ЧВ (б); МНСЧБ после полного восстановления (в)

Наиболее заметным различие между совокупным исходным изображением и полностью восстановленным после JPEG-сжатия будет при сравнении их МНСЧБ. Типичная картина представлена на рис.2.5(в), при этом МНСЧБ для CELL.TIF имела только нулевые значения.

Таблица 2.2. Результаты сингулярного разложения блоков полностью восстановленных изображений

Изображение в формате без потерь (TIF) ОЧБ Количества блоков, имеющих нулевых СНЧ Кол-во блоков, у которых нулевых СЧ больше двух, по отношению к ОЧБ (%)
m=8 m=7 m=6 m=5 m=4 m=3 m=2 m=1 m=0
POUT
CAMERAMAN
TIRE
MOON
CELL

Вопросы

  1. Что означает сжатие даннях? Что такое избыточность даннях?
  2. Основные виды избыточности данных.
  3. Как реализуется сжатие посредством квантования?
  4. Что такое малоранговая оппроксимация изображения? Как реализуется сжатие посредством использования малоранговых аппроксимаций изображения?
  5. Что такое сингулярное разложение матрицы?
  6. Что такое спектральное разложение матрицы?
  7. Соответствие между параметрами цифрового изображения в пространственной и частотной областях.
  8. Основные шаги JPEG-сжатие цифрового изображения. Матрицы квантования.
  9. Характерные особенности сингулярных чисел блоков матрицы цифрового изображения при JPEG-сжатии.
  10. Частичное и полное восстановление цифрового изображения после сжатия.

Литература

  1. Кобозева А.А. Анализ информационной безопасности / А.А.Кобозева, В.А.Хорошко. – К.: Изд. ГУИКТ, 2009. – 251 с.
  2. Деммель Дж. Вычислительная линейная алгебра / Дж.Деммель; пер.с англ. Х.Д.Икрамова. - М.: Мир, 2001. - 430 с.
  3. Бахвалов Н.С. Численные методы / Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков. - М.: БИНОМ. Лаборатория знаний, 2006. - 636 с.
  4. Гонсалес Р. Цифровая обработка изображений / Р.Гонсалес, Р.Вудс; пер. с англ. под ред. П.А.Чочиа. - М.: Техносфера, 2005. - 1072 с.
  5. Каханер Д. Численные методы и программное обеспечение / Д.Каханер, К.Моулер, С.Нэш; пер. с англ. Х.Д.Икрамова. - М.: Мир, 2001. - 575 с.
  6. Гантмахер Ф.Р. Теория матриц / Ф.Р.Гантмахер. - М.: Наука, 1988. - 552 с.
  7. Воеводин В.В. Вычислительные основы линейной алгебры / В.В.Воеводин. - М.: Наука. Гл.ред.физ.-мат.лит., 1977. - 304 с.



Top