Сжатие изображения - зигзаг после дискретного косинусного преобразования - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь сделать приложение, которое сжимает изображение с камеры. У меня есть матовый образ и 3 отдельных массива для каналов. Я нашел кое-что о дискретном косинусном преобразовании DCT и прочитал, что я должен выполнить алгоритм зигзага ( Я нашел здесь что-то с зигзагами) .
Я понимаю, что DCT создает выходной массив, но я не могу видеть, создает ли его и зигзаг.
Может быть, есть какой-нибудь простой пример алгоритма зигзага (или dct с зигзагом) с массивами ввода и вывода?

1 Ответ

0 голосов
/ 06 сентября 2018

Изображения взяты из этой статьи в Википедии .

TL, DR: см. полужирный часть ниже.

Начните с двумерного массива значений пикселей. Есть 64 байта информации.

enter image description here

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

enter image description here

Вот ключ к тому, как работает сжатие JPEG. Частотные коэффициенты в верхнем левом углу массива (низкие частоты) намного важнее для качества изображения, чем частотные коэффициенты в нижнем правом углу массива (высокие частоты).

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

enter image description here

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

enter image description here

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

-26 -3 0 -3 -2 -6 2 -4 1 -3 1 1 5 1 2 -1 1 -1 2 0 0 0 0 0 -1 -1 0 0 ...

где ... - все 0. В зависимости от степени сжатия, массив может быть обрезан в любой точке. В этом примере разделение массива после 19 элементов является хорошим компромиссом между качеством и сжатием. Таким образом, в файле JPEG сохраняются только первые 19 элементов, а не исходные 64 необработанных значения пикселей.

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

...