Изменить код с DCT на обратное дискретное косинусное преобразование? - PullRequest
0 голосов
/ 21 января 2019

Для проекта я должен продемонстрировать сжатие JPEG и, следовательно, преобразование с DCTII и IDCT.Я понятия не имею, как реализовать эту формулу.Но я нашел сайт, который предоставляет Java-код и онлайн-среду для тестирования.https://ide.geeksforgeeks.org/FnC3bRJEAr здесь вы можете увидеть код.

formula for DCT formula for IDCT

(формулы из Википедии / JPEG)

Итак, какие изменения должныбыть внесенным в код?

Я попытался переключить циклы for и переменные в формуле, но полученные значения были явно неправильными, другие попытки приводили к сообщениям об ошибках.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Ваши суммы делают умножение матриц. Вы умножаете матрицу данных 8x8 на матрицу DCT 8x8.

Матрица DCT является ортонормированной, поэтому ее обратная является транспонированной.

Поэтому вы должны иметь возможность инвертировать, заменяя вас и v.

0 голосов
/ 21 января 2019

Единственная разница между DCT и IDCT заключается в том, где учитывается коэффициент.

Вы должны заменить строку 46 в вашем коде на

sum = sum + ck*cl*dct1;

, где ck и cl вычисляются как в строках 24-34, но для k и l

и подавить ci * cj в строке 49

Кстати, этот код Java исключительно неэффективен. Предварительно вычислите Math.sqrt (2), Math.sqrt (n) и поместите свой косинус в таблицу, и он будет как минимум в 3 раза быстрее.

...