
- •Теоретическая часть
- •Переход в цветовое пространство yCbCr из rgb
- •Даунсэмплинг матрицы цветового канала
- •Разбиение изображения на блоки NxN
- •Прямое и обратное dct-II 2d для блока размера NxN
- •Изменения матрицы квантования в зависимости от уровня сжатия Квантование и обратное преобразование матрицы дкт по заданной матрице квантования
- •Зигзаг обход матрицы NxN
- •Разностное кодирование dc коэффициентов
- •Переменное кодирование разностей dc и ac коэффициентов
- •Rle кодирование ac коэффициентов
- •Кодирование разностей dc коэффициентов и последовательностей Run/Size по таблице кодов Хаффмана и упаковки результата в байтовую строку
- •Практическая часть
- •Код программы
Изменения матрицы квантования в зависимости от уровня сжатия Квантование и обратное преобразование матрицы дкт по заданной матрице квантования
Этап, на котором определяется количество потерянной при сжатии информации.
Заключается в делении каждого коэффициента на соответствующий элемент квантующей матрицы и округлении результата. Формирующийся результат можно описать формулой:
,
где
-
DCT
коэффициенты,
-
элементы
квантующей матрицы,
-
полученные квантованные значения.
При более высоком качестве, соответственно меньшем сжатии, элементы квантующей матрицы принимают меньшие значения, происходит меньшее количество потерь, при более низком возникает обратный результа, так как уменьшаются высокочастотные элементы.
DC компонента сохраняется более точно, AC компоненты усечены, так как их значения становятся нулями.
Качество квантующей матрицы задается по коэффициенту quаlity. Тогда, при значениях quаlity, приближающихся к 100, сжатие происходит практически без потерь, при стремлении коэффициента к 0 сжатие более сильное, потери ощутимее.
При декодировании каждый квантованый коэффициент умножается на соответствующий элемент матрицы квантования. При этом точность теряется, так как при квантовании коэффициенты округлялись.
Зигзаг обход матрицы NxN
Этап, на котором происходит последовательное чтение элементов матрицы по диагоналям для упорядочивания коэффициентов. В результате все ненулевые значения, полученные на предыдущих этапах кодирования оказываются вначале, а нули в конце для более эффективного сжатия RLE в дальнейшем.
П
ример
зигзаг обхода для матрицы:
Результат: 12, 10, 17, 1, 2, 1, 0, 0, 0
Разностное кодирование dc коэффициентов
Так как в изображении соседние блоки часто имеют похожие уровни яркости, разности между DC коэффициентам, которые представляют собой среднюю яркость блоков, могут быть малы. Поэтому для дальнейшего эффективного кодирования применяется разностное кодирование DC элементов.
Процедура заключается в том, что первый элемент сохраняется неизменным, каждый следующий кодируется как разность между текущим и предыдущим. Таким образом достигается снижение амплитуды значений.
Пример:
Даны коэффициенты [52, 48, 45, 49, 50, 52]
После применения разностного кодирования: [52, -4, -3, 4, 1, 2]
Переменное кодирование разностей dc и ac коэффициентов
Этап на котором числовые значения переводятся в двоичное представление с помощью переменного количества бит.
DC: Значения коэффициентов представляются в виде категории (количества бит необходимого для представления абсолютного значения) и дополнительных битов (самого значения в двоичном коде).
Пример: DC = -3
Категория 2 бита, дополнительные биты 3 “11”, с учетом знака “00”.
AC: Коэффициенты закодированы в виде категории (разрядности), дополнительных битов (значение), позиции нуля (runlength, size) + дополнительное значение. Для каждого коэффициента вычисляется количество бит, которое нужно для представления абсолютного значения и дополнительное двоичное представление самого числа.