
лаба Сжатие с потерями - 4 сем АИСД
.pdfМИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра САПР
ОТЧЕТ по лабораторной работе №2
по дисциплине «Алгоритмы и структуры данных» Тема: Алгоритмы сжатия с потерями
Студентка гр. 3352 |
|
Гареева К.Р. |
Преподаватель |
|
Пестерев Д.О. |
Санкт-Петербург
2025
Задачи для теоретической части:
Описать следующие алгоритмы:
1.Перехода в цветовое пространство YCbCr из RGB
2.Даунсэмплинга матрицы цветового канала.
3.Разбиения изображения на блоки NxN. Если изображение делится на нецелое количество блоков, округлить их количество по вертикали/горизонтали вверх и
заполнить неполные блоки выбранным значением (например, нулем)
4.Прямого и обратного DCT-II 2D для блока размера NxN. Удостовериться в обратимости.
5.Изменения матрицы квантования в зависимости от уровня сжатия.
6.Квантования и обратного преобразования матрицы ДКТ по заданной матрице квантования
7.Зигзаг обхода матрицы NxN
8.Разностного кодирования DC коэффициентов
9.Переменного кодирования разностей DC и AC коэффициентов.
10.RLE кодирования AC коэффициентов
11.Кодирования разностей DC коэффициентов и последовательностей Run/Size по таблице кодов Хаффмана и упаковки результата в байтовую строку.
Задачи для практической части:
Реализовать указанные выше функции.
2
Теоретическая часть
1. Переход в цветовое пространство YCbCr из RGB
RGB — это стандартный способ хранения и отображения изображений. В нём каждый пиксель описывается тремя числами, которые показывают, сколько в нём красного (R), зелёного (G) и синего (B) цвета.
YCbCr — это другое цветовое пространство, где:
Y - это яркость (насколько светлый или тёмный пиксель),
Cb - показывает, насколько пиксель отклоняется в сторону синего,
Cr - показывает, насколько пиксель отклоняется в сторону красного.
Преобразовать изображение из RGB (Red, Green, Blue) в YCbCr (яркость и два
цветоразностных компонента) можно с помощью формул: |
( ) |
|
||||||||
= 0.299 ∙ + 0.587 ∙ + 0.114 ∙ |
- Яркостная компонента |
, которая |
||||||||
|
|
|
|
|
|
|
||||
отражает воспринимаемую яркость пикселя. |
|
|
|
|
|
|||||
=− 0.1687 ∙ − 0.3313 ∙ + 0.5 ∙ + 128 |
- |
Цветоразностная компонента |
||||||||
|
|
|
|
|
|
|||||
синего |
|
|
, показывает разницу между синим и яркостью. |
|
|
|
||||
= 0.5 ∙ − 0.4187 ∙ − 0.0813 ∙ + 128 |
|
|
|
|
|
|||||
|
|
( ) |
|
|
- |
Цветоразностная |
компонента |
|||
|
( ) |
|
|
|
||||||
красного |
|
|
, показывает разницу между красным и яркостью. |
|
|
|
Число 128 прибавляется к значениям цветовых компонентов Cb и Cr, чтобы они попадали в привычный диапазон от 0 до 255. Это важно для хранения изображения в стандартном 8-битном формате, где каждое значение занимает 1 байт.
Чтобы вернуть изображение обратно в RGB после сжатия или обработки,
используются обратные формулы преобразования:
= + 1.402 ∙ ( − 128)
= − 0.344136 ∙ ( − 128) − 0.714136 ∙ ( − 128)= + 1.772 ∙ ( − 128)
3
2. Даунсэмплинг матрицы цветового канала.
Даунсемплирование применяется только к цветовым каналам (Cb и Cr), чтобы уменьшить объём данных изображения.
Если даунсемплирование выполняется с коэффициентом 2 по горизонтали и вертикали, это означает, что каждая группа из 2×2 пикселей заменяется одним средним пикселем. В результате размер цветовых каналов уменьшается — вместо (H, W) они становятся (H//2, W//2), то есть уменьшаются в 4 раза.
При этом канал яркости Y сохраняет своё исходное разрешение.
Такой процесс можно выразить через формулу, описывающую, как из каждого блока берётся представительное значение для нового изображения.
Пример:
Cb = [[100, 102],
[104, 106]]
Cb_down = [[(100 + 102 + 104 + 106)/4]] = [[103]]
3. Разбиения изображения на блоки NxN. Если изображение делится на нецелое количество блоков.
Этап сжатия изображения, на котором каждый цветовой канал разделяется на блоки размером N×N с целью поэтапного применения дискретного косинусного преобразования, квантования и последующего кодирования. Если размеры изображения не делятся на N нацело, они увеличиваются до ближайшего кратного значения за счёт добавления дополнительных пикселей (например, с нулевыми значениями)
Пример при N = 8:
Изображение 32×32 |
→ |
16 блоков (4×4). |
|
Изображение 35×30 |
не делится ровно - нужно добавить нулевые пиксели до 40 |
||
→ |
|||
строк и 32 столбцов |
→получим 5х4 = 20 блоков. |
4
4. Прямое и обратное DCT-II 2D для блока размера NxN.
Прямое и обратное DCT-II 2D для блока размера N×N — это операции дискретного косинусного преобразования второго типа (DCT-II) и его обратного преобразования, применяемые к двумерному блоку данных размером N×N.
Прямое DCT-II преобразует значения пикселей блока из пространственной области в частотную, выделяя основные частотные компоненты и позволяя эффективно сжимать данные за счёт отбрасывания малозначимых коэффициентов.
Обратное DCT (IDCT) восстанавливает приближённое исходное изображение из частотных коэффициентов, возвращая данные из частотной области обратно в пространственную.
5. Изменение матрицы квантования в зависимости от уровня сжатия.
Изменение матрицы квантования в зависимости от уровня сжатия — это процесс адаптации значений в матрице квантования в соответствии с выбранным уровнем качества (или степени сжатия) изображения.
При более сильном сжатии (низком качестве) элементы матрицы квантования увеличиваются, что приводит к более грубому округлению частотных коэффициентов после DCT и, соответственно, к большей потере информации. При меньшем сжатии (высоком качестве) используются меньшие значения в матрице, что сохраняет больше деталей изображения, но уменьшает степень сжатия.
Таким образом, уровень сжатия напрямую влияет на агрессивность квантования и баланс между качеством и размером файла.
6. Квантование и обратное преобразование матрицы ДКТ по заданной матрице квантования
Квантование и обратное преобразование матрицы ДКТ по заданной матрице квантования — это этапы обработки коэффициентов, полученных после дискретного косинусного преобразования (ДКТ), направленные на снижение объёма данных и восстановление приближённых значений при декомпрессии.
Квантование заключается в делении каждого коэффициента ДКТ на соответствующий элемент заданной матрицы квантования с последующим
5

округлением до ближайшего целого. Это уменьшает точность представления высокочастотных компонентов, позволяя сократить объём информации.
Обратное квантование (деквантование) выполняется на этапе восстановления изображения: каждый квантованный коэффициент умножается на соответствующий элемент той же матрицы квантования, чтобы приблизительно восстановить исходные значения частотных компонентов перед обратным ДКТ.
7. Зигзаг обхода матрицы NхN
Зигзаг-обход матрицы NхN — это алгоритм, который проходит по всем элементам матрицы в порядке, близком к тому, как распределены коэффициенты после DCT в JPEG. Он начинается с верхнего левого угла и перемещается по диагоналям, чередуя направление.
Пример обхода матрицы 4х4:
Порядок элементов: 49, 74, 55, 97, 2, 35, 81, 78, 10, 30, 45, 87, 26, 48, 51, 85.
После прохождения по блоку 8х8 имеем 64 коэффициента.
8. Разностное кодирования DC коэффициентов
Поскольку в изображении соседние блоки обычно имеют похожую яркость, значения DC-коэффициентов (которые представляют собой среднюю яркость блока) тоже оказываются близкими друг к другу. Чтобы сократить объём данных, используется разностное кодирование этих DC-элементов.
Суть метода в том, что:
-Первый DC-коэффициент сохраняется как есть.
-Каждый следующий заменяется разностью между ним и предыдущим.
6
Это приводит к тому, что полученные значения становятся меньше по модулю, а значит — их проще и выгоднее кодировать (например, с помощью Хаффмана или другого метода сжатия).
Например, у нас есть такие коэффициенты [150, 152, 149, 151, 150]. Первый элемнт остается 150 Остальные записываем как разность между текущим и предыдущим: 152 - 150 = +2 149 - 152 = -3 151 - 149 = +2 150 - 151 = -1
Получим закодированную последовательность [150, 2, -3, 2, -1]
9. Переменное кодирование разностей DC и AC коэффициентов.
Переменное кодирование разностей DC и AC коэффициентов — это метод кодирования коэффициентов, полученных после квантования DCT-блока, с использованием переменной длины кодов (например, кодов Хаффмана), что позволяет эффективно сжимать данные.
DC-коэффициент (нулевая частота) кодируется как разность между DCзначениями текущего и предыдущего блоков, так как эти значения обычно слабо меняются от блока к блоку. Это уменьшает диапазон значений и повышает эффективность последующего кодирования.
AC-коэффициенты (остальные частоты) кодируются с учётом количества подряд идущих нулей (run-length encoding) и значений ненулевых коэффициентов. Это позволяет компактно представить длинные последовательности нулей, которые часто возникают после квантования.
Такое переменное кодирование снижает общий размер данных за счёт использования коротких кодов для часто встречающихся паттернов и длинных кодов — для редких.
7
10. RLE кодирования AC коэффициентов
RLE-кодирование AC-коэффициентов (Run-Length Encoding) — это способ сжатия данных, при котором последовательности одинаковых значений (обычно нулей) заменяются парой: количество повторений и следующее ненулевое значение.
В контексте JPEG-сжатия RLE применяется к AC-коэффициентам (частотным компонентам, кроме DC) после квантования и зигзагообразного сканирования блока:
Поскольку квантование обнуляет многие высокочастотные коэффициенты, в последовательности часто встречаются длинные цепочки нулей.
Вместо хранения каждого нуля отдельно, RLE записывает их как пары вида (количество_нулей, значение) для каждого ненулевого коэффициента.
11. Кодирование разностей DC коэффициентов и последовательностей Run/Size по таблице кодов Хаффмана и упаковки результата в байтовую строку.
Кодирование разностей DC-коэффициентов и последовательностей Run/Size по таблице кодов Хаффмана и упаковка результата в байтовую строку — это финальный этап энкодинга в JPEG-подобной схеме, направленный на максимально эффективное сжатие данных.
DC-коэффициенты: для каждого блока сохраняется разность между его DCзначением и значением предыдущего блока. Эти разности обычно небольшие, поэтому кодируются по таблице Хаффмана, где более короткие коды назначаются часто встречающимся величинам.
AC-коэффициенты: после применения RLE каждое ненулевое значение представляется как пара (Run, Size) — где Run обозначает количество предыдущих нулей, а Size — количество битов, необходимых для представления текущего значения. Пара (Run, Size) ищется в таблице Хаффмана, и к полученному коду добавляются оставшиеся биты, описывающие само значение.
Упаковка в байтовую строку: полученные битовые последовательности последовательно объединяются и разбиваются на байты (по 8 бит). Это формирует итоговую компактную байтовую строку, представляющую сжатое изображение.
8

Практическая часть
Используемые тестовые данные (рис 1 - 8):
Рисунок 1 - Изображение «Lenna»
Рисунок 2 - Изображение «Lenna» в grayscale.
9

Рисунок 3 - Изображение «Lenna» в чб с дизерингом.
Рисунок 4 - Изображение «Lenna» в чб без дизеринга
10