Как матрицы хранятся в памяти? - PullRequest
4 голосов
/ 19 февраля 2012

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

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

http://en.wikipedia.org/wiki/JPEG

Сравнение исходного примера изображения субблока 8x8 с матрицей "B", которая преобразована, чтобы иметь общие более низкие значения амплитуды и намного больше нулейна протяжении.Как матрица B хранится так, что она сохраняет намного больше памяти по сравнению с исходной матрицей?

Исходная матрица явно нуждается в 8x8 (количество записей) x 8 бит / запись, поскольку значения могут варьироваться случайным образом от 0 до 255. Хорошо, поэтому я думаю, что совершенно очевидно, что для этого нам нужно 64 байта памяти.Матрица B, с другой стороны, хммм.Наилучший сценарий, о котором я могу подумать, это то, что значения варьируются от -26 до +5, поэтому для записи (например, -26) самое большее требуется 6 бит (5 битов для формирования 26, 1 бит для знака, я думаю).Тогда вы можете хранить 8x8x6 бит = 48 байтов.

Другая возможность, которую я вижу, состоит в том, что матрица хранится в «зигзагообразном» порядке сверху слева.Затем мы можем указать начальный и конечный адрес и просто хранить по диагонали, пока у нас не останутся только нули.Допустим, это 32-битная машина;тогда 2 адреса (начало + конец) составят 8 байтов;скажем, для других ненулевых записей по 6 битов нам нужно пройти почти все верхние диагонали, чтобы сохранить сумму из 28 элементов.Всего эта схема займет 29 байтов.

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

Приветствия

Ответы [ 4 ]

2 голосов
/ 19 февраля 2012

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

JPEG использует вариант кодирования Хаффмана.

1 голос
/ 19 февраля 2012

Как я понимаю, JPEG только сжимает, он также сбрасывает данные. После переноса блока 8x8 в частый домен он отбрасывает незначимые (часто встречающиеся) данные, что означает, что ему нужно только сохранить значимые данные 6x6 или даже 4x4. То, что он может иметь более высокую скорость сжатия, чем метод без потерь (например, gif)

1 голос
/ 19 февраля 2012

Самое простое сжатие будет использовать преимущества повторяющихся последовательностей символов (нулей).Матрица в памяти может выглядеть так (предположим, в системе dec)

0000000000000100000000000210000000000004301000300000000004

После сжатия она может выглядеть так

1 голос
/ 19 февраля 2012

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

...