- •Шаги jpeg
- •2) Дискретизация
- •3) Сдвиг Уровня
- •4) 8Х8 Дискретное Косинусоидальное Преобразование (dct)
- •5) Зигзагообразная перестановка 64 dct коэффициентов
- •6) Квантование
- •7) RunLength кодирование нулей (rlc)
- •8) Конечный шаг - кодирование Хаффмана
- •Величины Категория Биты для величины
- •Кодирование коэффициента dc
- •Задание
5) Зигзагообразная перестановка 64 dct коэффициентов
Так, после того, как мы выполнили DCT-преобразование над блоком величин 8х8, у нас есть новый блок 8х8. Затем, этот блок 8х8 просматривается по зигзагу подобно этому: (Числа в блоке 8х8 указывают порядок, в котором мы просматриваем 2-мерную матрицу 8х8)
О, 1, 5, 6,14,15,27,28,
2. 4, 7,13,16,26,29,42,
3,8,12,17,25,30,41,43,
9,11/18,24,31,40,44,53,
10,19,23,32,39,45,52,54,
20,22,33,38,46,51,55,60,
21,34,37,47,50,56,59,61,
35,36,48,49,57,58, 62,63
Как видите, сначала - верхний левый угод (0,0), затем величина в (0,1), затем (1,0), затем (2,0), (1,1), (0,2), (0,3), (1,2), (2,1), (3,0) и т.п.
После того, как пройдена по зигзагу матрица 8х8, имеем вектор с 64 коэффициентами (0...63) Смысл этого зигзагообразного вектора - в том, что производится просмотр коэффициентов 8х8 DCT в порядке повышения пространственных частот. Так, получается вектор отсортированный по критерию пространственной частоты: первая величина на векторе (индекс 0) соответствует самой низкой частоте в изображении - она обозначается DC. С увеличением индекса на векторе, получаются величины соответствующие высоким частотам (величина с индексом 63 соответствует амплитуде самой высокой частоте в блоке 8х8). Остальная часть коэффициентов DCT обозначается АС.
6) Квантование
На этом этапе, исходным является отсортированный вектор с 64 величинами, соответствующими амплитудам 64 пространственных частот в блоке 8х8. Затем эти 64 величины квантуются: каждая величина делится на число, определенное для вектора с 64 величинами (таблица квантования) затем округляется до ближайшего целого.
для (i = 0; i<=63; i++) вектор[i] = (округлить) (вектор[i] / таблица_квантования[i] + 0.5).
Вот пример таблицы квантования для яркости (Y) данной в приложении JPEG стандарта. (Дается в форме блока 8х8; полученного из 64 векторных величин, зигзагообразным преобразованием)
11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
35 55 64 81 104 113 92
64 78 87 103 121 120 101
72 92 95 98 112 100 103 99
Эта таблица опирается на "психовизуальный порог". Большинство существующих шифраторов просто копируют этот пример, но величины не оптимизируются (шифратор может использовать любую другую таблицу квантования) таблица определяется в JPEG файле с DQT (Определение Таблицы Квантования) маркером. Обычно присутствует одна таблица для Y, и другие для оттенка (СЬ и Cr).
Процесс квантования играет ключевую роль в JPEG сжатии. Это - процесс, который удаляет высокие частоты, представленные в исходном изображении - впоследствии высокую детализацию.. Это сделано посредством деления величин в высоких индексах на векторе (амплитуды высоких частот) на большие величины, чем величины, на которыми разделены амплитуды более низких частот. Больше величины в таблице квантования - больше потери (впоследствии визуальные потери) введенные этим процессом, и меньше - лучше визуальное качество.
Другой важный факт - в большинстве изображений цвет изменяется медленно от одного пикселя к другому так что большинство образов будут иметь небольшое количество высокой детализации -> небольшая сумма (небольшие амплитуды) высоких пространственных частот - но у них есть много информации об изображении, содержащейся на низких пространственных частотах.
Впоследствии на новом квантованном векторе, на высоких пространственных частотах, будет много последовательных нулей.
На этом этапе посчитаем матрицу квантования, используя этот псевдо код:
for i:=0 to 8 do for j:=0 to 8 do Q[i,j] = 1+((l+i+j)*q);
где q - это коэффициент качества, от него зависит степень потери качества сжатого изображения для q = 2 имеем матрицу квантования:
3 5 7 9 11 13 15 171
5 7 9 11 13 15 17 191
7 9 11 13 15 17 19 21)
Q = 9 11 13 15 17 19 21 23
11 13 15 17 19 21 23 251
13 15 17 19 21 23 25 27
17 19 21 23 25 27 29
17 19 21 23 25 27 29 31
теперь нужно каждое число в матрице квантования разделить на число в соответствущей позиции в матрице RES, в результате получим А =
:
30 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-7 |
8 |
1 |
1 |
0 |
0 |
0 |
0 |
-11 |
6 |
0 |
1 |
0 |
0 |
0 |
0 |
-5 |
-3 |
0 |
0 |
0 |
0 |
0 |
0 |
-7 |
-3 |
2 |
0 |
0 |
0 |
0 |
0 |
^4 |
4 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
-3 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
как вы видите здесь имеется довольно много нулей, таким образом получим наиболее длинную последовательность нулей, если использовать следущий алгоритм:
1 2 б 7 15 16 28 29
3 5 8 14 17 1 27 1 30 43
4 9 13 18 26 31 42 44
12 19 25 32 41 45 54
11 20 24 33 40 46 53 55
23 34 39 47 52 56 61
35 38 48 51 j57 60 62
36 i 37 49 50 58 59 63 64 .
итак получилась последовательность:
30 0 -7 -11 8 0 0 1 6 -5 -7 -3 0 1 0 0 0 1 0 -3 -4 -1 4 2 0 0 0 0 0 0 0 0 0 0 0 -3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0